| 1 | /**************************************************************************** | 
| 2 |  * | 
| 3 |  * config/integer-types.h | 
| 4 |  * | 
| 5 |  *   FreeType integer types definitions. | 
| 6 |  * | 
| 7 |  * Copyright (C) 1996-2021 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 | #ifndef FREETYPE_CONFIG_INTEGER_TYPES_H_ | 
| 18 | #define FREETYPE_CONFIG_INTEGER_TYPES_H_ | 
| 19 |  | 
| 20 |   /* There are systems (like the Texas Instruments 'C54x) where a `char`  */ | 
| 21 |   /* has 16~bits.  ANSI~C says that `sizeof(char)` is always~1.  Since an */ | 
| 22 |   /* `int` has 16~bits also for this system, `sizeof(int)` gives~1 which  */ | 
| 23 |   /* is probably unexpected.                                              */ | 
| 24 |   /*                                                                      */ | 
| 25 |   /* `CHAR_BIT` (defined in `limits.h`) gives the number of bits in a     */ | 
| 26 |   /* `char` type.                                                         */ | 
| 27 |  | 
| 28 | #ifndef FT_CHAR_BIT | 
| 29 | #define FT_CHAR_BIT  CHAR_BIT | 
| 30 | #endif | 
| 31 |  | 
| 32 | #ifndef FT_SIZEOF_INT | 
| 33 |  | 
| 34 |   /* The size of an `int` type. */ | 
| 35 | #if                                 FT_UINT_MAX == 0xFFFFUL | 
| 36 | #define FT_SIZEOF_INT  ( 16 / FT_CHAR_BIT ) | 
| 37 | #elif                               FT_UINT_MAX == 0xFFFFFFFFUL | 
| 38 | #define FT_SIZEOF_INT  ( 32 / FT_CHAR_BIT ) | 
| 39 | #elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL | 
| 40 | #define FT_SIZEOF_INT  ( 64 / FT_CHAR_BIT ) | 
| 41 | #else | 
| 42 | #error "Unsupported size of `int' type!" | 
| 43 | #endif | 
| 44 |  | 
| 45 | #endif  /* !defined(FT_SIZEOF_INT) */ | 
| 46 |  | 
| 47 | #ifndef FT_SIZEOF_LONG | 
| 48 |  | 
| 49 |   /* The size of a `long` type.  A five-byte `long` (as used e.g. on the */ | 
| 50 |   /* DM642) is recognized but avoided.                                   */ | 
| 51 | #if                                  FT_ULONG_MAX == 0xFFFFFFFFUL | 
| 52 | #define FT_SIZEOF_LONG  ( 32 / FT_CHAR_BIT ) | 
| 53 | #elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL | 
| 54 | #define FT_SIZEOF_LONG  ( 32 / FT_CHAR_BIT ) | 
| 55 | #elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL | 
| 56 | #define FT_SIZEOF_LONG  ( 64 / FT_CHAR_BIT ) | 
| 57 | #else | 
| 58 | #error "Unsupported size of `long' type!" | 
| 59 | #endif | 
| 60 |  | 
| 61 | #endif /* !defined(FT_SIZEOF_LONG) */ | 
| 62 |  | 
| 63 | #ifndef FT_SIZEOF_LONG_LONG | 
| 64 |  | 
| 65 |   /* The size of a `long long` type if available */ | 
| 66 | #if defined( FT_ULLONG_MAX ) && FT_ULLONG_MAX >= 0xFFFFFFFFFFFFFFFFULL | 
| 67 | #define FT_SIZEOF_LONG_LONG  ( 64 / FT_CHAR_BIT ) | 
| 68 | #else | 
| 69 | #define FT_SIZEOF_LONG_LONG  0 | 
| 70 | #endif | 
| 71 |  | 
| 72 | #endif /* !defined(FT_SIZEOF_LONG_LONG) */ | 
| 73 |  | 
| 74 |  | 
| 75 |   /************************************************************************** | 
| 76 |    * | 
| 77 |    * @section: | 
| 78 |    *   basic_types | 
| 79 |    * | 
| 80 |    */ | 
| 81 |  | 
| 82 |  | 
| 83 |   /************************************************************************** | 
| 84 |    * | 
| 85 |    * @type: | 
| 86 |    *   FT_Int16 | 
| 87 |    * | 
| 88 |    * @description: | 
| 89 |    *   A typedef for a 16bit signed integer type. | 
| 90 |    */ | 
| 91 |   typedef signed short  FT_Int16; | 
| 92 |  | 
| 93 |  | 
| 94 |   /************************************************************************** | 
| 95 |    * | 
| 96 |    * @type: | 
| 97 |    *   FT_UInt16 | 
| 98 |    * | 
| 99 |    * @description: | 
| 100 |    *   A typedef for a 16bit unsigned integer type. | 
| 101 |    */ | 
| 102 |   typedef unsigned short  FT_UInt16; | 
| 103 |  | 
| 104 |   /* */ | 
| 105 |  | 
| 106 |  | 
| 107 |   /* this #if 0 ... #endif clause is for documentation purposes */ | 
| 108 | #if 0 | 
| 109 |  | 
| 110 |   /************************************************************************** | 
| 111 |    * | 
| 112 |    * @type: | 
| 113 |    *   FT_Int32 | 
| 114 |    * | 
| 115 |    * @description: | 
| 116 |    *   A typedef for a 32bit signed integer type.  The size depends on the | 
| 117 |    *   configuration. | 
| 118 |    */ | 
| 119 |   typedef signed XXX  FT_Int32; | 
| 120 |  | 
| 121 |  | 
| 122 |   /************************************************************************** | 
| 123 |    * | 
| 124 |    * @type: | 
| 125 |    *   FT_UInt32 | 
| 126 |    * | 
| 127 |    *   A typedef for a 32bit unsigned integer type.  The size depends on the | 
| 128 |    *   configuration. | 
| 129 |    */ | 
| 130 |   typedef unsigned XXX  FT_UInt32; | 
| 131 |  | 
| 132 |  | 
| 133 |   /************************************************************************** | 
| 134 |    * | 
| 135 |    * @type: | 
| 136 |    *   FT_Int64 | 
| 137 |    * | 
| 138 |    *   A typedef for a 64bit signed integer type.  The size depends on the | 
| 139 |    *   configuration.  Only defined if there is real 64bit support; | 
| 140 |    *   otherwise, it gets emulated with a structure (if necessary). | 
| 141 |    */ | 
| 142 |   typedef signed XXX  FT_Int64; | 
| 143 |  | 
| 144 |  | 
| 145 |   /************************************************************************** | 
| 146 |    * | 
| 147 |    * @type: | 
| 148 |    *   FT_UInt64 | 
| 149 |    * | 
| 150 |    *   A typedef for a 64bit unsigned integer type.  The size depends on the | 
| 151 |    *   configuration.  Only defined if there is real 64bit support; | 
| 152 |    *   otherwise, it gets emulated with a structure (if necessary). | 
| 153 |    */ | 
| 154 |   typedef unsigned XXX  FT_UInt64; | 
| 155 |  | 
| 156 |   /* */ | 
| 157 |  | 
| 158 | #endif | 
| 159 |  | 
| 160 | #if FT_SIZEOF_INT == ( 32 / FT_CHAR_BIT ) | 
| 161 |  | 
| 162 |   typedef signed int      FT_Int32; | 
| 163 |   typedef unsigned int    FT_UInt32; | 
| 164 |  | 
| 165 | #elif FT_SIZEOF_LONG == ( 32 / FT_CHAR_BIT ) | 
| 166 |  | 
| 167 |   typedef signed long     FT_Int32; | 
| 168 |   typedef unsigned long   FT_UInt32; | 
| 169 |  | 
| 170 | #else | 
| 171 | #error "no 32bit type found -- please check your configuration files" | 
| 172 | #endif | 
| 173 |  | 
| 174 |  | 
| 175 |   /* look up an integer type that is at least 32~bits */ | 
| 176 | #if FT_SIZEOF_INT >= ( 32 / FT_CHAR_BIT ) | 
| 177 |  | 
| 178 |   typedef int            FT_Fast; | 
| 179 |   typedef unsigned int   FT_UFast; | 
| 180 |  | 
| 181 | #elif FT_SIZEOF_LONG >= ( 32 / FT_CHAR_BIT ) | 
| 182 |  | 
| 183 |   typedef long           FT_Fast; | 
| 184 |   typedef unsigned long  FT_UFast; | 
| 185 |  | 
| 186 | #endif | 
| 187 |  | 
| 188 |  | 
| 189 |   /* determine whether we have a 64-bit integer type */ | 
| 190 | #if FT_SIZEOF_LONG == ( 64 / FT_CHAR_BIT ) | 
| 191 |  | 
| 192 | #define FT_INT64   long | 
| 193 | #define FT_UINT64  unsigned long | 
| 194 |  | 
| 195 | #elif FT_SIZEOF_LONG_LONG >= ( 64 / FT_CHAR_BIT ) | 
| 196 |  | 
| 197 | #define FT_INT64   long long int | 
| 198 | #define FT_UINT64  unsigned long long int | 
| 199 |  | 
| 200 |   /************************************************************************** | 
| 201 |    * | 
| 202 |    * A 64-bit data type may create compilation problems if you compile in | 
| 203 |    * strict ANSI mode.  To avoid them, we disable other 64-bit data types if | 
| 204 |    * `__STDC__` is defined.  You can however ignore this rule by defining the | 
| 205 |    * `FT_CONFIG_OPTION_FORCE_INT64` configuration macro. | 
| 206 |    */ | 
| 207 | #elif !defined( __STDC__ ) || defined( FT_CONFIG_OPTION_FORCE_INT64 ) | 
| 208 |  | 
| 209 | #if defined( _MSC_VER ) && _MSC_VER >= 900 /* Visual C++ (and Intel C++) */ | 
| 210 |  | 
| 211 |   /* this compiler provides the `__int64` type */ | 
| 212 | #define FT_INT64   __int64 | 
| 213 | #define FT_UINT64  unsigned __int64 | 
| 214 |  | 
| 215 | #elif defined( __BORLANDC__ )  /* Borland C++ */ | 
| 216 |  | 
| 217 |   /* XXXX: We should probably check the value of `__BORLANDC__` in order */ | 
| 218 |   /*       to test the compiler version.                                 */ | 
| 219 |  | 
| 220 |   /* this compiler provides the `__int64` type */ | 
| 221 | #define FT_INT64   __int64 | 
| 222 | #define FT_UINT64  unsigned __int64 | 
| 223 |  | 
| 224 | #elif defined( __WATCOMC__ )   /* Watcom C++ */ | 
| 225 |  | 
| 226 |   /* Watcom doesn't provide 64-bit data types */ | 
| 227 |  | 
| 228 | #elif defined( __MWERKS__ )    /* Metrowerks CodeWarrior */ | 
| 229 |  | 
| 230 | #define FT_INT64   long long int | 
| 231 | #define FT_UINT64  unsigned long long int | 
| 232 |  | 
| 233 | #elif defined( __GNUC__ ) | 
| 234 |  | 
| 235 |   /* GCC provides the `long long` type */ | 
| 236 | #define FT_INT64   long long int | 
| 237 | #define FT_UINT64  unsigned long long int | 
| 238 |  | 
| 239 | #endif /* !__STDC__ */ | 
| 240 |  | 
| 241 | #endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */ | 
| 242 |  | 
| 243 | #ifdef FT_INT64 | 
| 244 |   typedef FT_INT64   FT_Int64; | 
| 245 |   typedef FT_UINT64  FT_UInt64; | 
| 246 | #endif | 
| 247 |  | 
| 248 |  | 
| 249 | #endif  /* FREETYPE_CONFIG_INTEGER_TYPES_H_ */ | 
| 250 |  |