| 1 | /**************************************************************************** | 
|---|
| 2 | * | 
|---|
| 3 | * fterrors.h | 
|---|
| 4 | * | 
|---|
| 5 | *   FreeType error code handling (specification). | 
|---|
| 6 | * | 
|---|
| 7 | * Copyright (C) 1996-2023 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 | * @section: | 
|---|
| 22 | *   error_enumerations | 
|---|
| 23 | * | 
|---|
| 24 | * @title: | 
|---|
| 25 | *   Error Enumerations | 
|---|
| 26 | * | 
|---|
| 27 | * @abstract: | 
|---|
| 28 | *   How to handle errors and error strings. | 
|---|
| 29 | * | 
|---|
| 30 | * @description: | 
|---|
| 31 | *   The header file `fterrors.h` (which is automatically included by | 
|---|
| 32 | *   `freetype.h`) defines the handling of FreeType's enumeration | 
|---|
| 33 | *   constants.  It can also be used to generate error message strings | 
|---|
| 34 | *   with a small macro trick explained below. | 
|---|
| 35 | * | 
|---|
| 36 | *   **Error Formats** | 
|---|
| 37 | * | 
|---|
| 38 | *   The configuration macro `FT_CONFIG_OPTION_USE_MODULE_ERRORS` can be | 
|---|
| 39 | *   defined in `ftoption.h` in order to make the higher byte indicate the | 
|---|
| 40 | *   module where the error has happened (this is not compatible with | 
|---|
| 41 | *   standard builds of FreeType~2, however).  See the file `ftmoderr.h` | 
|---|
| 42 | *   for more details. | 
|---|
| 43 | * | 
|---|
| 44 | *   **Error Message Strings** | 
|---|
| 45 | * | 
|---|
| 46 | *   Error definitions are set up with special macros that allow client | 
|---|
| 47 | *   applications to build a table of error message strings.  The strings | 
|---|
| 48 | *   are not included in a normal build of FreeType~2 to save space (most | 
|---|
| 49 | *   client applications do not use them). | 
|---|
| 50 | * | 
|---|
| 51 | *   To do so, you have to define the following macros before including | 
|---|
| 52 | *   this file. | 
|---|
| 53 | * | 
|---|
| 54 | *   ``` | 
|---|
| 55 | *     FT_ERROR_START_LIST | 
|---|
| 56 | *   ``` | 
|---|
| 57 | * | 
|---|
| 58 | *   This macro is called before anything else to define the start of the | 
|---|
| 59 | *   error list.  It is followed by several `FT_ERROR_DEF` calls. | 
|---|
| 60 | * | 
|---|
| 61 | *   ``` | 
|---|
| 62 | *     FT_ERROR_DEF( e, v, s ) | 
|---|
| 63 | *   ``` | 
|---|
| 64 | * | 
|---|
| 65 | *   This macro is called to define one single error.  'e' is the error | 
|---|
| 66 | *   code identifier (e.g., `Invalid_Argument`), 'v' is the error's | 
|---|
| 67 | *   numerical value, and 's' is the corresponding error string. | 
|---|
| 68 | * | 
|---|
| 69 | *   ``` | 
|---|
| 70 | *     FT_ERROR_END_LIST | 
|---|
| 71 | *   ``` | 
|---|
| 72 | * | 
|---|
| 73 | *   This macro ends the list. | 
|---|
| 74 | * | 
|---|
| 75 | *   Additionally, you have to undefine `FTERRORS_H_` before #including | 
|---|
| 76 | *   this file. | 
|---|
| 77 | * | 
|---|
| 78 | *   Here is a simple example. | 
|---|
| 79 | * | 
|---|
| 80 | *   ``` | 
|---|
| 81 | *     #undef FTERRORS_H_ | 
|---|
| 82 | *     #define FT_ERRORDEF( e, v, s )  { e, s }, | 
|---|
| 83 | *     #define FT_ERROR_START_LIST     { | 
|---|
| 84 | *     #define FT_ERROR_END_LIST       { 0, NULL } }; | 
|---|
| 85 | * | 
|---|
| 86 | *     const struct | 
|---|
| 87 | *     { | 
|---|
| 88 | *       int          err_code; | 
|---|
| 89 | *       const char*  err_msg; | 
|---|
| 90 | *     } ft_errors[] = | 
|---|
| 91 | * | 
|---|
| 92 | *     #include <freetype/fterrors.h> | 
|---|
| 93 | *   ``` | 
|---|
| 94 | * | 
|---|
| 95 | *   An alternative to using an array is a switch statement. | 
|---|
| 96 | * | 
|---|
| 97 | *   ``` | 
|---|
| 98 | *     #undef FTERRORS_H_ | 
|---|
| 99 | *     #define FT_ERROR_START_LIST     switch ( error_code ) { | 
|---|
| 100 | *     #define FT_ERRORDEF( e, v, s )    case v: return s; | 
|---|
| 101 | *     #define FT_ERROR_END_LIST       } | 
|---|
| 102 | *   ``` | 
|---|
| 103 | * | 
|---|
| 104 | *   If you use `FT_CONFIG_OPTION_USE_MODULE_ERRORS`, `error_code` should | 
|---|
| 105 | *   be replaced with `FT_ERROR_BASE(error_code)` in the last example. | 
|---|
| 106 | */ | 
|---|
| 107 |  | 
|---|
| 108 | /* */ | 
|---|
| 109 |  | 
|---|
| 110 | /* In previous FreeType versions we used `__FTERRORS_H__`.  However, */ | 
|---|
| 111 | /* using two successive underscores in a non-system symbol name      */ | 
|---|
| 112 | /* violates the C (and C++) standard, so it was changed to the       */ | 
|---|
| 113 | /* current form.  In spite of this, we have to make                  */ | 
|---|
| 114 | /*                                                                   */ | 
|---|
| 115 | /* ```                                                               */ | 
|---|
| 116 | /*   #undefine __FTERRORS_H__                                        */ | 
|---|
| 117 | /* ```                                                               */ | 
|---|
| 118 | /*                                                                   */ | 
|---|
| 119 | /* work for backward compatibility.                                  */ | 
|---|
| 120 | /*                                                                   */ | 
|---|
| 121 | #if !( defined( FTERRORS_H_ ) && defined ( __FTERRORS_H__ ) ) | 
|---|
| 122 | #define FTERRORS_H_ | 
|---|
| 123 | #define __FTERRORS_H__ | 
|---|
| 124 |  | 
|---|
| 125 |  | 
|---|
| 126 | /* include module base error codes */ | 
|---|
| 127 | #include <freetype/ftmoderr.h> | 
|---|
| 128 |  | 
|---|
| 129 |  | 
|---|
| 130 | /*******************************************************************/ | 
|---|
| 131 | /*******************************************************************/ | 
|---|
| 132 | /*****                                                         *****/ | 
|---|
| 133 | /*****                       SETUP MACROS                      *****/ | 
|---|
| 134 | /*****                                                         *****/ | 
|---|
| 135 | /*******************************************************************/ | 
|---|
| 136 | /*******************************************************************/ | 
|---|
| 137 |  | 
|---|
| 138 |  | 
|---|
| 139 | #undef  FT_NEED_EXTERN_C | 
|---|
| 140 |  | 
|---|
| 141 |  | 
|---|
| 142 | /* FT_ERR_PREFIX is used as a prefix for error identifiers. */ | 
|---|
| 143 | /* By default, we use `FT_Err_`.                            */ | 
|---|
| 144 | /*                                                          */ | 
|---|
| 145 | #ifndef FT_ERR_PREFIX | 
|---|
| 146 | #define FT_ERR_PREFIX  FT_Err_ | 
|---|
| 147 | #endif | 
|---|
| 148 |  | 
|---|
| 149 |  | 
|---|
| 150 | /* FT_ERR_BASE is used as the base for module-specific errors. */ | 
|---|
| 151 | /*                                                             */ | 
|---|
| 152 | #ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS | 
|---|
| 153 |  | 
|---|
| 154 | #ifndef FT_ERR_BASE | 
|---|
| 155 | #define FT_ERR_BASE  FT_Mod_Err_Base | 
|---|
| 156 | #endif | 
|---|
| 157 |  | 
|---|
| 158 | #else | 
|---|
| 159 |  | 
|---|
| 160 | #undef FT_ERR_BASE | 
|---|
| 161 | #define FT_ERR_BASE  0 | 
|---|
| 162 |  | 
|---|
| 163 | #endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */ | 
|---|
| 164 |  | 
|---|
| 165 |  | 
|---|
| 166 | /* If FT_ERRORDEF is not defined, we need to define a simple */ | 
|---|
| 167 | /* enumeration type.                                         */ | 
|---|
| 168 | /*                                                           */ | 
|---|
| 169 | #ifndef FT_ERRORDEF | 
|---|
| 170 |  | 
|---|
| 171 | #define FT_INCLUDE_ERR_PROTOS | 
|---|
| 172 |  | 
|---|
| 173 | #define FT_ERRORDEF( e, v, s )  e = v, | 
|---|
| 174 | #define FT_ERROR_START_LIST     enum { | 
|---|
| 175 | #define FT_ERROR_END_LIST       FT_ERR_CAT( FT_ERR_PREFIX, Max ) }; | 
|---|
| 176 |  | 
|---|
| 177 | #ifdef __cplusplus | 
|---|
| 178 | #define FT_NEED_EXTERN_C | 
|---|
| 179 | extern "C"{ | 
|---|
| 180 | #endif | 
|---|
| 181 |  | 
|---|
| 182 | #endif /* !FT_ERRORDEF */ | 
|---|
| 183 |  | 
|---|
| 184 |  | 
|---|
| 185 | /* this macro is used to define an error */ | 
|---|
| 186 | #define FT_ERRORDEF_( e, v, s )                                             \ | 
|---|
| 187 | FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s ) | 
|---|
| 188 |  | 
|---|
| 189 | /* this is only used for <module>_Err_Ok, which must be 0! */ | 
|---|
| 190 | #define FT_NOERRORDEF_( e, v, s )                             \ | 
|---|
| 191 | FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s ) | 
|---|
| 192 |  | 
|---|
| 193 |  | 
|---|
| 194 | #ifdef FT_ERROR_START_LIST | 
|---|
| 195 | FT_ERROR_START_LIST | 
|---|
| 196 | #endif | 
|---|
| 197 |  | 
|---|
| 198 |  | 
|---|
| 199 | /* now include the error codes */ | 
|---|
| 200 | #include <freetype/fterrdef.h> | 
|---|
| 201 |  | 
|---|
| 202 |  | 
|---|
| 203 | #ifdef FT_ERROR_END_LIST | 
|---|
| 204 | FT_ERROR_END_LIST | 
|---|
| 205 | #endif | 
|---|
| 206 |  | 
|---|
| 207 |  | 
|---|
| 208 | /*******************************************************************/ | 
|---|
| 209 | /*******************************************************************/ | 
|---|
| 210 | /*****                                                         *****/ | 
|---|
| 211 | /*****                      SIMPLE CLEANUP                     *****/ | 
|---|
| 212 | /*****                                                         *****/ | 
|---|
| 213 | /*******************************************************************/ | 
|---|
| 214 | /*******************************************************************/ | 
|---|
| 215 |  | 
|---|
| 216 | #ifdef FT_NEED_EXTERN_C | 
|---|
| 217 | } | 
|---|
| 218 | #endif | 
|---|
| 219 |  | 
|---|
| 220 | #undef FT_ERROR_START_LIST | 
|---|
| 221 | #undef FT_ERROR_END_LIST | 
|---|
| 222 |  | 
|---|
| 223 | #undef FT_ERRORDEF | 
|---|
| 224 | #undef FT_ERRORDEF_ | 
|---|
| 225 | #undef FT_NOERRORDEF_ | 
|---|
| 226 |  | 
|---|
| 227 | #undef FT_NEED_EXTERN_C | 
|---|
| 228 | #undef FT_ERR_BASE | 
|---|
| 229 |  | 
|---|
| 230 | /* FT_ERR_PREFIX is needed internally */ | 
|---|
| 231 | #ifndef FT2_BUILD_LIBRARY | 
|---|
| 232 | #undef FT_ERR_PREFIX | 
|---|
| 233 | #endif | 
|---|
| 234 |  | 
|---|
| 235 | /* FT_INCLUDE_ERR_PROTOS: Control whether function prototypes should be */ | 
|---|
| 236 | /*                        included with                                 */ | 
|---|
| 237 | /*                                                                      */ | 
|---|
| 238 | /*                          #include <freetype/fterrors.h>              */ | 
|---|
| 239 | /*                                                                      */ | 
|---|
| 240 | /*                        This is only true where `FT_ERRORDEF` is      */ | 
|---|
| 241 | /*                        undefined.                                    */ | 
|---|
| 242 | /*                                                                      */ | 
|---|
| 243 | /* FT_ERR_PROTOS_DEFINED: Actual multiple-inclusion protection of       */ | 
|---|
| 244 | /*                        `fterrors.h`.                                 */ | 
|---|
| 245 | #ifdef FT_INCLUDE_ERR_PROTOS | 
|---|
| 246 | #undef FT_INCLUDE_ERR_PROTOS | 
|---|
| 247 |  | 
|---|
| 248 | #ifndef FT_ERR_PROTOS_DEFINED | 
|---|
| 249 | #define FT_ERR_PROTOS_DEFINED | 
|---|
| 250 |  | 
|---|
| 251 |  | 
|---|
| 252 | FT_BEGIN_HEADER | 
|---|
| 253 |  | 
|---|
| 254 | /************************************************************************** | 
|---|
| 255 | * | 
|---|
| 256 | * @function: | 
|---|
| 257 | *   FT_Error_String | 
|---|
| 258 | * | 
|---|
| 259 | * @description: | 
|---|
| 260 | *   Retrieve the description of a valid FreeType error code. | 
|---|
| 261 | * | 
|---|
| 262 | * @input: | 
|---|
| 263 | *   error_code :: | 
|---|
| 264 | *     A valid FreeType error code. | 
|---|
| 265 | * | 
|---|
| 266 | * @return: | 
|---|
| 267 | *   A C~string or `NULL`, if any error occurred. | 
|---|
| 268 | * | 
|---|
| 269 | * @note: | 
|---|
| 270 | *   FreeType has to be compiled with `FT_CONFIG_OPTION_ERROR_STRINGS` or | 
|---|
| 271 | *   `FT_DEBUG_LEVEL_ERROR` to get meaningful descriptions. | 
|---|
| 272 | *   'error_string' will be `NULL` otherwise. | 
|---|
| 273 | * | 
|---|
| 274 | *   Module identification will be ignored: | 
|---|
| 275 | * | 
|---|
| 276 | *   ```c | 
|---|
| 277 | *     strcmp( FT_Error_String(  FT_Err_Unknown_File_Format ), | 
|---|
| 278 | *             FT_Error_String( BDF_Err_Unknown_File_Format ) ) == 0; | 
|---|
| 279 | *   ``` | 
|---|
| 280 | */ | 
|---|
| 281 | FT_EXPORT( const char* ) | 
|---|
| 282 | FT_Error_String( FT_Error  error_code ); | 
|---|
| 283 |  | 
|---|
| 284 | /* */ | 
|---|
| 285 |  | 
|---|
| 286 | FT_END_HEADER | 
|---|
| 287 |  | 
|---|
| 288 |  | 
|---|
| 289 | #endif /* FT_ERR_PROTOS_DEFINED */ | 
|---|
| 290 |  | 
|---|
| 291 | #endif /* FT_INCLUDE_ERR_PROTOS */ | 
|---|
| 292 |  | 
|---|
| 293 | #endif /* !(FTERRORS_H_ && __FTERRORS_H__) */ | 
|---|
| 294 |  | 
|---|
| 295 |  | 
|---|
| 296 | /* END */ | 
|---|
| 297 |  | 
|---|