1 | /* |
2 | Simple DirectMedia Layer |
3 | Copyright (C) 1997-2024 Sam Lantinga <slouken@libsdl.org> |
4 | |
5 | This software is provided 'as-is', without any express or implied |
6 | warranty. In no event will the authors be held liable for any damages |
7 | arising from the use of this software. |
8 | |
9 | Permission is granted to anyone to use this software for any purpose, |
10 | including commercial applications, and to alter it and redistribute it |
11 | freely, subject to the following restrictions: |
12 | |
13 | 1. The origin of this software must not be misrepresented; you must not |
14 | claim that you wrote the original software. If you use this software |
15 | in a product, an acknowledgment in the product documentation would be |
16 | appreciated but is not required. |
17 | 2. Altered source versions must be plainly marked as such, and must not be |
18 | misrepresented as being the original software. |
19 | 3. This notice may not be removed or altered from any source distribution. |
20 | */ |
21 | |
22 | /** |
23 | * \file SDL_stdinc.h |
24 | * |
25 | * This is a general header that includes C language support. |
26 | */ |
27 | |
28 | #ifndef SDL_stdinc_h_ |
29 | #define SDL_stdinc_h_ |
30 | |
31 | #include "SDL_config.h" |
32 | |
33 | #ifdef HAVE_SYS_TYPES_H |
34 | #include <sys/types.h> |
35 | #endif |
36 | #ifdef HAVE_STDIO_H |
37 | #include <stdio.h> |
38 | #endif |
39 | #if defined(STDC_HEADERS) |
40 | # include <stdlib.h> |
41 | # include <stddef.h> |
42 | # include <stdarg.h> |
43 | #else |
44 | # if defined(HAVE_STDLIB_H) |
45 | # include <stdlib.h> |
46 | # elif defined(HAVE_MALLOC_H) |
47 | # include <malloc.h> |
48 | # endif |
49 | # if defined(HAVE_STDDEF_H) |
50 | # include <stddef.h> |
51 | # endif |
52 | # if defined(HAVE_STDARG_H) |
53 | # include <stdarg.h> |
54 | # endif |
55 | #endif |
56 | #ifdef HAVE_STRING_H |
57 | # if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H) |
58 | # include <memory.h> |
59 | # endif |
60 | # include <string.h> |
61 | #endif |
62 | #ifdef HAVE_STRINGS_H |
63 | # include <strings.h> |
64 | #endif |
65 | #ifdef HAVE_WCHAR_H |
66 | # include <wchar.h> |
67 | #endif |
68 | #if defined(HAVE_INTTYPES_H) |
69 | # include <inttypes.h> |
70 | #elif defined(HAVE_STDINT_H) |
71 | # include <stdint.h> |
72 | #endif |
73 | #ifdef HAVE_CTYPE_H |
74 | # include <ctype.h> |
75 | #endif |
76 | #ifdef HAVE_MATH_H |
77 | # if defined(_MSC_VER) |
78 | /* Defining _USE_MATH_DEFINES is required to get M_PI to be defined on |
79 | Visual Studio. See http://msdn.microsoft.com/en-us/library/4hwaceh6.aspx |
80 | for more information. |
81 | */ |
82 | # ifndef _USE_MATH_DEFINES |
83 | # define _USE_MATH_DEFINES |
84 | # endif |
85 | # endif |
86 | # include <math.h> |
87 | #endif |
88 | #ifdef HAVE_FLOAT_H |
89 | # include <float.h> |
90 | #endif |
91 | #if defined(HAVE_ALLOCA) && !defined(alloca) |
92 | # if defined(HAVE_ALLOCA_H) |
93 | # include <alloca.h> |
94 | # elif defined(__GNUC__) |
95 | # define alloca __builtin_alloca |
96 | # elif defined(_MSC_VER) |
97 | # include <malloc.h> |
98 | # define alloca _alloca |
99 | # elif defined(__WATCOMC__) |
100 | # include <malloc.h> |
101 | # elif defined(__BORLANDC__) |
102 | # include <malloc.h> |
103 | # elif defined(__DMC__) |
104 | # include <stdlib.h> |
105 | # elif defined(__AIX__) |
106 | #pragma alloca |
107 | # elif defined(__MRC__) |
108 | void *alloca(unsigned); |
109 | # else |
110 | void *alloca(size_t); |
111 | # endif |
112 | #endif |
113 | |
114 | #ifdef SIZE_MAX |
115 | # define SDL_SIZE_MAX SIZE_MAX |
116 | #else |
117 | # define SDL_SIZE_MAX ((size_t) -1) |
118 | #endif |
119 | |
120 | /** |
121 | * Check if the compiler supports a given builtin. |
122 | * Supported by virtually all clang versions and recent gcc. Use this |
123 | * instead of checking the clang version if possible. |
124 | */ |
125 | #ifdef __has_builtin |
126 | #define _SDL_HAS_BUILTIN(x) __has_builtin(x) |
127 | #else |
128 | #define _SDL_HAS_BUILTIN(x) 0 |
129 | #endif |
130 | |
131 | /** |
132 | * The number of elements in an array. |
133 | */ |
134 | #define SDL_arraysize(array) (sizeof(array)/sizeof(array[0])) |
135 | #define SDL_TABLESIZE(table) SDL_arraysize(table) |
136 | |
137 | /** |
138 | * Macro useful for building other macros with strings in them |
139 | * |
140 | * e.g. #define LOG_ERROR(X) OutputDebugString(SDL_STRINGIFY_ARG(__FUNCTION__) ": " X "\n") |
141 | */ |
142 | #define SDL_STRINGIFY_ARG(arg) #arg |
143 | |
144 | /** |
145 | * \name Cast operators |
146 | * |
147 | * Use proper C++ casts when compiled as C++ to be compatible with the option |
148 | * -Wold-style-cast of GCC (and -Werror=old-style-cast in GCC 4.2 and above). |
149 | */ |
150 | /* @{ */ |
151 | #ifdef __cplusplus |
152 | #define SDL_reinterpret_cast(type, expression) reinterpret_cast<type>(expression) |
153 | #define SDL_static_cast(type, expression) static_cast<type>(expression) |
154 | #define SDL_const_cast(type, expression) const_cast<type>(expression) |
155 | #else |
156 | #define SDL_reinterpret_cast(type, expression) ((type)(expression)) |
157 | #define SDL_static_cast(type, expression) ((type)(expression)) |
158 | #define SDL_const_cast(type, expression) ((type)(expression)) |
159 | #endif |
160 | /* @} *//* Cast operators */ |
161 | |
162 | /* Define a four character code as a Uint32 */ |
163 | #define SDL_FOURCC(A, B, C, D) \ |
164 | ((SDL_static_cast(Uint32, SDL_static_cast(Uint8, (A))) << 0) | \ |
165 | (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (B))) << 8) | \ |
166 | (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (C))) << 16) | \ |
167 | (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (D))) << 24)) |
168 | |
169 | /** |
170 | * \name Basic data types |
171 | */ |
172 | /* @{ */ |
173 | |
174 | #ifdef __CC_ARM |
175 | /* ARM's compiler throws warnings if we use an enum: like "SDL_bool x = a < b;" */ |
176 | #define SDL_FALSE 0 |
177 | #define SDL_TRUE 1 |
178 | typedef int SDL_bool; |
179 | #else |
180 | typedef enum |
181 | { |
182 | SDL_FALSE = 0, |
183 | SDL_TRUE = 1 |
184 | } SDL_bool; |
185 | #endif |
186 | |
187 | /** |
188 | * \brief A signed 8-bit integer type. |
189 | */ |
190 | #define SDL_MAX_SINT8 ((Sint8)0x7F) /* 127 */ |
191 | #define SDL_MIN_SINT8 ((Sint8)(~0x7F)) /* -128 */ |
192 | typedef int8_t Sint8; |
193 | /** |
194 | * \brief An unsigned 8-bit integer type. |
195 | */ |
196 | #define SDL_MAX_UINT8 ((Uint8)0xFF) /* 255 */ |
197 | #define SDL_MIN_UINT8 ((Uint8)0x00) /* 0 */ |
198 | typedef uint8_t Uint8; |
199 | /** |
200 | * \brief A signed 16-bit integer type. |
201 | */ |
202 | #define SDL_MAX_SINT16 ((Sint16)0x7FFF) /* 32767 */ |
203 | #define SDL_MIN_SINT16 ((Sint16)(~0x7FFF)) /* -32768 */ |
204 | typedef int16_t Sint16; |
205 | /** |
206 | * \brief An unsigned 16-bit integer type. |
207 | */ |
208 | #define SDL_MAX_UINT16 ((Uint16)0xFFFF) /* 65535 */ |
209 | #define SDL_MIN_UINT16 ((Uint16)0x0000) /* 0 */ |
210 | typedef uint16_t Uint16; |
211 | /** |
212 | * \brief A signed 32-bit integer type. |
213 | */ |
214 | #define SDL_MAX_SINT32 ((Sint32)0x7FFFFFFF) /* 2147483647 */ |
215 | #define SDL_MIN_SINT32 ((Sint32)(~0x7FFFFFFF)) /* -2147483648 */ |
216 | typedef int32_t Sint32; |
217 | /** |
218 | * \brief An unsigned 32-bit integer type. |
219 | */ |
220 | #define SDL_MAX_UINT32 ((Uint32)0xFFFFFFFFu) /* 4294967295 */ |
221 | #define SDL_MIN_UINT32 ((Uint32)0x00000000) /* 0 */ |
222 | typedef uint32_t Uint32; |
223 | |
224 | /** |
225 | * \brief A signed 64-bit integer type. |
226 | */ |
227 | #define SDL_MAX_SINT64 ((Sint64)0x7FFFFFFFFFFFFFFFll) /* 9223372036854775807 */ |
228 | #define SDL_MIN_SINT64 ((Sint64)(~0x7FFFFFFFFFFFFFFFll)) /* -9223372036854775808 */ |
229 | typedef int64_t Sint64; |
230 | /** |
231 | * \brief An unsigned 64-bit integer type. |
232 | */ |
233 | #define SDL_MAX_UINT64 ((Uint64)0xFFFFFFFFFFFFFFFFull) /* 18446744073709551615 */ |
234 | #define SDL_MIN_UINT64 ((Uint64)(0x0000000000000000ull)) /* 0 */ |
235 | typedef uint64_t Uint64; |
236 | |
237 | /* @} *//* Basic data types */ |
238 | |
239 | /** |
240 | * \name Floating-point constants |
241 | */ |
242 | /* @{ */ |
243 | |
244 | #ifdef FLT_EPSILON |
245 | #define SDL_FLT_EPSILON FLT_EPSILON |
246 | #else |
247 | #define SDL_FLT_EPSILON 1.1920928955078125e-07F /* 0x0.000002p0 */ |
248 | #endif |
249 | |
250 | /* @} *//* Floating-point constants */ |
251 | |
252 | /* Make sure we have macros for printing width-based integers. |
253 | * <stdint.h> should define these but this is not true all platforms. |
254 | * (for example win32) */ |
255 | #ifndef SDL_PRIs64 |
256 | #if defined(__WIN32__) || defined(__GDK__) |
257 | #define SDL_PRIs64 "I64d" |
258 | #elif defined(PRIs64) |
259 | #define SDL_PRIs64 PRIs64 |
260 | #elif defined(__LP64__) && !defined(__APPLE__) |
261 | #define SDL_PRIs64 "ld" |
262 | #else |
263 | #define SDL_PRIs64 "lld" |
264 | #endif |
265 | #endif |
266 | #ifndef SDL_PRIu64 |
267 | #if defined(__WIN32__) || defined(__GDK__) |
268 | #define SDL_PRIu64 "I64u" |
269 | #elif defined(PRIu64) |
270 | #define SDL_PRIu64 PRIu64 |
271 | #elif defined(__LP64__) && !defined(__APPLE__) |
272 | #define SDL_PRIu64 "lu" |
273 | #else |
274 | #define SDL_PRIu64 "llu" |
275 | #endif |
276 | #endif |
277 | #ifndef SDL_PRIx64 |
278 | #if defined(__WIN32__) || defined(__GDK__) |
279 | #define SDL_PRIx64 "I64x" |
280 | #elif defined(PRIx64) |
281 | #define SDL_PRIx64 PRIx64 |
282 | #elif defined(__LP64__) && !defined(__APPLE__) |
283 | #define SDL_PRIx64 "lx" |
284 | #else |
285 | #define SDL_PRIx64 "llx" |
286 | #endif |
287 | #endif |
288 | #ifndef SDL_PRIX64 |
289 | #if defined(__WIN32__) || defined(__GDK__) |
290 | #define SDL_PRIX64 "I64X" |
291 | #elif defined(PRIX64) |
292 | #define SDL_PRIX64 PRIX64 |
293 | #elif defined(__LP64__) && !defined(__APPLE__) |
294 | #define SDL_PRIX64 "lX" |
295 | #else |
296 | #define SDL_PRIX64 "llX" |
297 | #endif |
298 | #endif |
299 | #ifndef SDL_PRIs32 |
300 | #ifdef PRId32 |
301 | #define SDL_PRIs32 PRId32 |
302 | #else |
303 | #define SDL_PRIs32 "d" |
304 | #endif |
305 | #endif |
306 | #ifndef SDL_PRIu32 |
307 | #ifdef PRIu32 |
308 | #define SDL_PRIu32 PRIu32 |
309 | #else |
310 | #define SDL_PRIu32 "u" |
311 | #endif |
312 | #endif |
313 | #ifndef SDL_PRIx32 |
314 | #ifdef PRIx32 |
315 | #define SDL_PRIx32 PRIx32 |
316 | #else |
317 | #define SDL_PRIx32 "x" |
318 | #endif |
319 | #endif |
320 | #ifndef SDL_PRIX32 |
321 | #ifdef PRIX32 |
322 | #define SDL_PRIX32 PRIX32 |
323 | #else |
324 | #define SDL_PRIX32 "X" |
325 | #endif |
326 | #endif |
327 | |
328 | /* Annotations to help code analysis tools */ |
329 | #ifdef SDL_DISABLE_ANALYZE_MACROS |
330 | #define SDL_IN_BYTECAP(x) |
331 | #define SDL_INOUT_Z_CAP(x) |
332 | #define SDL_OUT_Z_CAP(x) |
333 | #define SDL_OUT_CAP(x) |
334 | #define SDL_OUT_BYTECAP(x) |
335 | #define SDL_OUT_Z_BYTECAP(x) |
336 | #define SDL_PRINTF_FORMAT_STRING |
337 | #define SDL_SCANF_FORMAT_STRING |
338 | #define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) |
339 | #define SDL_PRINTF_VARARG_FUNCV( fmtargnumber ) |
340 | #define SDL_SCANF_VARARG_FUNC( fmtargnumber ) |
341 | #define SDL_SCANF_VARARG_FUNCV( fmtargnumber ) |
342 | #else |
343 | #if defined(_MSC_VER) && (_MSC_VER >= 1600) /* VS 2010 and above */ |
344 | #include <sal.h> |
345 | |
346 | #define SDL_IN_BYTECAP(x) _In_bytecount_(x) |
347 | #define SDL_INOUT_Z_CAP(x) _Inout_z_cap_(x) |
348 | #define SDL_OUT_Z_CAP(x) _Out_z_cap_(x) |
349 | #define SDL_OUT_CAP(x) _Out_cap_(x) |
350 | #define SDL_OUT_BYTECAP(x) _Out_bytecap_(x) |
351 | #define SDL_OUT_Z_BYTECAP(x) _Out_z_bytecap_(x) |
352 | |
353 | #define SDL_PRINTF_FORMAT_STRING _Printf_format_string_ |
354 | #define SDL_SCANF_FORMAT_STRING _Scanf_format_string_impl_ |
355 | #else |
356 | #define SDL_IN_BYTECAP(x) |
357 | #define SDL_INOUT_Z_CAP(x) |
358 | #define SDL_OUT_Z_CAP(x) |
359 | #define SDL_OUT_CAP(x) |
360 | #define SDL_OUT_BYTECAP(x) |
361 | #define SDL_OUT_Z_BYTECAP(x) |
362 | #define SDL_PRINTF_FORMAT_STRING |
363 | #define SDL_SCANF_FORMAT_STRING |
364 | #endif |
365 | #if defined(__GNUC__) |
366 | #define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __printf__, fmtargnumber, fmtargnumber+1 ))) |
367 | #define SDL_PRINTF_VARARG_FUNCV( fmtargnumber ) __attribute__(( format( __printf__, fmtargnumber, 0 ))) |
368 | #define SDL_SCANF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __scanf__, fmtargnumber, fmtargnumber+1 ))) |
369 | #define SDL_SCANF_VARARG_FUNCV( fmtargnumber ) __attribute__(( format( __scanf__, fmtargnumber, 0 ))) |
370 | #else |
371 | #define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) |
372 | #define SDL_PRINTF_VARARG_FUNCV( fmtargnumber ) |
373 | #define SDL_SCANF_VARARG_FUNC( fmtargnumber ) |
374 | #define SDL_SCANF_VARARG_FUNCV( fmtargnumber ) |
375 | #endif |
376 | #endif /* SDL_DISABLE_ANALYZE_MACROS */ |
377 | |
378 | #ifndef SDL_COMPILE_TIME_ASSERT |
379 | #if defined(__cplusplus) |
380 | #if (__cplusplus >= 201103L) |
381 | #define SDL_COMPILE_TIME_ASSERT(name, x) static_assert(x, #x) |
382 | #endif |
383 | #elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) |
384 | #define SDL_COMPILE_TIME_ASSERT(name, x) _Static_assert(x, #x) |
385 | #endif |
386 | #endif /* !SDL_COMPILE_TIME_ASSERT */ |
387 | |
388 | #ifndef SDL_COMPILE_TIME_ASSERT |
389 | /* universal, but may trigger -Wunused-local-typedefs */ |
390 | #define SDL_COMPILE_TIME_ASSERT(name, x) \ |
391 | typedef int SDL_compile_time_assert_ ## name[(x) * 2 - 1] |
392 | #endif |
393 | |
394 | /** \cond */ |
395 | #ifndef DOXYGEN_SHOULD_IGNORE_THIS |
396 | SDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1); |
397 | SDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1); |
398 | SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2); |
399 | SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2); |
400 | SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4); |
401 | SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4); |
402 | SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8); |
403 | SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8); |
404 | #endif /* DOXYGEN_SHOULD_IGNORE_THIS */ |
405 | /** \endcond */ |
406 | |
407 | /* Check to make sure enums are the size of ints, for structure packing. |
408 | For both Watcom C/C++ and Borland C/C++ the compiler option that makes |
409 | enums having the size of an int must be enabled. |
410 | This is "-b" for Borland C/C++ and "-ei" for Watcom C/C++ (v11). |
411 | */ |
412 | |
413 | /** \cond */ |
414 | #ifndef DOXYGEN_SHOULD_IGNORE_THIS |
415 | #if !defined(__ANDROID__) && !defined(__VITA__) && !defined(__3DS__) |
416 | /* TODO: include/SDL_stdinc.h:174: error: size of array 'SDL_dummy_enum' is negative */ |
417 | typedef enum |
418 | { |
419 | DUMMY_ENUM_VALUE |
420 | } SDL_DUMMY_ENUM; |
421 | |
422 | SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int)); |
423 | #endif |
424 | #endif /* DOXYGEN_SHOULD_IGNORE_THIS */ |
425 | /** \endcond */ |
426 | |
427 | #include "begin_code.h" |
428 | /* Set up for C function definitions, even when using C++ */ |
429 | #ifdef __cplusplus |
430 | extern "C" { |
431 | #endif |
432 | |
433 | #ifdef HAVE_ALLOCA |
434 | #define SDL_stack_alloc(type, count) (type*)alloca(sizeof(type)*(count)) |
435 | #define SDL_stack_free(data) |
436 | #else |
437 | #define SDL_stack_alloc(type, count) (type*)SDL_malloc(sizeof(type)*(count)) |
438 | #define SDL_stack_free(data) SDL_free(data) |
439 | #endif |
440 | |
441 | extern DECLSPEC void *SDLCALL SDL_malloc(size_t size); |
442 | extern DECLSPEC void *SDLCALL SDL_calloc(size_t nmemb, size_t size); |
443 | extern DECLSPEC void *SDLCALL SDL_realloc(void *mem, size_t size); |
444 | extern DECLSPEC void SDLCALL SDL_free(void *mem); |
445 | |
446 | typedef void *(SDLCALL *SDL_malloc_func)(size_t size); |
447 | typedef void *(SDLCALL *SDL_calloc_func)(size_t nmemb, size_t size); |
448 | typedef void *(SDLCALL *SDL_realloc_func)(void *mem, size_t size); |
449 | typedef void (SDLCALL *SDL_free_func)(void *mem); |
450 | |
451 | /** |
452 | * Get the original set of SDL memory functions |
453 | * |
454 | * \since This function is available since SDL 2.24.0. |
455 | */ |
456 | extern DECLSPEC void SDLCALL SDL_GetOriginalMemoryFunctions(SDL_malloc_func *malloc_func, |
457 | SDL_calloc_func *calloc_func, |
458 | SDL_realloc_func *realloc_func, |
459 | SDL_free_func *free_func); |
460 | |
461 | /** |
462 | * Get the current set of SDL memory functions |
463 | * |
464 | * \since This function is available since SDL 2.0.7. |
465 | */ |
466 | extern DECLSPEC void SDLCALL SDL_GetMemoryFunctions(SDL_malloc_func *malloc_func, |
467 | SDL_calloc_func *calloc_func, |
468 | SDL_realloc_func *realloc_func, |
469 | SDL_free_func *free_func); |
470 | |
471 | /** |
472 | * Replace SDL's memory allocation functions with a custom set |
473 | * |
474 | * \since This function is available since SDL 2.0.7. |
475 | */ |
476 | extern DECLSPEC int SDLCALL SDL_SetMemoryFunctions(SDL_malloc_func malloc_func, |
477 | SDL_calloc_func calloc_func, |
478 | SDL_realloc_func realloc_func, |
479 | SDL_free_func free_func); |
480 | |
481 | /** |
482 | * Get the number of outstanding (unfreed) allocations |
483 | * |
484 | * \since This function is available since SDL 2.0.7. |
485 | */ |
486 | extern DECLSPEC int SDLCALL SDL_GetNumAllocations(void); |
487 | |
488 | extern DECLSPEC char *SDLCALL SDL_getenv(const char *name); |
489 | extern DECLSPEC int SDLCALL SDL_setenv(const char *name, const char *value, int overwrite); |
490 | |
491 | extern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, int (SDLCALL *compare) (const void *, const void *)); |
492 | extern DECLSPEC void * SDLCALL SDL_bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (SDLCALL *compare) (const void *, const void *)); |
493 | |
494 | extern DECLSPEC int SDLCALL SDL_abs(int x); |
495 | |
496 | /* NOTE: these double-evaluate their arguments, so you should never have side effects in the parameters */ |
497 | #define SDL_min(x, y) (((x) < (y)) ? (x) : (y)) |
498 | #define SDL_max(x, y) (((x) > (y)) ? (x) : (y)) |
499 | #define SDL_clamp(x, a, b) (((x) < (a)) ? (a) : (((x) > (b)) ? (b) : (x))) |
500 | |
501 | extern DECLSPEC int SDLCALL SDL_isalpha(int x); |
502 | extern DECLSPEC int SDLCALL SDL_isalnum(int x); |
503 | extern DECLSPEC int SDLCALL SDL_isblank(int x); |
504 | extern DECLSPEC int SDLCALL SDL_iscntrl(int x); |
505 | extern DECLSPEC int SDLCALL SDL_isdigit(int x); |
506 | extern DECLSPEC int SDLCALL SDL_isxdigit(int x); |
507 | extern DECLSPEC int SDLCALL SDL_ispunct(int x); |
508 | extern DECLSPEC int SDLCALL SDL_isspace(int x); |
509 | extern DECLSPEC int SDLCALL SDL_isupper(int x); |
510 | extern DECLSPEC int SDLCALL SDL_islower(int x); |
511 | extern DECLSPEC int SDLCALL SDL_isprint(int x); |
512 | extern DECLSPEC int SDLCALL SDL_isgraph(int x); |
513 | extern DECLSPEC int SDLCALL SDL_toupper(int x); |
514 | extern DECLSPEC int SDLCALL SDL_tolower(int x); |
515 | |
516 | extern DECLSPEC Uint16 SDLCALL SDL_crc16(Uint16 crc, const void *data, size_t len); |
517 | extern DECLSPEC Uint32 SDLCALL SDL_crc32(Uint32 crc, const void *data, size_t len); |
518 | |
519 | extern DECLSPEC void *SDLCALL SDL_memset(SDL_OUT_BYTECAP(len) void *dst, int c, size_t len); |
520 | |
521 | #define SDL_zero(x) SDL_memset(&(x), 0, sizeof((x))) |
522 | #define SDL_zerop(x) SDL_memset((x), 0, sizeof(*(x))) |
523 | #define SDL_zeroa(x) SDL_memset((x), 0, sizeof((x))) |
524 | |
525 | #define SDL_copyp(dst, src) \ |
526 | { SDL_COMPILE_TIME_ASSERT(SDL_copyp, sizeof (*(dst)) == sizeof (*(src))); } \ |
527 | SDL_memcpy((dst), (src), sizeof (*(src))) |
528 | |
529 | |
530 | /* Note that memset() is a byte assignment and this is a 32-bit assignment, so they're not directly equivalent. */ |
531 | SDL_FORCE_INLINE void SDL_memset4(void *dst, Uint32 val, size_t dwords) |
532 | { |
533 | #if defined(__GNUC__) && defined(__i386__) |
534 | int u0, u1, u2; |
535 | __asm__ __volatile__ ( |
536 | "cld \n\t" |
537 | "rep ; stosl \n\t" |
538 | : "=&D" (u0), "=&a" (u1), "=&c" (u2) |
539 | : "0" (dst), "1" (val), "2" (SDL_static_cast(Uint32, dwords)) |
540 | : "memory" |
541 | ); |
542 | #else |
543 | size_t _n = (dwords + 3) / 4; |
544 | Uint32 *_p = SDL_static_cast(Uint32 *, dst); |
545 | Uint32 _val = (val); |
546 | if (dwords == 0) { |
547 | return; |
548 | } |
549 | switch (dwords % 4) { |
550 | case 0: do { *_p++ = _val; SDL_FALLTHROUGH; |
551 | case 3: *_p++ = _val; SDL_FALLTHROUGH; |
552 | case 2: *_p++ = _val; SDL_FALLTHROUGH; |
553 | case 1: *_p++ = _val; |
554 | } while ( --_n ); |
555 | } |
556 | #endif |
557 | } |
558 | |
559 | extern DECLSPEC void *SDLCALL SDL_memcpy(SDL_OUT_BYTECAP(len) void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len); |
560 | |
561 | extern DECLSPEC void *SDLCALL SDL_memmove(SDL_OUT_BYTECAP(len) void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len); |
562 | extern DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_t len); |
563 | |
564 | extern DECLSPEC size_t SDLCALL SDL_wcslen(const wchar_t *wstr); |
565 | extern DECLSPEC size_t SDLCALL SDL_wcslcpy(SDL_OUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen); |
566 | extern DECLSPEC size_t SDLCALL SDL_wcslcat(SDL_INOUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen); |
567 | extern DECLSPEC wchar_t *SDLCALL SDL_wcsdup(const wchar_t *wstr); |
568 | extern DECLSPEC wchar_t *SDLCALL SDL_wcsstr(const wchar_t *haystack, const wchar_t *needle); |
569 | |
570 | extern DECLSPEC int SDLCALL SDL_wcscmp(const wchar_t *str1, const wchar_t *str2); |
571 | extern DECLSPEC int SDLCALL SDL_wcsncmp(const wchar_t *str1, const wchar_t *str2, size_t maxlen); |
572 | extern DECLSPEC int SDLCALL SDL_wcscasecmp(const wchar_t *str1, const wchar_t *str2); |
573 | extern DECLSPEC int SDLCALL SDL_wcsncasecmp(const wchar_t *str1, const wchar_t *str2, size_t len); |
574 | |
575 | extern DECLSPEC size_t SDLCALL SDL_strlen(const char *str); |
576 | extern DECLSPEC size_t SDLCALL SDL_strlcpy(SDL_OUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen); |
577 | extern DECLSPEC size_t SDLCALL SDL_utf8strlcpy(SDL_OUT_Z_CAP(dst_bytes) char *dst, const char *src, size_t dst_bytes); |
578 | extern DECLSPEC size_t SDLCALL SDL_strlcat(SDL_INOUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen); |
579 | extern DECLSPEC char *SDLCALL SDL_strdup(const char *str); |
580 | extern DECLSPEC char *SDLCALL SDL_strrev(char *str); |
581 | extern DECLSPEC char *SDLCALL SDL_strupr(char *str); |
582 | extern DECLSPEC char *SDLCALL SDL_strlwr(char *str); |
583 | extern DECLSPEC char *SDLCALL SDL_strchr(const char *str, int c); |
584 | extern DECLSPEC char *SDLCALL SDL_strrchr(const char *str, int c); |
585 | extern DECLSPEC char *SDLCALL SDL_strstr(const char *haystack, const char *needle); |
586 | extern DECLSPEC char *SDLCALL SDL_strcasestr(const char *haystack, const char *needle); |
587 | extern DECLSPEC char *SDLCALL SDL_strtokr(char *s1, const char *s2, char **saveptr); |
588 | extern DECLSPEC size_t SDLCALL SDL_utf8strlen(const char *str); |
589 | extern DECLSPEC size_t SDLCALL SDL_utf8strnlen(const char *str, size_t bytes); |
590 | |
591 | extern DECLSPEC char *SDLCALL SDL_itoa(int value, char *str, int radix); |
592 | extern DECLSPEC char *SDLCALL SDL_uitoa(unsigned int value, char *str, int radix); |
593 | extern DECLSPEC char *SDLCALL SDL_ltoa(long value, char *str, int radix); |
594 | extern DECLSPEC char *SDLCALL SDL_ultoa(unsigned long value, char *str, int radix); |
595 | extern DECLSPEC char *SDLCALL SDL_lltoa(Sint64 value, char *str, int radix); |
596 | extern DECLSPEC char *SDLCALL SDL_ulltoa(Uint64 value, char *str, int radix); |
597 | |
598 | extern DECLSPEC int SDLCALL SDL_atoi(const char *str); |
599 | extern DECLSPEC double SDLCALL SDL_atof(const char *str); |
600 | extern DECLSPEC long SDLCALL SDL_strtol(const char *str, char **endp, int base); |
601 | extern DECLSPEC unsigned long SDLCALL SDL_strtoul(const char *str, char **endp, int base); |
602 | extern DECLSPEC Sint64 SDLCALL SDL_strtoll(const char *str, char **endp, int base); |
603 | extern DECLSPEC Uint64 SDLCALL SDL_strtoull(const char *str, char **endp, int base); |
604 | extern DECLSPEC double SDLCALL SDL_strtod(const char *str, char **endp); |
605 | |
606 | extern DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2); |
607 | extern DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, size_t maxlen); |
608 | extern DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str2); |
609 | extern DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t len); |
610 | |
611 | extern DECLSPEC int SDLCALL SDL_sscanf(const char *text, SDL_SCANF_FORMAT_STRING const char *fmt, ...) SDL_SCANF_VARARG_FUNC(2); |
612 | extern DECLSPEC int SDLCALL SDL_vsscanf(const char *text, SDL_SCANF_FORMAT_STRING const char *fmt, va_list ap) SDL_SCANF_VARARG_FUNCV(2); |
613 | extern DECLSPEC int SDLCALL SDL_snprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, SDL_PRINTF_FORMAT_STRING const char *fmt, ... ) SDL_PRINTF_VARARG_FUNC(3); |
614 | extern DECLSPEC int SDLCALL SDL_vsnprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, SDL_PRINTF_FORMAT_STRING const char *fmt, va_list ap) SDL_PRINTF_VARARG_FUNCV(3); |
615 | extern DECLSPEC int SDLCALL SDL_asprintf(char **strp, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); |
616 | extern DECLSPEC int SDLCALL SDL_vasprintf(char **strp, SDL_PRINTF_FORMAT_STRING const char *fmt, va_list ap) SDL_PRINTF_VARARG_FUNCV(2); |
617 | |
618 | #ifndef HAVE_M_PI |
619 | #ifndef M_PI |
620 | #define M_PI 3.14159265358979323846264338327950288 /**< pi */ |
621 | #endif |
622 | #endif |
623 | |
624 | /** |
625 | * Use this function to compute arc cosine of `x`. |
626 | * |
627 | * The definition of `y = acos(x)` is `x = cos(y)`. |
628 | * |
629 | * Domain: `-1 <= x <= 1` |
630 | * |
631 | * Range: `0 <= y <= Pi` |
632 | * |
633 | * \param x floating point value, in radians. |
634 | * \returns arc cosine of `x`. |
635 | * |
636 | * \since This function is available since SDL 2.0.2. |
637 | */ |
638 | extern DECLSPEC double SDLCALL SDL_acos(double x); |
639 | extern DECLSPEC float SDLCALL SDL_acosf(float x); |
640 | extern DECLSPEC double SDLCALL SDL_asin(double x); |
641 | extern DECLSPEC float SDLCALL SDL_asinf(float x); |
642 | extern DECLSPEC double SDLCALL SDL_atan(double x); |
643 | extern DECLSPEC float SDLCALL SDL_atanf(float x); |
644 | extern DECLSPEC double SDLCALL SDL_atan2(double y, double x); |
645 | extern DECLSPEC float SDLCALL SDL_atan2f(float y, float x); |
646 | extern DECLSPEC double SDLCALL SDL_ceil(double x); |
647 | extern DECLSPEC float SDLCALL SDL_ceilf(float x); |
648 | extern DECLSPEC double SDLCALL SDL_copysign(double x, double y); |
649 | extern DECLSPEC float SDLCALL SDL_copysignf(float x, float y); |
650 | extern DECLSPEC double SDLCALL SDL_cos(double x); |
651 | extern DECLSPEC float SDLCALL SDL_cosf(float x); |
652 | extern DECLSPEC double SDLCALL SDL_exp(double x); |
653 | extern DECLSPEC float SDLCALL SDL_expf(float x); |
654 | extern DECLSPEC double SDLCALL SDL_fabs(double x); |
655 | extern DECLSPEC float SDLCALL SDL_fabsf(float x); |
656 | extern DECLSPEC double SDLCALL SDL_floor(double x); |
657 | extern DECLSPEC float SDLCALL SDL_floorf(float x); |
658 | extern DECLSPEC double SDLCALL SDL_trunc(double x); |
659 | extern DECLSPEC float SDLCALL SDL_truncf(float x); |
660 | extern DECLSPEC double SDLCALL SDL_fmod(double x, double y); |
661 | extern DECLSPEC float SDLCALL SDL_fmodf(float x, float y); |
662 | extern DECLSPEC double SDLCALL SDL_log(double x); |
663 | extern DECLSPEC float SDLCALL SDL_logf(float x); |
664 | extern DECLSPEC double SDLCALL SDL_log10(double x); |
665 | extern DECLSPEC float SDLCALL SDL_log10f(float x); |
666 | extern DECLSPEC double SDLCALL SDL_pow(double x, double y); |
667 | extern DECLSPEC float SDLCALL SDL_powf(float x, float y); |
668 | extern DECLSPEC double SDLCALL SDL_round(double x); |
669 | extern DECLSPEC float SDLCALL SDL_roundf(float x); |
670 | extern DECLSPEC long SDLCALL SDL_lround(double x); |
671 | extern DECLSPEC long SDLCALL SDL_lroundf(float x); |
672 | extern DECLSPEC double SDLCALL SDL_scalbn(double x, int n); |
673 | extern DECLSPEC float SDLCALL SDL_scalbnf(float x, int n); |
674 | extern DECLSPEC double SDLCALL SDL_sin(double x); |
675 | extern DECLSPEC float SDLCALL SDL_sinf(float x); |
676 | extern DECLSPEC double SDLCALL SDL_sqrt(double x); |
677 | extern DECLSPEC float SDLCALL SDL_sqrtf(float x); |
678 | extern DECLSPEC double SDLCALL SDL_tan(double x); |
679 | extern DECLSPEC float SDLCALL SDL_tanf(float x); |
680 | |
681 | /* The SDL implementation of iconv() returns these error codes */ |
682 | #define SDL_ICONV_ERROR (size_t)-1 |
683 | #define SDL_ICONV_E2BIG (size_t)-2 |
684 | #define SDL_ICONV_EILSEQ (size_t)-3 |
685 | #define SDL_ICONV_EINVAL (size_t)-4 |
686 | |
687 | /* SDL_iconv_* are now always real symbols/types, not macros or inlined. */ |
688 | typedef struct _SDL_iconv_t *SDL_iconv_t; |
689 | extern DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode, |
690 | const char *fromcode); |
691 | extern DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd); |
692 | extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, |
693 | size_t * inbytesleft, char **outbuf, |
694 | size_t * outbytesleft); |
695 | |
696 | /** |
697 | * This function converts a buffer or string between encodings in one pass, |
698 | * returning a string that must be freed with SDL_free() or NULL on error. |
699 | * |
700 | * \since This function is available since SDL 2.0.0. |
701 | */ |
702 | extern DECLSPEC char *SDLCALL SDL_iconv_string(const char *tocode, |
703 | const char *fromcode, |
704 | const char *inbuf, |
705 | size_t inbytesleft); |
706 | #define SDL_iconv_utf8_locale(S) SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1) |
707 | #define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2", "UTF-8", S, SDL_strlen(S)+1) |
708 | #define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4", "UTF-8", S, SDL_strlen(S)+1) |
709 | #define SDL_iconv_wchar_utf8(S) SDL_iconv_string("UTF-8", "WCHAR_T", (char *)S, (SDL_wcslen(S)+1)*sizeof(wchar_t)) |
710 | |
711 | /* force builds using Clang's static analysis tools to use literal C runtime |
712 | here, since there are possibly tests that are ineffective otherwise. */ |
713 | #if defined(__clang_analyzer__) && !defined(SDL_DISABLE_ANALYZE_MACROS) |
714 | |
715 | /* The analyzer knows about strlcpy even when the system doesn't provide it */ |
716 | #ifndef HAVE_STRLCPY |
717 | size_t strlcpy(char* dst, const char* src, size_t size); |
718 | #endif |
719 | |
720 | /* The analyzer knows about strlcat even when the system doesn't provide it */ |
721 | #ifndef HAVE_STRLCAT |
722 | size_t strlcat(char* dst, const char* src, size_t size); |
723 | #endif |
724 | |
725 | #ifndef HAVE_WCSLCPY |
726 | size_t wcslcpy(wchar_t *dst, const wchar_t *src, size_t size); |
727 | #endif |
728 | |
729 | #ifndef HAVE_WCSLCAT |
730 | size_t wcslcat(wchar_t *dst, const wchar_t *src, size_t size); |
731 | #endif |
732 | |
733 | /* Starting LLVM 16, the analyser errors out if these functions do not have |
734 | their prototype defined (clang-diagnostic-implicit-function-declaration) */ |
735 | #include <stdlib.h> |
736 | #include <string.h> |
737 | #include <stdio.h> |
738 | |
739 | #define SDL_malloc malloc |
740 | #define SDL_calloc calloc |
741 | #define SDL_realloc realloc |
742 | #define SDL_free free |
743 | #define SDL_memset memset |
744 | #define SDL_memcpy memcpy |
745 | #define SDL_memmove memmove |
746 | #define SDL_memcmp memcmp |
747 | #define SDL_strlcpy strlcpy |
748 | #define SDL_strlcat strlcat |
749 | #define SDL_strlen strlen |
750 | #define SDL_wcslen wcslen |
751 | #define SDL_wcslcpy wcslcpy |
752 | #define SDL_wcslcat wcslcat |
753 | #define SDL_strdup strdup |
754 | #define SDL_wcsdup wcsdup |
755 | #define SDL_strchr strchr |
756 | #define SDL_strrchr strrchr |
757 | #define SDL_strstr strstr |
758 | #define SDL_wcsstr wcsstr |
759 | #define SDL_strtokr strtok_r |
760 | #define SDL_strcmp strcmp |
761 | #define SDL_wcscmp wcscmp |
762 | #define SDL_strncmp strncmp |
763 | #define SDL_wcsncmp wcsncmp |
764 | #define SDL_strcasecmp strcasecmp |
765 | #define SDL_strncasecmp strncasecmp |
766 | #define SDL_sscanf sscanf |
767 | #define SDL_vsscanf vsscanf |
768 | #define SDL_snprintf snprintf |
769 | #define SDL_vsnprintf vsnprintf |
770 | #endif |
771 | |
772 | SDL_FORCE_INLINE void *SDL_memcpy4(SDL_OUT_BYTECAP(dwords*4) void *dst, SDL_IN_BYTECAP(dwords*4) const void *src, size_t dwords) |
773 | { |
774 | return SDL_memcpy(dst, src, len: dwords * 4); |
775 | } |
776 | |
777 | /** |
778 | * If a * b would overflow, return -1. Otherwise store a * b via ret |
779 | * and return 0. |
780 | * |
781 | * \since This function is available since SDL 2.24.0. |
782 | */ |
783 | SDL_FORCE_INLINE int SDL_size_mul_overflow (size_t a, |
784 | size_t b, |
785 | size_t *ret) |
786 | { |
787 | if (a != 0 && b > SDL_SIZE_MAX / a) { |
788 | return -1; |
789 | } |
790 | *ret = a * b; |
791 | return 0; |
792 | } |
793 | |
794 | #if _SDL_HAS_BUILTIN(__builtin_mul_overflow) |
795 | /* This needs to be wrapped in an inline rather than being a direct #define, |
796 | * because __builtin_mul_overflow() is type-generic, but we want to be |
797 | * consistent about interpreting a and b as size_t. */ |
798 | SDL_FORCE_INLINE int _SDL_size_mul_overflow_builtin (size_t a, |
799 | size_t b, |
800 | size_t *ret) |
801 | { |
802 | return __builtin_mul_overflow(a, b, ret) == 0 ? 0 : -1; |
803 | } |
804 | #define SDL_size_mul_overflow(a, b, ret) (_SDL_size_mul_overflow_builtin(a, b, ret)) |
805 | #endif |
806 | |
807 | /** |
808 | * If a + b would overflow, return -1. Otherwise store a + b via ret |
809 | * and return 0. |
810 | * |
811 | * \since This function is available since SDL 2.24.0. |
812 | */ |
813 | SDL_FORCE_INLINE int SDL_size_add_overflow (size_t a, |
814 | size_t b, |
815 | size_t *ret) |
816 | { |
817 | if (b > SDL_SIZE_MAX - a) { |
818 | return -1; |
819 | } |
820 | *ret = a + b; |
821 | return 0; |
822 | } |
823 | |
824 | #if _SDL_HAS_BUILTIN(__builtin_add_overflow) |
825 | /* This needs to be wrapped in an inline rather than being a direct #define, |
826 | * the same as the call to __builtin_mul_overflow() above. */ |
827 | SDL_FORCE_INLINE int _SDL_size_add_overflow_builtin (size_t a, |
828 | size_t b, |
829 | size_t *ret) |
830 | { |
831 | return __builtin_add_overflow(a, b, ret) == 0 ? 0 : -1; |
832 | } |
833 | #define SDL_size_add_overflow(a, b, ret) (_SDL_size_add_overflow_builtin(a, b, ret)) |
834 | #endif |
835 | |
836 | /* Ends C function definitions when using C++ */ |
837 | #ifdef __cplusplus |
838 | } |
839 | #endif |
840 | #include "close_code.h" |
841 | |
842 | #endif /* SDL_stdinc_h_ */ |
843 | |
844 | /* vi: set ts=4 sw=4 expandtab: */ |
845 | |