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