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