1/****************************************************************************
2 *
3 * config/integer-types.h
4 *
5 * FreeType integer types definitions.
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#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__ ) && __WATCOMC__ >= 1100 /* Watcom C++ */
225
226#define FT_INT64 long long int
227#define FT_UINT64 unsigned long long int
228
229#elif defined( __MWERKS__ ) /* Metrowerks CodeWarrior */
230
231#define FT_INT64 long long int
232#define FT_UINT64 unsigned long long int
233
234#elif defined( __GNUC__ )
235
236 /* GCC provides the `long long` type */
237#define FT_INT64 long long int
238#define FT_UINT64 unsigned long long int
239
240#endif /* !__STDC__ */
241
242#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */
243
244#ifdef FT_INT64
245 typedef FT_INT64 FT_Int64;
246 typedef FT_UINT64 FT_UInt64;
247#endif
248
249
250#endif /* FREETYPE_CONFIG_INTEGER_TYPES_H_ */
251