Home | History | Annotate | Download | only in include
      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 FT_ERRORS_H                                            */
     79   /*     }                                                                 */
     80   /*                                                                       */
     81   /*************************************************************************/
     82 
     83 
     84 #ifndef __FTERRORS_H__
     85 #define __FTERRORS_H__
     86 
     87 
     88   /* include module base error codes */
     89 #include FT_MODULE_ERRORS_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 FT_ERROR_DEFINITIONS_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