SDL_stdinc.h (16614B)
1/* 2 Simple DirectMedia Layer 3 Copyright (C) 1997-2014 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#if defined(HAVE_INTTYPES_H) 66# include <inttypes.h> 67#elif defined(HAVE_STDINT_H) 68# include <stdint.h> 69#endif 70#ifdef HAVE_CTYPE_H 71# include <ctype.h> 72#endif 73#ifdef HAVE_MATH_H 74# if defined(__WINRT__) 75/* Defining _USE_MATH_DEFINES is required to get M_PI to be defined on 76 WinRT. See http://msdn.microsoft.com/en-us/library/4hwaceh6.aspx 77 for more information. 78*/ 79# define _USE_MATH_DEFINES 80# endif 81# include <math.h> 82#endif 83#ifdef HAVE_FLOAT_H 84# include <float.h> 85#endif 86#if defined(HAVE_ICONV) && defined(HAVE_ICONV_H) 87# include <iconv.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 * \name Cast operators 98 * 99 * Use proper C++ casts when compiled as C++ to be compatible with the option 100 * -Wold-style-cast of GCC (and -Werror=old-style-cast in GCC 4.2 and above). 101 */ 102/* @{ */ 103#ifdef __cplusplus 104#define SDL_reinterpret_cast(type, expression) reinterpret_cast<type>(expression) 105#define SDL_static_cast(type, expression) static_cast<type>(expression) 106#define SDL_const_cast(type, expression) const_cast<type>(expression) 107#else 108#define SDL_reinterpret_cast(type, expression) ((type)(expression)) 109#define SDL_static_cast(type, expression) ((type)(expression)) 110#define SDL_const_cast(type, expression) ((type)(expression)) 111#endif 112/* @} *//* Cast operators */ 113 114/* Define a four character code as a Uint32 */ 115#define SDL_FOURCC(A, B, C, D) \ 116 ((SDL_static_cast(Uint32, SDL_static_cast(Uint8, (A))) << 0) | \ 117 (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (B))) << 8) | \ 118 (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (C))) << 16) | \ 119 (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (D))) << 24)) 120 121/** 122 * \name Basic data types 123 */ 124/* @{ */ 125 126typedef enum 127{ 128 SDL_FALSE = 0, 129 SDL_TRUE = 1 130} SDL_bool; 131 132/** 133 * \brief A signed 8-bit integer type. 134 */ 135typedef int8_t Sint8; 136/** 137 * \brief An unsigned 8-bit integer type. 138 */ 139typedef uint8_t Uint8; 140/** 141 * \brief A signed 16-bit integer type. 142 */ 143typedef int16_t Sint16; 144/** 145 * \brief An unsigned 16-bit integer type. 146 */ 147typedef uint16_t Uint16; 148/** 149 * \brief A signed 32-bit integer type. 150 */ 151typedef int32_t Sint32; 152/** 153 * \brief An unsigned 32-bit integer type. 154 */ 155typedef uint32_t Uint32; 156 157/** 158 * \brief A signed 64-bit integer type. 159 */ 160typedef int64_t Sint64; 161/** 162 * \brief An unsigned 64-bit integer type. 163 */ 164typedef uint64_t Uint64; 165 166/* @} *//* Basic data types */ 167 168/* Make sure we have macros for printing 64 bit values. 169 * <stdint.h> should define these but this is not true all platforms. 170 * (for example win32) */ 171#ifndef SDL_PRIs64 172#ifdef PRIs64 173#define SDL_PRIs64 PRIs64 174#elif defined(__WIN32__) 175#define SDL_PRIs64 "I64" 176#else 177#define SDL_PRIs64 "lld" 178#endif 179#endif 180#ifndef SDL_PRIu64 181#ifdef PRIu64 182#define SDL_PRIu64 PRIu64 183#elif defined(__WIN32__) 184#define SDL_PRIu64 "I64u" 185#else 186#define SDL_PRIu64 "llu" 187#endif 188#endif 189 190/* Annotations to help code analysis tools */ 191#ifdef SDL_DISABLE_ANALYZE_MACROS 192#define SDL_IN_BYTECAP(x) 193#define SDL_INOUT_Z_CAP(x) 194#define SDL_OUT_Z_CAP(x) 195#define SDL_OUT_CAP(x) 196#define SDL_OUT_BYTECAP(x) 197#define SDL_OUT_Z_BYTECAP(x) 198#define SDL_PRINTF_FORMAT_STRING 199#define SDL_SCANF_FORMAT_STRING 200#define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) 201#define SDL_SCANF_VARARG_FUNC( fmtargnumber ) 202#else 203#if _MSC_VER >= 1600 /* VS 2010 and above */ 204#include <sal.h> 205 206#define SDL_IN_BYTECAP(x) _In_bytecount_(x) 207#define SDL_INOUT_Z_CAP(x) _Inout_z_cap_(x) 208#define SDL_OUT_Z_CAP(x) _Out_z_cap_(x) 209#define SDL_OUT_CAP(x) _Out_cap_(x) 210#define SDL_OUT_BYTECAP(x) _Out_bytecap_(x) 211#define SDL_OUT_Z_BYTECAP(x) _Out_z_bytecap_(x) 212 213#define SDL_PRINTF_FORMAT_STRING _Printf_format_string_ 214#define SDL_SCANF_FORMAT_STRING _Scanf_format_string_impl_ 215#else 216#define SDL_IN_BYTECAP(x) 217#define SDL_INOUT_Z_CAP(x) 218#define SDL_OUT_Z_CAP(x) 219#define SDL_OUT_CAP(x) 220#define SDL_OUT_BYTECAP(x) 221#define SDL_OUT_Z_BYTECAP(x) 222#define SDL_PRINTF_FORMAT_STRING 223#define SDL_SCANF_FORMAT_STRING 224#endif 225#if defined(__GNUC__) 226#define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __printf__, fmtargnumber, fmtargnumber+1 ))) 227#define SDL_SCANF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __scanf__, fmtargnumber, fmtargnumber+1 ))) 228#else 229#define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) 230#define SDL_SCANF_VARARG_FUNC( fmtargnumber ) 231#endif 232#endif /* SDL_DISABLE_ANALYZE_MACROS */ 233 234#define SDL_COMPILE_TIME_ASSERT(name, x) \ 235 typedef int SDL_dummy_ ## name[(x) * 2 - 1] 236/** \cond */ 237#ifndef DOXYGEN_SHOULD_IGNORE_THIS 238SDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1); 239SDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1); 240SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2); 241SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2); 242SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4); 243SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4); 244SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8); 245SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8); 246#endif /* DOXYGEN_SHOULD_IGNORE_THIS */ 247/** \endcond */ 248 249/* Check to make sure enums are the size of ints, for structure packing. 250 For both Watcom C/C++ and Borland C/C++ the compiler option that makes 251 enums having the size of an int must be enabled. 252 This is "-b" for Borland C/C++ and "-ei" for Watcom C/C++ (v11). 253*/ 254 255/** \cond */ 256#ifndef DOXYGEN_SHOULD_IGNORE_THIS 257#if !defined(__ANDROID__) 258 /* TODO: include/SDL_stdinc.h:174: error: size of array 'SDL_dummy_enum' is negative */ 259typedef enum 260{ 261 DUMMY_ENUM_VALUE 262} SDL_DUMMY_ENUM; 263 264SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int)); 265#endif 266#endif /* DOXYGEN_SHOULD_IGNORE_THIS */ 267/** \endcond */ 268 269#include "begin_code.h" 270/* Set up for C function definitions, even when using C++ */ 271#ifdef __cplusplus 272extern "C" { 273#endif 274 275#if defined(HAVE_ALLOCA) && !defined(alloca) 276# if defined(HAVE_ALLOCA_H) 277# include <alloca.h> 278# elif defined(__GNUC__) 279# define alloca __builtin_alloca 280# elif defined(_MSC_VER) 281# include <malloc.h> 282# define alloca _alloca 283# elif defined(__WATCOMC__) 284# include <malloc.h> 285# elif defined(__BORLANDC__) 286# include <malloc.h> 287# elif defined(__DMC__) 288# include <stdlib.h> 289# elif defined(__AIX__) 290#pragma alloca 291# elif defined(__MRC__) 292void *alloca(unsigned); 293# else 294char *alloca(); 295# endif 296#endif 297#ifdef HAVE_ALLOCA 298#define SDL_stack_alloc(type, count) (type*)alloca(sizeof(type)*(count)) 299#define SDL_stack_free(data) 300#else 301#define SDL_stack_alloc(type, count) (type*)SDL_malloc(sizeof(type)*(count)) 302#define SDL_stack_free(data) SDL_free(data) 303#endif 304 305extern DECLSPEC void *SDLCALL SDL_malloc(size_t size); 306extern DECLSPEC void *SDLCALL SDL_calloc(size_t nmemb, size_t size); 307extern DECLSPEC void *SDLCALL SDL_realloc(void *mem, size_t size); 308extern DECLSPEC void SDLCALL SDL_free(void *mem); 309 310extern DECLSPEC char *SDLCALL SDL_getenv(const char *name); 311extern DECLSPEC int SDLCALL SDL_setenv(const char *name, const char *value, int overwrite); 312 313extern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, int (*compare) (const void *, const void *)); 314 315extern DECLSPEC int SDLCALL SDL_abs(int x); 316 317/* !!! FIXME: these have side effects. You probably shouldn't use them. */ 318/* !!! FIXME: Maybe we do forceinline functions of SDL_mini, SDL_minf, etc? */ 319#define SDL_min(x, y) (((x) < (y)) ? (x) : (y)) 320#define SDL_max(x, y) (((x) > (y)) ? (x) : (y)) 321 322extern DECLSPEC int SDLCALL SDL_isdigit(int x); 323extern DECLSPEC int SDLCALL SDL_isspace(int x); 324extern DECLSPEC int SDLCALL SDL_toupper(int x); 325extern DECLSPEC int SDLCALL SDL_tolower(int x); 326 327extern DECLSPEC void *SDLCALL SDL_memset(SDL_OUT_BYTECAP(len) void *dst, int c, size_t len); 328 329#define SDL_zero(x) SDL_memset(&(x), 0, sizeof((x))) 330#define SDL_zerop(x) SDL_memset((x), 0, sizeof(*(x))) 331 332/* Note that memset() is a byte assignment and this is a 32-bit assignment, so they're not directly equivalent. */ 333SDL_FORCE_INLINE void SDL_memset4(void *dst, Uint32 val, size_t dwords) 334{ 335#if defined(__GNUC__) && defined(i386) 336 int u0, u1, u2; 337 __asm__ __volatile__ ( 338 "cld \n\t" 339 "rep ; stosl \n\t" 340 : "=&D" (u0), "=&a" (u1), "=&c" (u2) 341 : "0" (dst), "1" (val), "2" (SDL_static_cast(Uint32, dwords)) 342 : "memory" 343 ); 344#else 345 size_t _n = (dwords + 3) / 4; 346 Uint32 *_p = SDL_static_cast(Uint32 *, dst); 347 Uint32 _val = (val); 348 if (dwords == 0) 349 return; 350 switch (dwords % 4) 351 { 352 case 0: do { *_p++ = _val; 353 case 3: *_p++ = _val; 354 case 2: *_p++ = _val; 355 case 1: *_p++ = _val; 356 } while ( --_n ); 357 } 358#endif 359} 360 361 362extern DECLSPEC void *SDLCALL SDL_memcpy(SDL_OUT_BYTECAP(len) void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len); 363 364SDL_FORCE_INLINE void *SDL_memcpy4(SDL_OUT_BYTECAP(dwords*4) void *dst, SDL_IN_BYTECAP(dwords*4) const void *src, size_t dwords) 365{ 366 return SDL_memcpy(dst, src, dwords * 4); 367} 368 369extern DECLSPEC void *SDLCALL SDL_memmove(SDL_OUT_BYTECAP(len) void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len); 370extern DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_t len); 371 372extern DECLSPEC size_t SDLCALL SDL_wcslen(const wchar_t *wstr); 373extern DECLSPEC size_t SDLCALL SDL_wcslcpy(SDL_OUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen); 374extern DECLSPEC size_t SDLCALL SDL_wcslcat(SDL_INOUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen); 375 376extern DECLSPEC size_t SDLCALL SDL_strlen(const char *str); 377extern DECLSPEC size_t SDLCALL SDL_strlcpy(SDL_OUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen); 378extern DECLSPEC size_t SDLCALL SDL_utf8strlcpy(SDL_OUT_Z_CAP(dst_bytes) char *dst, const char *src, size_t dst_bytes); 379extern DECLSPEC size_t SDLCALL SDL_strlcat(SDL_INOUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen); 380extern DECLSPEC char *SDLCALL SDL_strdup(const char *str); 381extern DECLSPEC char *SDLCALL SDL_strrev(char *str); 382extern DECLSPEC char *SDLCALL SDL_strupr(char *str); 383extern DECLSPEC char *SDLCALL SDL_strlwr(char *str); 384extern DECLSPEC char *SDLCALL SDL_strchr(const char *str, int c); 385extern DECLSPEC char *SDLCALL SDL_strrchr(const char *str, int c); 386extern DECLSPEC char *SDLCALL SDL_strstr(const char *haystack, const char *needle); 387 388extern DECLSPEC char *SDLCALL SDL_itoa(int value, char *str, int radix); 389extern DECLSPEC char *SDLCALL SDL_uitoa(unsigned int value, char *str, int radix); 390extern DECLSPEC char *SDLCALL SDL_ltoa(long value, char *str, int radix); 391extern DECLSPEC char *SDLCALL SDL_ultoa(unsigned long value, char *str, int radix); 392extern DECLSPEC char *SDLCALL SDL_lltoa(Sint64 value, char *str, int radix); 393extern DECLSPEC char *SDLCALL SDL_ulltoa(Uint64 value, char *str, int radix); 394 395extern DECLSPEC int SDLCALL SDL_atoi(const char *str); 396extern DECLSPEC double SDLCALL SDL_atof(const char *str); 397extern DECLSPEC long SDLCALL SDL_strtol(const char *str, char **endp, int base); 398extern DECLSPEC unsigned long SDLCALL SDL_strtoul(const char *str, char **endp, int base); 399extern DECLSPEC Sint64 SDLCALL SDL_strtoll(const char *str, char **endp, int base); 400extern DECLSPEC Uint64 SDLCALL SDL_strtoull(const char *str, char **endp, int base); 401extern DECLSPEC double SDLCALL SDL_strtod(const char *str, char **endp); 402 403extern DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2); 404extern DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, size_t maxlen); 405extern DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str2); 406extern DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t len); 407 408extern DECLSPEC int SDLCALL SDL_sscanf(const char *text, SDL_SCANF_FORMAT_STRING const char *fmt, ...) SDL_SCANF_VARARG_FUNC(2); 409extern DECLSPEC int SDLCALL SDL_vsscanf(const char *text, const char *fmt, va_list ap); 410extern 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); 411extern DECLSPEC int SDLCALL SDL_vsnprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, const char *fmt, va_list ap); 412 413#ifndef HAVE_M_PI 414#ifndef M_PI 415#define M_PI 3.14159265358979323846264338327950288 /* pi */ 416#endif 417#endif 418 419extern DECLSPEC double SDLCALL SDL_acos(double x); 420extern DECLSPEC double SDLCALL SDL_asin(double x); 421extern DECLSPEC double SDLCALL SDL_atan(double x); 422extern DECLSPEC double SDLCALL SDL_atan2(double x, double y); 423extern DECLSPEC double SDLCALL SDL_ceil(double x); 424extern DECLSPEC double SDLCALL SDL_copysign(double x, double y); 425extern DECLSPEC double SDLCALL SDL_cos(double x); 426extern DECLSPEC float SDLCALL SDL_cosf(float x); 427extern DECLSPEC double SDLCALL SDL_fabs(double x); 428extern DECLSPEC double SDLCALL SDL_floor(double x); 429extern DECLSPEC double SDLCALL SDL_log(double x); 430extern DECLSPEC double SDLCALL SDL_pow(double x, double y); 431extern DECLSPEC double SDLCALL SDL_scalbn(double x, int n); 432extern DECLSPEC double SDLCALL SDL_sin(double x); 433extern DECLSPEC float SDLCALL SDL_sinf(float x); 434extern DECLSPEC double SDLCALL SDL_sqrt(double x); 435extern DECLSPEC float SDLCALL SDL_sqrtf(float x); 436extern DECLSPEC double SDLCALL SDL_tan(double x); 437extern DECLSPEC float SDLCALL SDL_tanf(float x); 438 439/* The SDL implementation of iconv() returns these error codes */ 440#define SDL_ICONV_ERROR (size_t)-1 441#define SDL_ICONV_E2BIG (size_t)-2 442#define SDL_ICONV_EILSEQ (size_t)-3 443#define SDL_ICONV_EINVAL (size_t)-4 444 445/* SDL_iconv_* are now always real symbols/types, not macros or inlined. */ 446typedef struct _SDL_iconv_t *SDL_iconv_t; 447extern DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode, 448 const char *fromcode); 449extern DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd); 450extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, 451 size_t * inbytesleft, char **outbuf, 452 size_t * outbytesleft); 453/** 454 * This function converts a string between encodings in one pass, returning a 455 * string that must be freed with SDL_free() or NULL on error. 456 */ 457extern DECLSPEC char *SDLCALL SDL_iconv_string(const char *tocode, 458 const char *fromcode, 459 const char *inbuf, 460 size_t inbytesleft); 461#define SDL_iconv_utf8_locale(S) SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1) 462#define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2-INTERNAL", "UTF-8", S, SDL_strlen(S)+1) 463#define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4-INTERNAL", "UTF-8", S, SDL_strlen(S)+1) 464 465/* Ends C function definitions when using C++ */ 466#ifdef __cplusplus 467} 468#endif 469#include "close_code.h" 470 471#endif /* _SDL_stdinc_h */ 472 473/* vi: set ts=4 sw=4 expandtab: */