This commit is contained in:
Werner Lemberg 2018-08-29 18:15:03 +02:00
parent 934a6159ba
commit 19be8620ec
2 changed files with 67 additions and 55 deletions

View File

@ -19,82 +19,90 @@
/**************************************************************************
*
* @section:
* error_enumerations
* error_enumerations
*
* @title:
* Error Enumerations
* Error Enumerations
*
* @abstract:
* How to handle errors and error strings.
* How to handle errors and error strings.
*
* @description:
* The header file `fterrors.h` (which is automatically included by
* `freetype.h` defines the handling of FreeType's enumeration constants.
* It can also be used to generate error message strings with a small
* macro trick explained below.
* The header file `fterrors.h` (which is automatically included by
* `freetype.h` defines the handling of FreeType's enumeration
* constants. It can also be used to generate error message strings
* with a small macro trick explained below.
*
* **Error Formats**
* **Error Formats**
*
* The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be
* defined in `ftoption.h` in order to make the higher byte indicate the
* module where the error has happened (this is not compatible with
* standard builds of FreeType~2, however). See the file `ftmoderr.h` for
* more details.
* The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be
* defined in `ftoption.h` in order to make the higher byte indicate the
* module where the error has happened (this is not compatible with
* standard builds of FreeType~2, however). See the file `ftmoderr.h`
* for more details.
*
* **Error Message Strings**
* **Error Message Strings**
*
* Error definitions are set up with special macros that allow client
* applications to build a table of error message strings. The strings
* are not included in a normal build of FreeType~2 to save space (most
* client applications do not use them).
* Error definitions are set up with special macros that allow client
* applications to build a table of error message strings. The strings
* are not included in a normal build of FreeType~2 to save space (most
* client applications do not use them).
*
* To do so, you have to define the following macros before including this
* file.
* To do so, you have to define the following macros before including
* this file.
*
* ```
* FT_ERROR_START_LIST
* ```
* ```
* FT_ERROR_START_LIST
* ```
*
* This macro is called before anything else to define the start of the
* error list. It is followed by several FT_ERROR_DEF calls.
* This macro is called before anything else to define the start of the
* error list. It is followed by several FT_ERROR_DEF calls.
*
* ```
* FT_ERROR_DEF( e, v, s )
* ```
* ```
* FT_ERROR_DEF( e, v, s )
* ```
*
* This macro is called to define one single error. 'e' is the error code
* identifier (e.g., `Invalid_Argument`), 'v' is the error's numerical
* value, and 's' is the corresponding error string.
* This macro is called to define one single error. 'e' is the error
* code identifier (e.g., `Invalid_Argument`), 'v' is the error's
* numerical value, and 's' is the corresponding error string.
*
* ```
* FT_ERROR_END_LIST
* ```
* ```
* FT_ERROR_END_LIST
* ```
*
* This macro ends the list.
* This macro ends the list.
*
* Additionally, you have to undefine `FTERRORS_H_` before #including this
* file.
* Additionally, you have to undefine `FTERRORS_H_` before #including
* this file.
*
* Here is a simple example.
* Here is a simple example.
*
* ```
* #undef FTERRORS_H_
* #define FT_ERRORDEF( e, v, s ) { e, s },
* #define FT_ERROR_START_LIST {
* #define FT_ERROR_END_LIST { 0, NULL } };
* ```
* #undef FTERRORS_H_
* #define FT_ERRORDEF( e, v, s ) { e, s },
* #define FT_ERROR_START_LIST {
* #define FT_ERROR_END_LIST { 0, NULL } };
*
* const struct
* {
* int err_code;
* const char* err_msg;
* } ft_errors[] =
* const struct
* {
* int err_code;
* const char* err_msg;
* } ft_errors[] =
*
* #include FT_ERRORS_H
* ```
* #include FT_ERRORS_H
* ```
*
* Note that `FT_Err_Ok` is _not_ defined with `FT_ERRORDEF`; it is
* always zero.
* An alternative to using an array is a switch statement.
*
* ```
* #undef FTERRORS_H_
* #define FT_ERROR_START_LIST switch ( error_code ) {
* #define FT_ERRORDEF( e, v, s ) case v: return s;
* #define FT_ERROR_END_LIST }
* ```
*
* If you use FT_CONFIG_OPTION_USE_MODULE_ERRORS, 'error_code' should be
* replaced with 'FT_ERROR_BASE(error_code)' in the last example.
*/
/* */

View File

@ -37,6 +37,7 @@
* provides some macros in `fttypes.h`.
*
* FT_ERR( err )
*
* Add current error module prefix (as defined with the `FT_ERR_PREFIX`
* macro) to 'err'. For example, in the BDF module the line
*
@ -49,7 +50,9 @@
* For simplicity, you can always use `FT_Err_Ok` directly instead of
* 'FT_ERR( Ok )'.
*
* FT_ERR_EQ( errcode, err ) FT_ERR_NEQ( errcode, err )
* FT_ERR_EQ( errcode, err )
* FT_ERR_NEQ( errcode, err )
*
* Compare error code 'errcode' with the error 'err' for equality and
* inequality, respectively. Example:
*
@ -63,9 +66,10 @@
* if ( error == FT_Err_Invalid_Outline )
* ...
*
* FT_ERROR_BASE( errcode ) FT_ERROR_MODULE( errcode )
* Get base error and module error code, respectively.
* FT_ERROR_BASE( errcode )
* FT_ERROR_MODULE( errcode )
*
* Get base error and module error code, respectively.
*
* It can also be used to create a module error message table easily with
* something like