include/SDL_stdinc.h
author Sam Lantinga <slouken@libsdl.org>
Thu, 12 Oct 2017 13:44:28 -0700
changeset 11610 6dea196ecbcb
parent 11459 a09ca9e8938c
child 11618 bbbc6db5a2b3
permissions -rw-r--r--
Added functions to query and set the SDL memory allocation functions:
SDL_GetMemoryFunctions()
SDL_SetMemoryFunctions()
SDL_GetNumAllocations()
     1 /*
     2   Simple DirectMedia Layer
     3   Copyright (C) 1997-2017 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(__WINRT__)
    78 /* Defining _USE_MATH_DEFINES is required to get M_PI to be defined on
    79    WinRT.  See http://msdn.microsoft.com/en-us/library/4hwaceh6.aspx
    80    for more information.
    81 */
    82 #  define _USE_MATH_DEFINES
    83 # endif
    84 # include <math.h>
    85 #endif
    86 #ifdef HAVE_FLOAT_H
    87 # include <float.h>
    88 #endif
    89 
    90 /**
    91  *  The number of elements in an array.
    92  */
    93 #define SDL_arraysize(array)    (sizeof(array)/sizeof(array[0]))
    94 #define SDL_TABLESIZE(table)    SDL_arraysize(table)
    95 
    96 /**
    97  *  Macro useful for building other macros with strings in them
    98  *
    99  *  e.g. #define LOG_ERROR(X) OutputDebugString(SDL_STRINGIFY_ARG(__FUNCTION__) ": " X "\n")
   100  */
   101 #define SDL_STRINGIFY_ARG(arg)  #arg
   102 
   103 /**
   104  *  \name Cast operators
   105  *
   106  *  Use proper C++ casts when compiled as C++ to be compatible with the option
   107  *  -Wold-style-cast of GCC (and -Werror=old-style-cast in GCC 4.2 and above).
   108  */
   109 /* @{ */
   110 #ifdef __cplusplus
   111 #define SDL_reinterpret_cast(type, expression) reinterpret_cast<type>(expression)
   112 #define SDL_static_cast(type, expression) static_cast<type>(expression)
   113 #define SDL_const_cast(type, expression) const_cast<type>(expression)
   114 #else
   115 #define SDL_reinterpret_cast(type, expression) ((type)(expression))
   116 #define SDL_static_cast(type, expression) ((type)(expression))
   117 #define SDL_const_cast(type, expression) ((type)(expression))
   118 #endif
   119 /* @} *//* Cast operators */
   120 
   121 /* Define a four character code as a Uint32 */
   122 #define SDL_FOURCC(A, B, C, D) \
   123     ((SDL_static_cast(Uint32, SDL_static_cast(Uint8, (A))) << 0) | \
   124      (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (B))) << 8) | \
   125      (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (C))) << 16) | \
   126      (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (D))) << 24))
   127 
   128 /**
   129  *  \name Basic data types
   130  */
   131 /* @{ */
   132 
   133 #ifdef __CC_ARM
   134 /* ARM's compiler throws warnings if we use an enum: like "SDL_bool x = a < b;" */
   135 #define SDL_FALSE 0
   136 #define SDL_TRUE 1
   137 typedef int SDL_bool;
   138 #else
   139 typedef enum
   140 {
   141     SDL_FALSE = 0,
   142     SDL_TRUE = 1
   143 } SDL_bool;
   144 #endif
   145 
   146 /**
   147  * \brief A signed 8-bit integer type.
   148  */
   149 typedef int8_t Sint8;
   150 /**
   151  * \brief An unsigned 8-bit integer type.
   152  */
   153 typedef uint8_t Uint8;
   154 /**
   155  * \brief A signed 16-bit integer type.
   156  */
   157 typedef int16_t Sint16;
   158 /**
   159  * \brief An unsigned 16-bit integer type.
   160  */
   161 typedef uint16_t Uint16;
   162 /**
   163  * \brief A signed 32-bit integer type.
   164  */
   165 typedef int32_t Sint32;
   166 /**
   167  * \brief An unsigned 32-bit integer type.
   168  */
   169 typedef uint32_t Uint32;
   170 
   171 /**
   172  * \brief A signed 64-bit integer type.
   173  */
   174 typedef int64_t Sint64;
   175 /**
   176  * \brief An unsigned 64-bit integer type.
   177  */
   178 typedef uint64_t Uint64;
   179 
   180 /* @} *//* Basic data types */
   181 
   182 /* Make sure we have macros for printing 64 bit values.
   183  * <stdint.h> should define these but this is not true all platforms.
   184  * (for example win32) */
   185 #ifndef SDL_PRIs64
   186 #ifdef PRIs64
   187 #define SDL_PRIs64 PRIs64
   188 #elif defined(__WIN32__)
   189 #define SDL_PRIs64 "I64d"
   190 #elif defined(__LINUX__) && defined(__LP64__)
   191 #define SDL_PRIs64 "ld"
   192 #else
   193 #define SDL_PRIs64 "lld"
   194 #endif
   195 #endif
   196 #ifndef SDL_PRIu64
   197 #ifdef PRIu64
   198 #define SDL_PRIu64 PRIu64
   199 #elif defined(__WIN32__)
   200 #define SDL_PRIu64 "I64u"
   201 #elif defined(__LINUX__) && defined(__LP64__)
   202 #define SDL_PRIu64 "lu"
   203 #else
   204 #define SDL_PRIu64 "llu"
   205 #endif
   206 #endif
   207 #ifndef SDL_PRIx64
   208 #ifdef PRIx64
   209 #define SDL_PRIx64 PRIx64
   210 #elif defined(__WIN32__)
   211 #define SDL_PRIx64 "I64x"
   212 #elif defined(__LINUX__) && defined(__LP64__)
   213 #define SDL_PRIx64 "lx"
   214 #else
   215 #define SDL_PRIx64 "llx"
   216 #endif
   217 #endif
   218 #ifndef SDL_PRIX64
   219 #ifdef PRIX64
   220 #define SDL_PRIX64 PRIX64
   221 #elif defined(__WIN32__)
   222 #define SDL_PRIX64 "I64X"
   223 #elif defined(__LINUX__) && defined(__LP64__)
   224 #define SDL_PRIX64 "lX"
   225 #else
   226 #define SDL_PRIX64 "llX"
   227 #endif
   228 #endif
   229 
   230 /* Annotations to help code analysis tools */
   231 #ifdef SDL_DISABLE_ANALYZE_MACROS
   232 #define SDL_IN_BYTECAP(x)
   233 #define SDL_INOUT_Z_CAP(x)
   234 #define SDL_OUT_Z_CAP(x)
   235 #define SDL_OUT_CAP(x)
   236 #define SDL_OUT_BYTECAP(x)
   237 #define SDL_OUT_Z_BYTECAP(x)
   238 #define SDL_PRINTF_FORMAT_STRING
   239 #define SDL_SCANF_FORMAT_STRING
   240 #define SDL_PRINTF_VARARG_FUNC( fmtargnumber )
   241 #define SDL_SCANF_VARARG_FUNC( fmtargnumber )
   242 #else
   243 #if defined(_MSC_VER) && (_MSC_VER >= 1600) /* VS 2010 and above */
   244 #include <sal.h>
   245 
   246 #define SDL_IN_BYTECAP(x) _In_bytecount_(x)
   247 #define SDL_INOUT_Z_CAP(x) _Inout_z_cap_(x)
   248 #define SDL_OUT_Z_CAP(x) _Out_z_cap_(x)
   249 #define SDL_OUT_CAP(x) _Out_cap_(x)
   250 #define SDL_OUT_BYTECAP(x) _Out_bytecap_(x)
   251 #define SDL_OUT_Z_BYTECAP(x) _Out_z_bytecap_(x)
   252 
   253 #define SDL_PRINTF_FORMAT_STRING _Printf_format_string_
   254 #define SDL_SCANF_FORMAT_STRING _Scanf_format_string_impl_
   255 #else
   256 #define SDL_IN_BYTECAP(x)
   257 #define SDL_INOUT_Z_CAP(x)
   258 #define SDL_OUT_Z_CAP(x)
   259 #define SDL_OUT_CAP(x)
   260 #define SDL_OUT_BYTECAP(x)
   261 #define SDL_OUT_Z_BYTECAP(x)
   262 #define SDL_PRINTF_FORMAT_STRING
   263 #define SDL_SCANF_FORMAT_STRING
   264 #endif
   265 #if defined(__GNUC__)
   266 #define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __printf__, fmtargnumber, fmtargnumber+1 )))
   267 #define SDL_SCANF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __scanf__, fmtargnumber, fmtargnumber+1 )))
   268 #else
   269 #define SDL_PRINTF_VARARG_FUNC( fmtargnumber )
   270 #define SDL_SCANF_VARARG_FUNC( fmtargnumber )
   271 #endif
   272 #endif /* SDL_DISABLE_ANALYZE_MACROS */
   273 
   274 #define SDL_COMPILE_TIME_ASSERT(name, x)               \
   275        typedef int SDL_compile_time_assert_ ## name[(x) * 2 - 1]
   276 /** \cond */
   277 #ifndef DOXYGEN_SHOULD_IGNORE_THIS
   278 SDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1);
   279 SDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1);
   280 SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2);
   281 SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2);
   282 SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4);
   283 SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4);
   284 SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8);
   285 SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8);
   286 #endif /* DOXYGEN_SHOULD_IGNORE_THIS */
   287 /** \endcond */
   288 
   289 /* Check to make sure enums are the size of ints, for structure packing.
   290    For both Watcom C/C++ and Borland C/C++ the compiler option that makes
   291    enums having the size of an int must be enabled.
   292    This is "-b" for Borland C/C++ and "-ei" for Watcom C/C++ (v11).
   293 */
   294 
   295 /** \cond */
   296 #ifndef DOXYGEN_SHOULD_IGNORE_THIS
   297 #if !defined(__ANDROID__)
   298    /* TODO: include/SDL_stdinc.h:174: error: size of array 'SDL_dummy_enum' is negative */
   299 typedef enum
   300 {
   301     DUMMY_ENUM_VALUE
   302 } SDL_DUMMY_ENUM;
   303 
   304 SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int));
   305 #endif
   306 #endif /* DOXYGEN_SHOULD_IGNORE_THIS */
   307 /** \endcond */
   308 
   309 #include "begin_code.h"
   310 /* Set up for C function definitions, even when using C++ */
   311 #ifdef __cplusplus
   312 extern "C" {
   313 #endif
   314 
   315 #if defined(HAVE_ALLOCA) && !defined(alloca)
   316 # if defined(HAVE_ALLOCA_H)
   317 #  include <alloca.h>
   318 # elif defined(__GNUC__)
   319 #  define alloca __builtin_alloca
   320 # elif defined(_MSC_VER)
   321 #  include <malloc.h>
   322 #  define alloca _alloca
   323 # elif defined(__WATCOMC__)
   324 #  include <malloc.h>
   325 # elif defined(__BORLANDC__)
   326 #  include <malloc.h>
   327 # elif defined(__DMC__)
   328 #  include <stdlib.h>
   329 # elif defined(__AIX__)
   330 #pragma alloca
   331 # elif defined(__MRC__)
   332 void *alloca(unsigned);
   333 # else
   334 char *alloca();
   335 # endif
   336 #endif
   337 #ifdef HAVE_ALLOCA
   338 #define SDL_stack_alloc(type, count)    (type*)alloca(sizeof(type)*(count))
   339 #define SDL_stack_free(data)
   340 #else
   341 #define SDL_stack_alloc(type, count)    (type*)SDL_malloc(sizeof(type)*(count))
   342 #define SDL_stack_free(data)            SDL_free(data)
   343 #endif
   344 
   345 extern DECLSPEC void *SDLCALL SDL_malloc(size_t size);
   346 extern DECLSPEC void *SDLCALL SDL_calloc(size_t nmemb, size_t size);
   347 extern DECLSPEC void *SDLCALL SDL_realloc(void *mem, size_t size);
   348 extern DECLSPEC void SDLCALL SDL_free(void *mem);
   349 
   350 typedef void *(SDLCALL *SDL_malloc_func)(size_t size);
   351 typedef void *(SDLCALL *SDL_calloc_func)(size_t nmemb, size_t size);
   352 typedef void *(SDLCALL *SDL_realloc_func)(void *mem, size_t size);
   353 typedef void (SDLCALL *SDL_free_func)(void *mem);
   354 
   355 /**
   356  *  \brief Get the current set of SDL memory functions
   357  */
   358 extern DECLSPEC void SDLCALL SDL_GetMemoryFunctions(SDL_malloc_func *malloc_func,
   359                                                     SDL_calloc_func *calloc_func,
   360                                                     SDL_realloc_func *realloc_func,
   361                                                     SDL_free_func *free_func);
   362 
   363 /**
   364  *  \brief Replace SDL's memory allocation functions with a custom set
   365  *
   366  *  \note If you are replacing SDL's memory functions, you should call
   367  *        SDL_GetNumAllocations() and be very careful if it returns non-zero.
   368  *        That means that your free function will be called with memory
   369  *        allocated by the previous memory allocation functions.
   370  */
   371 extern DECLSPEC int SDLCALL SDL_SetMemoryFunctions(SDL_malloc_func malloc_func,
   372                                                    SDL_calloc_func calloc_func,
   373                                                    SDL_realloc_func realloc_func,
   374                                                    SDL_free_func free_func);
   375 
   376 /**
   377  *  \brief Get the number of outstanding (unfreed) allocations
   378  */
   379 extern DECLSPEC int SDLCALL SDL_GetNumAllocations();
   380 
   381 extern DECLSPEC char *SDLCALL SDL_getenv(const char *name);
   382 extern DECLSPEC int SDLCALL SDL_setenv(const char *name, const char *value, int overwrite);
   383 
   384 extern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, int (*compare) (const void *, const void *));
   385 
   386 extern DECLSPEC int SDLCALL SDL_abs(int x);
   387 
   388 /* !!! FIXME: these have side effects. You probably shouldn't use them. */
   389 /* !!! FIXME: Maybe we do forceinline functions of SDL_mini, SDL_minf, etc? */
   390 #define SDL_min(x, y) (((x) < (y)) ? (x) : (y))
   391 #define SDL_max(x, y) (((x) > (y)) ? (x) : (y))
   392 
   393 extern DECLSPEC int SDLCALL SDL_isdigit(int x);
   394 extern DECLSPEC int SDLCALL SDL_isspace(int x);
   395 extern DECLSPEC int SDLCALL SDL_toupper(int x);
   396 extern DECLSPEC int SDLCALL SDL_tolower(int x);
   397 
   398 extern DECLSPEC void *SDLCALL SDL_memset(SDL_OUT_BYTECAP(len) void *dst, int c, size_t len);
   399 
   400 #define SDL_zero(x) SDL_memset(&(x), 0, sizeof((x)))
   401 #define SDL_zerop(x) SDL_memset((x), 0, sizeof(*(x)))
   402 
   403 /* Note that memset() is a byte assignment and this is a 32-bit assignment, so they're not directly equivalent. */
   404 SDL_FORCE_INLINE void SDL_memset4(void *dst, Uint32 val, size_t dwords)
   405 {
   406 #if defined(__GNUC__) && defined(i386)
   407     int u0, u1, u2;
   408     __asm__ __volatile__ (
   409         "cld \n\t"
   410         "rep ; stosl \n\t"
   411         : "=&D" (u0), "=&a" (u1), "=&c" (u2)
   412         : "0" (dst), "1" (val), "2" (SDL_static_cast(Uint32, dwords))
   413         : "memory"
   414     );
   415 #else
   416     size_t _n = (dwords + 3) / 4;
   417     Uint32 *_p = SDL_static_cast(Uint32 *, dst);
   418     Uint32 _val = (val);
   419     if (dwords == 0)
   420         return;
   421     switch (dwords % 4)
   422     {
   423         case 0: do {    *_p++ = _val;   /* fallthrough */
   424         case 3:         *_p++ = _val;   /* fallthrough */
   425         case 2:         *_p++ = _val;   /* fallthrough */
   426         case 1:         *_p++ = _val;   /* fallthrough */
   427         } while ( --_n );
   428     }
   429 #endif
   430 }
   431 
   432 
   433 extern DECLSPEC void *SDLCALL SDL_memcpy(SDL_OUT_BYTECAP(len) void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len);
   434 
   435 extern DECLSPEC void *SDLCALL SDL_memmove(SDL_OUT_BYTECAP(len) void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len);
   436 extern DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_t len);
   437 
   438 extern DECLSPEC size_t SDLCALL SDL_wcslen(const wchar_t *wstr);
   439 extern DECLSPEC size_t SDLCALL SDL_wcslcpy(SDL_OUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen);
   440 extern DECLSPEC size_t SDLCALL SDL_wcslcat(SDL_INOUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen);
   441 extern DECLSPEC int SDLCALL SDL_wcscmp(const wchar_t *str1, const wchar_t *str2);
   442 
   443 extern DECLSPEC size_t SDLCALL SDL_strlen(const char *str);
   444 extern DECLSPEC size_t SDLCALL SDL_strlcpy(SDL_OUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen);
   445 extern DECLSPEC size_t SDLCALL SDL_utf8strlcpy(SDL_OUT_Z_CAP(dst_bytes) char *dst, const char *src, size_t dst_bytes);
   446 extern DECLSPEC size_t SDLCALL SDL_strlcat(SDL_INOUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen);
   447 extern DECLSPEC char *SDLCALL SDL_strdup(const char *str);
   448 extern DECLSPEC char *SDLCALL SDL_strrev(char *str);
   449 extern DECLSPEC char *SDLCALL SDL_strupr(char *str);
   450 extern DECLSPEC char *SDLCALL SDL_strlwr(char *str);
   451 extern DECLSPEC char *SDLCALL SDL_strchr(const char *str, int c);
   452 extern DECLSPEC char *SDLCALL SDL_strrchr(const char *str, int c);
   453 extern DECLSPEC char *SDLCALL SDL_strstr(const char *haystack, const char *needle);
   454 extern DECLSPEC size_t SDLCALL SDL_utf8strlen(const char *str);
   455 
   456 extern DECLSPEC char *SDLCALL SDL_itoa(int value, char *str, int radix);
   457 extern DECLSPEC char *SDLCALL SDL_uitoa(unsigned int value, char *str, int radix);
   458 extern DECLSPEC char *SDLCALL SDL_ltoa(long value, char *str, int radix);
   459 extern DECLSPEC char *SDLCALL SDL_ultoa(unsigned long value, char *str, int radix);
   460 extern DECLSPEC char *SDLCALL SDL_lltoa(Sint64 value, char *str, int radix);
   461 extern DECLSPEC char *SDLCALL SDL_ulltoa(Uint64 value, char *str, int radix);
   462 
   463 extern DECLSPEC int SDLCALL SDL_atoi(const char *str);
   464 extern DECLSPEC double SDLCALL SDL_atof(const char *str);
   465 extern DECLSPEC long SDLCALL SDL_strtol(const char *str, char **endp, int base);
   466 extern DECLSPEC unsigned long SDLCALL SDL_strtoul(const char *str, char **endp, int base);
   467 extern DECLSPEC Sint64 SDLCALL SDL_strtoll(const char *str, char **endp, int base);
   468 extern DECLSPEC Uint64 SDLCALL SDL_strtoull(const char *str, char **endp, int base);
   469 extern DECLSPEC double SDLCALL SDL_strtod(const char *str, char **endp);
   470 
   471 extern DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2);
   472 extern DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, size_t maxlen);
   473 extern DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str2);
   474 extern DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t len);
   475 
   476 extern DECLSPEC int SDLCALL SDL_sscanf(const char *text, SDL_SCANF_FORMAT_STRING const char *fmt, ...) SDL_SCANF_VARARG_FUNC(2);
   477 extern DECLSPEC int SDLCALL SDL_vsscanf(const char *text, const char *fmt, va_list ap);
   478 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);
   479 extern DECLSPEC int SDLCALL SDL_vsnprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, const char *fmt, va_list ap);
   480 
   481 #ifndef HAVE_M_PI
   482 #ifndef M_PI
   483 #define M_PI    3.14159265358979323846264338327950288   /**< pi */
   484 #endif
   485 #endif
   486 
   487 extern DECLSPEC double SDLCALL SDL_acos(double x);
   488 extern DECLSPEC double SDLCALL SDL_asin(double x);
   489 extern DECLSPEC double SDLCALL SDL_atan(double x);
   490 extern DECLSPEC double SDLCALL SDL_atan2(double x, double y);
   491 extern DECLSPEC double SDLCALL SDL_ceil(double x);
   492 extern DECLSPEC double SDLCALL SDL_copysign(double x, double y);
   493 extern DECLSPEC double SDLCALL SDL_cos(double x);
   494 extern DECLSPEC float SDLCALL SDL_cosf(float x);
   495 extern DECLSPEC double SDLCALL SDL_fabs(double x);
   496 extern DECLSPEC double SDLCALL SDL_floor(double x);
   497 extern DECLSPEC double SDLCALL SDL_log(double x);
   498 extern DECLSPEC double SDLCALL SDL_pow(double x, double y);
   499 extern DECLSPEC double SDLCALL SDL_scalbn(double x, int n);
   500 extern DECLSPEC double SDLCALL SDL_sin(double x);
   501 extern DECLSPEC float SDLCALL SDL_sinf(float x);
   502 extern DECLSPEC double SDLCALL SDL_sqrt(double x);
   503 extern DECLSPEC float SDLCALL SDL_sqrtf(float x);
   504 extern DECLSPEC double SDLCALL SDL_tan(double x);
   505 extern DECLSPEC float SDLCALL SDL_tanf(float x);
   506 
   507 /* The SDL implementation of iconv() returns these error codes */
   508 #define SDL_ICONV_ERROR     (size_t)-1
   509 #define SDL_ICONV_E2BIG     (size_t)-2
   510 #define SDL_ICONV_EILSEQ    (size_t)-3
   511 #define SDL_ICONV_EINVAL    (size_t)-4
   512 
   513 /* SDL_iconv_* are now always real symbols/types, not macros or inlined. */
   514 typedef struct _SDL_iconv_t *SDL_iconv_t;
   515 extern DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode,
   516                                                    const char *fromcode);
   517 extern DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd);
   518 extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf,
   519                                          size_t * inbytesleft, char **outbuf,
   520                                          size_t * outbytesleft);
   521 /**
   522  *  This function converts a string between encodings in one pass, returning a
   523  *  string that must be freed with SDL_free() or NULL on error.
   524  */
   525 extern DECLSPEC char *SDLCALL SDL_iconv_string(const char *tocode,
   526                                                const char *fromcode,
   527                                                const char *inbuf,
   528                                                size_t inbytesleft);
   529 #define SDL_iconv_utf8_locale(S)    SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1)
   530 #define SDL_iconv_utf8_ucs2(S)      (Uint16 *)SDL_iconv_string("UCS-2-INTERNAL", "UTF-8", S, SDL_strlen(S)+1)
   531 #define SDL_iconv_utf8_ucs4(S)      (Uint32 *)SDL_iconv_string("UCS-4-INTERNAL", "UTF-8", S, SDL_strlen(S)+1)
   532 
   533 /* force builds using Clang's static analysis tools to use literal C runtime
   534    here, since there are possibly tests that are ineffective otherwise. */
   535 #if defined(__clang_analyzer__) && !defined(SDL_DISABLE_ANALYZE_MACROS)
   536 #define SDL_malloc malloc
   537 #define SDL_calloc calloc
   538 #define SDL_realloc realloc
   539 #define SDL_free free
   540 #define SDL_memset memset
   541 #define SDL_memcpy memcpy
   542 #define SDL_memmove memmove
   543 #define SDL_memcmp memcmp
   544 #define SDL_strlen strlen
   545 #define SDL_strlcpy strlcpy
   546 #define SDL_strlcat strlcat
   547 #define SDL_strdup strdup
   548 #define SDL_strchr strchr
   549 #define SDL_strrchr strrchr
   550 #define SDL_strstr strstr
   551 #define SDL_strcmp strcmp
   552 #define SDL_strncmp strncmp
   553 #define SDL_strcasecmp strcasecmp
   554 #define SDL_strncasecmp strncasecmp
   555 #define SDL_sscanf sscanf
   556 #define SDL_vsscanf vsscanf
   557 #define SDL_snprintf snprintf
   558 #define SDL_vsnprintf vsnprintf
   559 #endif
   560 
   561 SDL_FORCE_INLINE void *SDL_memcpy4(SDL_OUT_BYTECAP(dwords*4) void *dst, SDL_IN_BYTECAP(dwords*4) const void *src, size_t dwords)
   562 {
   563     return SDL_memcpy(dst, src, dwords * 4);
   564 }
   565 
   566 /* Ends C function definitions when using C++ */
   567 #ifdef __cplusplus
   568 }
   569 #endif
   570 #include "close_code.h"
   571 
   572 #endif /* SDL_stdinc_h_ */
   573 
   574 /* vi: set ts=4 sw=4 expandtab: */