1/***************************************************************************/ 2/* */ 3/* fterrors.h */ 4/* */ 5/* FreeType error code handling (specification). */ 6/* */ 7/* Copyright 1996-2002, 2004, 2007, 2013 by */ 8/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9/* */ 10/* This file is part of the FreeType project, and may only be used, */ 11/* modified, and distributed under the terms of the FreeType project */ 12/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13/* this file you indicate that you have read the license and */ 14/* understand and accept it fully. */ 15/* */ 16/***************************************************************************/ 17 18 19 /*************************************************************************/ 20 /* */ 21 /* This special header file is used to define the handling of FT2 */ 22 /* enumeration constants. It can also be used to generate error message */ 23 /* strings with a small macro trick explained below. */ 24 /* */ 25 /* I - Error Formats */ 26 /* ----------------- */ 27 /* */ 28 /* The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be */ 29 /* defined in ftoption.h in order to make the higher byte indicate */ 30 /* the module where the error has happened (this is not compatible */ 31 /* with standard builds of FreeType 2). See the file `ftmoderr.h' for */ 32 /* more details. */ 33 /* */ 34 /* */ 35 /* II - Error Message strings */ 36 /* -------------------------- */ 37 /* */ 38 /* The error definitions below are made through special macros that */ 39 /* allow client applications to build a table of error message strings */ 40 /* if they need it. The strings are not included in a normal build of */ 41 /* FreeType 2 to save space (most client applications do not use */ 42 /* them). */ 43 /* */ 44 /* To do so, you have to define the following macros before including */ 45 /* this file: */ 46 /* */ 47 /* FT_ERROR_START_LIST :: */ 48 /* This macro is called before anything else to define the start of */ 49 /* the error list. It is followed by several FT_ERROR_DEF calls */ 50 /* (see below). */ 51 /* */ 52 /* FT_ERROR_DEF( e, v, s ) :: */ 53 /* This macro is called to define one single error. */ 54 /* `e' is the error code identifier (e.g. FT_Err_Invalid_Argument). */ 55 /* `v' is the error numerical value. */ 56 /* `s' is the corresponding error string. */ 57 /* */ 58 /* FT_ERROR_END_LIST :: */ 59 /* This macro ends the list. */ 60 /* */ 61 /* Additionally, you have to undefine __FTERRORS_H__ before #including */ 62 /* this file. */ 63 /* */ 64 /* Here is a simple example: */ 65 /* */ 66 /* { */ 67 /* #undef __FTERRORS_H__ */ 68 /* #define FT_ERRORDEF( e, v, s ) { e, s }, */ 69 /* #define FT_ERROR_START_LIST { */ 70 /* #define FT_ERROR_END_LIST { 0, 0 } }; */ 71 /* */ 72 /* const struct */ 73 /* { */ 74 /* int err_code; */ 75 /* const char* err_msg; */ 76 /* } ft_errors[] = */ 77 /* */ 78 /* #include "fterrors.h" */ 79 /* } */ 80 /* */ 81 /*************************************************************************/ 82 83 84#ifndef __FTERRORS_H__ 85#define __FTERRORS_H__ 86 87 88 /* include module base error codes */ 89#include "ftmoderr.h" 90 91 92 /*******************************************************************/ 93 /*******************************************************************/ 94 /***** *****/ 95 /***** SETUP MACROS *****/ 96 /***** *****/ 97 /*******************************************************************/ 98 /*******************************************************************/ 99 100 101#undef FT_NEED_EXTERN_C 102 103 104 /* FT_ERR_PREFIX is used as a prefix for error identifiers. */ 105 /* By default, we use `FT_Err_'. */ 106 /* */ 107#ifndef FT_ERR_PREFIX 108#define FT_ERR_PREFIX FT_Err_ 109#endif 110 111 112 /* FT_ERR_BASE is used as the base for module-specific errors. */ 113 /* */ 114#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS 115 116#ifndef FT_ERR_BASE 117#define FT_ERR_BASE FT_Mod_Err_Base 118#endif 119 120#else 121 122#undef FT_ERR_BASE 123#define FT_ERR_BASE 0 124 125#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */ 126 127 128 /* If FT_ERRORDEF is not defined, we need to define a simple */ 129 /* enumeration type. */ 130 /* */ 131#ifndef FT_ERRORDEF 132 133#define FT_ERRORDEF( e, v, s ) e = v, 134#define FT_ERROR_START_LIST enum { 135#define FT_ERROR_END_LIST FT_ERR_CAT( FT_ERR_PREFIX, Max ) }; 136 137#ifdef __cplusplus 138#define FT_NEED_EXTERN_C 139 extern "C" { 140#endif 141 142#endif /* !FT_ERRORDEF */ 143 144 145 /* this macro is used to define an error */ 146#define FT_ERRORDEF_( e, v, s ) \ 147 FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s ) 148 149 /* this is only used for <module>_Err_Ok, which must be 0! */ 150#define FT_NOERRORDEF_( e, v, s ) \ 151 FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s ) 152 153 154#ifdef FT_ERROR_START_LIST 155 FT_ERROR_START_LIST 156#endif 157 158 159 /* now include the error codes */ 160#include "fterrdef.h" 161 162 163#ifdef FT_ERROR_END_LIST 164 FT_ERROR_END_LIST 165#endif 166 167 168 /*******************************************************************/ 169 /*******************************************************************/ 170 /***** *****/ 171 /***** SIMPLE CLEANUP *****/ 172 /***** *****/ 173 /*******************************************************************/ 174 /*******************************************************************/ 175 176#ifdef FT_NEED_EXTERN_C 177 } 178#endif 179 180#undef FT_ERROR_START_LIST 181#undef FT_ERROR_END_LIST 182 183#undef FT_ERRORDEF 184#undef FT_ERRORDEF_ 185#undef FT_NOERRORDEF_ 186 187#undef FT_NEED_EXTERN_C 188#undef FT_ERR_BASE 189 190 /* FT_ERR_PREFIX is needed internally */ 191#ifndef FT2_BUILD_LIBRARY 192#undef FT_ERR_PREFIX 193#endif 194 195#endif /* __FTERRORS_H__ */ 196 197 198/* END */ 199