| 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 |  | 
|---|