| /***************************************************************************/ |
| /* */ |
| /* fterrors.h */ |
| /* */ |
| /* FreeType error code handling (specification). */ |
| /* */ |
| /* Copyright 1996-2015 by */ |
| /* David Turner, Robert Wilhelm, and Werner Lemberg. */ |
| /* */ |
| /* This file is part of the FreeType project, and may only be used, */ |
| /* modified, and distributed under the terms of the FreeType project */ |
| /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
| /* this file you indicate that you have read the license and */ |
| /* understand and accept it fully. */ |
| /* */ |
| /***************************************************************************/ |
| |
| |
| /*************************************************************************/ |
| /* */ |
| /* <Section> */ |
| /* error_enumerations */ |
| /* */ |
| /* <Title> */ |
| /* Error Enumerations */ |
| /* */ |
| /* <Abstract> */ |
| /* 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. */ |
| /* */ |
| /* *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. */ |
| /* */ |
| /* *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). */ |
| /* */ |
| /* To do so, you have to define the following macros before including */ |
| /* this file. */ |
| /* */ |
| /* { */ |
| /* 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. */ |
| /* */ |
| /* { */ |
| /* 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. */ |
| /* */ |
| /* { */ |
| /* FT_ERROR_END_LIST */ |
| /* } */ |
| /* */ |
| /* This macro ends the list. */ |
| /* */ |
| /* Additionally, you have to undefine `__FTERRORS_H__' before */ |
| /* #including this file. */ |
| /* */ |
| /* 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 } }; */ |
| /* */ |
| /* const struct */ |
| /* { */ |
| /* int err_code; */ |
| /* const char* err_msg; */ |
| /* } ft_errors[] = */ |
| /* */ |
| /* #include FT_ERRORS_H */ |
| /* } */ |
| /* */ |
| /* Note that `FT_Err_Ok' is _not_ defined with `FT_ERRORDEF' but with */ |
| /* `FT_NOERRORDEF'; it is always zero. */ |
| /* */ |
| /*************************************************************************/ |
| |
| /* */ |
| |
| #ifndef __FTERRORS_H__ |
| #define __FTERRORS_H__ |
| |
| |
| /* include module base error codes */ |
| #include FT_MODULE_ERRORS_H |
| |
| |
| /*******************************************************************/ |
| /*******************************************************************/ |
| /***** *****/ |
| /***** SETUP MACROS *****/ |
| /***** *****/ |
| /*******************************************************************/ |
| /*******************************************************************/ |
| |
| |
| #undef FT_NEED_EXTERN_C |
| |
| |
| /* FT_ERR_PREFIX is used as a prefix for error identifiers. */ |
| /* By default, we use `FT_Err_'. */ |
| /* */ |
| #ifndef FT_ERR_PREFIX |
| #define FT_ERR_PREFIX FT_Err_ |
| #endif |
| |
| |
| /* FT_ERR_BASE is used as the base for module-specific errors. */ |
| /* */ |
| #ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS |
| |
| #ifndef FT_ERR_BASE |
| #define FT_ERR_BASE FT_Mod_Err_Base |
| #endif |
| |
| #else |
| |
| #undef FT_ERR_BASE |
| #define FT_ERR_BASE 0 |
| |
| #endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */ |
| |
| |
| /* If FT_ERRORDEF is not defined, we need to define a simple */ |
| /* enumeration type. */ |
| /* */ |
| #ifndef FT_ERRORDEF |
| |
| #define FT_ERRORDEF( e, v, s ) e = v, |
| #define FT_ERROR_START_LIST enum { |
| #define FT_ERROR_END_LIST FT_ERR_CAT( FT_ERR_PREFIX, Max ) }; |
| |
| #ifdef __cplusplus |
| #define FT_NEED_EXTERN_C |
| extern "C" { |
| #endif |
| |
| #endif /* !FT_ERRORDEF */ |
| |
| |
| /* this macro is used to define an error */ |
| #define FT_ERRORDEF_( e, v, s ) \ |
| FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s ) |
| |
| /* this is only used for <module>_Err_Ok, which must be 0! */ |
| #define FT_NOERRORDEF_( e, v, s ) \ |
| FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s ) |
| |
| |
| #ifdef FT_ERROR_START_LIST |
| FT_ERROR_START_LIST |
| #endif |
| |
| |
| /* now include the error codes */ |
| #include FT_ERROR_DEFINITIONS_H |
| |
| |
| #ifdef FT_ERROR_END_LIST |
| FT_ERROR_END_LIST |
| #endif |
| |
| |
| /*******************************************************************/ |
| /*******************************************************************/ |
| /***** *****/ |
| /***** SIMPLE CLEANUP *****/ |
| /***** *****/ |
| /*******************************************************************/ |
| /*******************************************************************/ |
| |
| #ifdef FT_NEED_EXTERN_C |
| } |
| #endif |
| |
| #undef FT_ERROR_START_LIST |
| #undef FT_ERROR_END_LIST |
| |
| #undef FT_ERRORDEF |
| #undef FT_ERRORDEF_ |
| #undef FT_NOERRORDEF_ |
| |
| #undef FT_NEED_EXTERN_C |
| #undef FT_ERR_BASE |
| |
| /* FT_ERR_PREFIX is needed internally */ |
| #ifndef FT2_BUILD_LIBRARY |
| #undef FT_ERR_PREFIX |
| #endif |
| |
| #endif /* __FTERRORS_H__ */ |
| |
| |
| /* END */ |