1/* 2 SDL - Simple DirectMedia Layer 3 Copyright (C) 1997-2012 Sam Lantinga 4 5 This library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 This library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with this library; if not, write to the Free Software 17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 19 Sam Lantinga 20 slouken@libsdl.org 21*/ 22 23/** @file SDL_stdinc.h 24 * This is a general header that includes C language support 25 */ 26 27#ifndef _SDL_stdinc_h 28#define _SDL_stdinc_h 29 30#include "SDL_config.h" 31 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#if defined(HAVE_ICONV) && defined(HAVE_ICONV_H) 74# include <iconv.h> 75#endif 76 77/** The number of elements in an array */ 78#define SDL_arraysize(array) (sizeof(array)/sizeof(array[0])) 79#define SDL_TABLESIZE(table) SDL_arraysize(table) 80 81/* Use proper C++ casts when compiled as C++ to be compatible with the option 82 -Wold-style-cast of GCC (and -Werror=old-style-cast in GCC 4.2 and above. */ 83#ifdef __cplusplus 84#define SDL_reinterpret_cast(type, expression) reinterpret_cast<type>(expression) 85#define SDL_static_cast(type, expression) static_cast<type>(expression) 86#else 87#define SDL_reinterpret_cast(type, expression) ((type)(expression)) 88#define SDL_static_cast(type, expression) ((type)(expression)) 89#endif 90 91/** @name Basic data types */ 92/*@{*/ 93typedef enum { 94 SDL_FALSE = 0, 95 SDL_TRUE = 1 96} SDL_bool; 97 98typedef int8_t Sint8; 99typedef uint8_t Uint8; 100typedef int16_t Sint16; 101typedef uint16_t Uint16; 102typedef int32_t Sint32; 103typedef uint32_t Uint32; 104 105#ifdef SDL_HAS_64BIT_TYPE 106typedef int64_t Sint64; 107#ifndef SYMBIAN32_GCCE 108typedef uint64_t Uint64; 109#endif 110#else 111/* This is really just a hack to prevent the compiler from complaining */ 112typedef struct { 113 Uint32 hi; 114 Uint32 lo; 115} Uint64, Sint64; 116#endif 117 118/*@}*/ 119 120/** @name Make sure the types really have the right sizes */ 121/*@{*/ 122#define SDL_COMPILE_TIME_ASSERT(name, x) \ 123 typedef int SDL_dummy_ ## name[(x) * 2 - 1] 124 125SDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1); 126SDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1); 127SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2); 128SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2); 129SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4); 130SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4); 131SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8); 132SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8); 133/*@}*/ 134 135/** @name Enum Size Check 136 * Check to make sure enums are the size of ints, for structure packing. 137 * For both Watcom C/C++ and Borland C/C++ the compiler option that makes 138 * enums having the size of an int must be enabled. 139 * This is "-b" for Borland C/C++ and "-ei" for Watcom C/C++ (v11). 140 */ 141/* Enable enums always int in CodeWarrior (for MPW use "-enum int") */ 142#ifdef __MWERKS__ 143#pragma enumsalwaysint on 144#endif 145 146typedef enum { 147 DUMMY_ENUM_VALUE 148} SDL_DUMMY_ENUM; 149 150#ifndef __NDS__ 151SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int)); 152#endif 153/*@}*/ 154 155#include "begin_code.h" 156/* Set up for C function definitions, even when using C++ */ 157#ifdef __cplusplus 158extern "C" { 159#endif 160 161#ifdef HAVE_MALLOC 162#define SDL_malloc malloc 163#else 164extern DECLSPEC void * SDLCALL SDL_malloc(size_t size); 165#endif 166 167#ifdef HAVE_CALLOC 168#define SDL_calloc calloc 169#else 170extern DECLSPEC void * SDLCALL SDL_calloc(size_t nmemb, size_t size); 171#endif 172 173#ifdef HAVE_REALLOC 174#define SDL_realloc realloc 175#else 176extern DECLSPEC void * SDLCALL SDL_realloc(void *mem, size_t size); 177#endif 178 179#ifdef HAVE_FREE 180#define SDL_free free 181#else 182extern DECLSPEC void SDLCALL SDL_free(void *mem); 183#endif 184 185#if defined(HAVE_ALLOCA) && !defined(alloca) 186# if defined(HAVE_ALLOCA_H) 187# include <alloca.h> 188# elif defined(__GNUC__) 189# define alloca __builtin_alloca 190# elif defined(_MSC_VER) 191# include <malloc.h> 192# define alloca _alloca 193# elif defined(__WATCOMC__) 194# include <malloc.h> 195# elif defined(__BORLANDC__) 196# include <malloc.h> 197# elif defined(__DMC__) 198# include <stdlib.h> 199# elif defined(__AIX__) 200 #pragma alloca 201# elif defined(__MRC__) 202 void *alloca (unsigned); 203# else 204 char *alloca (); 205# endif 206#endif 207#ifdef HAVE_ALLOCA 208#define SDL_stack_alloc(type, count) (type*)alloca(sizeof(type)*(count)) 209#define SDL_stack_free(data) 210#else 211#define SDL_stack_alloc(type, count) (type*)SDL_malloc(sizeof(type)*(count)) 212#define SDL_stack_free(data) SDL_free(data) 213#endif 214 215#ifdef HAVE_GETENV 216#define SDL_getenv getenv 217#else 218extern DECLSPEC char * SDLCALL SDL_getenv(const char *name); 219#endif 220 221#ifdef HAVE_PUTENV 222#define SDL_putenv putenv 223#else 224extern DECLSPEC int SDLCALL SDL_putenv(const char *variable); 225#endif 226 227#ifdef HAVE_QSORT 228#define SDL_qsort qsort 229#else 230extern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, 231 int (*compare)(const void *, const void *)); 232#endif 233 234#ifdef HAVE_ABS 235#define SDL_abs abs 236#else 237#define SDL_abs(X) ((X) < 0 ? -(X) : (X)) 238#endif 239 240#define SDL_min(x, y) (((x) < (y)) ? (x) : (y)) 241#define SDL_max(x, y) (((x) > (y)) ? (x) : (y)) 242 243#ifdef HAVE_CTYPE_H 244#define SDL_isdigit(X) isdigit(X) 245#define SDL_isspace(X) isspace(X) 246#define SDL_toupper(X) toupper(X) 247#define SDL_tolower(X) tolower(X) 248#else 249#define SDL_isdigit(X) (((X) >= '0') && ((X) <= '9')) 250#define SDL_isspace(X) (((X) == ' ') || ((X) == '\t') || ((X) == '\r') || ((X) == '\n')) 251#define SDL_toupper(X) (((X) >= 'a') && ((X) <= 'z') ? ('A'+((X)-'a')) : (X)) 252#define SDL_tolower(X) (((X) >= 'A') && ((X) <= 'Z') ? ('a'+((X)-'A')) : (X)) 253#endif 254 255#ifdef HAVE_MEMSET 256#define SDL_memset memset 257#else 258extern DECLSPEC void * SDLCALL SDL_memset(void *dst, int c, size_t len); 259#endif 260 261#if defined(__GNUC__) && defined(i386) 262#define SDL_memset4(dst, val, len) \ 263do { \ 264 int u0, u1, u2; \ 265 __asm__ __volatile__ ( \ 266 "cld\n\t" \ 267 "rep ; stosl\n\t" \ 268 : "=&D" (u0), "=&a" (u1), "=&c" (u2) \ 269 : "0" (dst), "1" (val), "2" (SDL_static_cast(Uint32, len)) \ 270 : "memory" ); \ 271} while(0) 272#endif 273#ifndef SDL_memset4 274#define SDL_memset4(dst, val, len) \ 275do { \ 276 unsigned _count = (len); \ 277 unsigned _n = (_count + 3) / 4; \ 278 Uint32 *_p = SDL_static_cast(Uint32 *, dst); \ 279 Uint32 _val = (val); \ 280 if (len == 0) break; \ 281 switch (_count % 4) { \ 282 case 0: do { *_p++ = _val; \ 283 case 3: *_p++ = _val; \ 284 case 2: *_p++ = _val; \ 285 case 1: *_p++ = _val; \ 286 } while ( --_n ); \ 287 } \ 288} while(0) 289#endif 290 291/* We can count on memcpy existing on Mac OS X and being well-tuned. */ 292#if defined(__MACH__) && defined(__APPLE__) 293#define SDL_memcpy(dst, src, len) memcpy(dst, src, len) 294#elif defined(__GNUC__) && defined(i386) 295#define SDL_memcpy(dst, src, len) \ 296do { \ 297 int u0, u1, u2; \ 298 __asm__ __volatile__ ( \ 299 "cld\n\t" \ 300 "rep ; movsl\n\t" \ 301 "testb $2,%b4\n\t" \ 302 "je 1f\n\t" \ 303 "movsw\n" \ 304 "1:\ttestb $1,%b4\n\t" \ 305 "je 2f\n\t" \ 306 "movsb\n" \ 307 "2:" \ 308 : "=&c" (u0), "=&D" (u1), "=&S" (u2) \ 309 : "0" (SDL_static_cast(unsigned, len)/4), "q" (len), "1" (dst),"2" (src) \ 310 : "memory" ); \ 311} while(0) 312#endif 313#ifndef SDL_memcpy 314#ifdef HAVE_MEMCPY 315#define SDL_memcpy memcpy 316#elif defined(HAVE_BCOPY) 317#define SDL_memcpy(d, s, n) bcopy((s), (d), (n)) 318#else 319extern DECLSPEC void * SDLCALL SDL_memcpy(void *dst, const void *src, size_t len); 320#endif 321#endif 322 323/* We can count on memcpy existing on Mac OS X and being well-tuned. */ 324#if defined(__MACH__) && defined(__APPLE__) 325#define SDL_memcpy4(dst, src, len) memcpy(dst, src, (len)*4) 326#elif defined(__GNUC__) && defined(i386) 327#define SDL_memcpy4(dst, src, len) \ 328do { \ 329 int ecx, edi, esi; \ 330 __asm__ __volatile__ ( \ 331 "cld\n\t" \ 332 "rep ; movsl" \ 333 : "=&c" (ecx), "=&D" (edi), "=&S" (esi) \ 334 : "0" (SDL_static_cast(unsigned, len)), "1" (dst), "2" (src) \ 335 : "memory" ); \ 336} while(0) 337#endif 338#ifndef SDL_memcpy4 339#define SDL_memcpy4(dst, src, len) SDL_memcpy(dst, src, (len) << 2) 340#endif 341 342#if defined(__GNUC__) && defined(i386) 343#define SDL_revcpy(dst, src, len) \ 344do { \ 345 int u0, u1, u2; \ 346 char *dstp = SDL_static_cast(char *, dst); \ 347 char *srcp = SDL_static_cast(char *, src); \ 348 int n = (len); \ 349 if ( n >= 4 ) { \ 350 __asm__ __volatile__ ( \ 351 "std\n\t" \ 352 "rep ; movsl\n\t" \ 353 "cld\n\t" \ 354 : "=&c" (u0), "=&D" (u1), "=&S" (u2) \ 355 : "0" (n >> 2), \ 356 "1" (dstp+(n-4)), "2" (srcp+(n-4)) \ 357 : "memory" ); \ 358 } \ 359 switch (n & 3) { \ 360 case 3: dstp[2] = srcp[2]; \ 361 case 2: dstp[1] = srcp[1]; \ 362 case 1: dstp[0] = srcp[0]; \ 363 break; \ 364 default: \ 365 break; \ 366 } \ 367} while(0) 368#endif 369#ifndef SDL_revcpy 370extern DECLSPEC void * SDLCALL SDL_revcpy(void *dst, const void *src, size_t len); 371#endif 372 373#ifdef HAVE_MEMMOVE 374#define SDL_memmove memmove 375#elif defined(HAVE_BCOPY) 376#define SDL_memmove(d, s, n) bcopy((s), (d), (n)) 377#else 378#define SDL_memmove(dst, src, len) \ 379do { \ 380 if ( dst < src ) { \ 381 SDL_memcpy(dst, src, len); \ 382 } else { \ 383 SDL_revcpy(dst, src, len); \ 384 } \ 385} while(0) 386#endif 387 388#ifdef HAVE_MEMCMP 389#define SDL_memcmp memcmp 390#else 391extern DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_t len); 392#endif 393 394#ifdef HAVE_STRLEN 395#define SDL_strlen strlen 396#else 397extern DECLSPEC size_t SDLCALL SDL_strlen(const char *string); 398#endif 399 400#ifdef HAVE_STRLCPY 401#define SDL_strlcpy strlcpy 402#else 403extern DECLSPEC size_t SDLCALL SDL_strlcpy(char *dst, const char *src, size_t maxlen); 404#endif 405 406#ifdef HAVE_STRLCAT 407#define SDL_strlcat strlcat 408#else 409extern DECLSPEC size_t SDLCALL SDL_strlcat(char *dst, const char *src, size_t maxlen); 410#endif 411 412#ifdef HAVE_STRDUP 413#define SDL_strdup strdup 414#else 415extern DECLSPEC char * SDLCALL SDL_strdup(const char *string); 416#endif 417 418#ifdef HAVE__STRREV 419#define SDL_strrev _strrev 420#else 421extern DECLSPEC char * SDLCALL SDL_strrev(char *string); 422#endif 423 424#ifdef HAVE__STRUPR 425#define SDL_strupr _strupr 426#else 427extern DECLSPEC char * SDLCALL SDL_strupr(char *string); 428#endif 429 430#ifdef HAVE__STRLWR 431#define SDL_strlwr _strlwr 432#else 433extern DECLSPEC char * SDLCALL SDL_strlwr(char *string); 434#endif 435 436#ifdef HAVE_STRCHR 437#define SDL_strchr strchr 438#elif defined(HAVE_INDEX) 439#define SDL_strchr index 440#else 441extern DECLSPEC char * SDLCALL SDL_strchr(const char *string, int c); 442#endif 443 444#ifdef HAVE_STRRCHR 445#define SDL_strrchr strrchr 446#elif defined(HAVE_RINDEX) 447#define SDL_strrchr rindex 448#else 449extern DECLSPEC char * SDLCALL SDL_strrchr(const char *string, int c); 450#endif 451 452#ifdef HAVE_STRSTR 453#define SDL_strstr strstr 454#else 455extern DECLSPEC char * SDLCALL SDL_strstr(const char *haystack, const char *needle); 456#endif 457 458#ifdef HAVE_ITOA 459#define SDL_itoa itoa 460#else 461#define SDL_itoa(value, string, radix) SDL_ltoa((long)value, string, radix) 462#endif 463 464#ifdef HAVE__LTOA 465#define SDL_ltoa _ltoa 466#else 467extern DECLSPEC char * SDLCALL SDL_ltoa(long value, char *string, int radix); 468#endif 469 470#ifdef HAVE__UITOA 471#define SDL_uitoa _uitoa 472#else 473#define SDL_uitoa(value, string, radix) SDL_ultoa((long)value, string, radix) 474#endif 475 476#ifdef HAVE__ULTOA 477#define SDL_ultoa _ultoa 478#else 479extern DECLSPEC char * SDLCALL SDL_ultoa(unsigned long value, char *string, int radix); 480#endif 481 482#ifdef HAVE_STRTOL 483#define SDL_strtol strtol 484#else 485extern DECLSPEC long SDLCALL SDL_strtol(const char *string, char **endp, int base); 486#endif 487 488#ifdef HAVE_STRTOUL 489#define SDL_strtoul strtoul 490#else 491extern DECLSPEC unsigned long SDLCALL SDL_strtoul(const char *string, char **endp, int base); 492#endif 493 494#ifdef SDL_HAS_64BIT_TYPE 495 496#ifdef HAVE__I64TOA 497#define SDL_lltoa _i64toa 498#else 499extern DECLSPEC char* SDLCALL SDL_lltoa(Sint64 value, char *string, int radix); 500#endif 501 502#ifdef HAVE__UI64TOA 503#define SDL_ulltoa _ui64toa 504#else 505extern DECLSPEC char* SDLCALL SDL_ulltoa(Uint64 value, char *string, int radix); 506#endif 507 508#ifdef HAVE_STRTOLL 509#define SDL_strtoll strtoll 510#else 511extern DECLSPEC Sint64 SDLCALL SDL_strtoll(const char *string, char **endp, int base); 512#endif 513 514#ifdef HAVE_STRTOULL 515#define SDL_strtoull strtoull 516#else 517extern DECLSPEC Uint64 SDLCALL SDL_strtoull(const char *string, char **endp, int base); 518#endif 519 520#endif /* SDL_HAS_64BIT_TYPE */ 521 522#ifdef HAVE_STRTOD 523#define SDL_strtod strtod 524#else 525extern DECLSPEC double SDLCALL SDL_strtod(const char *string, char **endp); 526#endif 527 528#ifdef HAVE_ATOI 529#define SDL_atoi atoi 530#else 531#define SDL_atoi(X) SDL_strtol(X, NULL, 0) 532#endif 533 534#ifdef HAVE_ATOF 535#define SDL_atof atof 536#else 537#define SDL_atof(X) SDL_strtod(X, NULL) 538#endif 539 540#ifdef HAVE_STRCMP 541#define SDL_strcmp strcmp 542#else 543extern DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2); 544#endif 545 546#ifdef HAVE_STRNCMP 547#define SDL_strncmp strncmp 548#else 549extern DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, size_t maxlen); 550#endif 551 552#ifdef HAVE_STRCASECMP 553#define SDL_strcasecmp strcasecmp 554#elif defined(HAVE__STRICMP) 555#define SDL_strcasecmp _stricmp 556#else 557extern DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str2); 558#endif 559 560#ifdef HAVE_STRNCASECMP 561#define SDL_strncasecmp strncasecmp 562#elif defined(HAVE__STRNICMP) 563#define SDL_strncasecmp _strnicmp 564#else 565extern DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t maxlen); 566#endif 567 568#ifdef HAVE_SSCANF 569#define SDL_sscanf sscanf 570#else 571extern DECLSPEC int SDLCALL SDL_sscanf(const char *text, const char *fmt, ...); 572#endif 573 574#ifdef HAVE_SNPRINTF 575#define SDL_snprintf snprintf 576#else 577extern DECLSPEC int SDLCALL SDL_snprintf(char *text, size_t maxlen, const char *fmt, ...); 578#endif 579 580#ifdef HAVE_VSNPRINTF 581#define SDL_vsnprintf vsnprintf 582#else 583extern DECLSPEC int SDLCALL SDL_vsnprintf(char *text, size_t maxlen, const char *fmt, va_list ap); 584#endif 585 586/** @name SDL_ICONV Error Codes 587 * The SDL implementation of iconv() returns these error codes 588 */ 589/*@{*/ 590#define SDL_ICONV_ERROR (size_t)-1 591#define SDL_ICONV_E2BIG (size_t)-2 592#define SDL_ICONV_EILSEQ (size_t)-3 593#define SDL_ICONV_EINVAL (size_t)-4 594/*@}*/ 595 596#if defined(HAVE_ICONV) && defined(HAVE_ICONV_H) 597#define SDL_iconv_t iconv_t 598#define SDL_iconv_open iconv_open 599#define SDL_iconv_close iconv_close 600#else 601typedef struct _SDL_iconv_t *SDL_iconv_t; 602extern DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode, const char *fromcode); 603extern DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd); 604#endif 605extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft); 606/** This function converts a string between encodings in one pass, returning a 607 * string that must be freed with SDL_free() or NULL on error. 608 */ 609extern DECLSPEC char * SDLCALL SDL_iconv_string(const char *tocode, const char *fromcode, const char *inbuf, size_t inbytesleft); 610#define SDL_iconv_utf8_locale(S) SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1) 611#define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2", "UTF-8", S, SDL_strlen(S)+1) 612#define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4", "UTF-8", S, SDL_strlen(S)+1) 613 614/* Ends C function definitions when using C++ */ 615#ifdef __cplusplus 616} 617#endif 618#include "close_code.h" 619 620#endif /* _SDL_stdinc_h */ 621