Subversion Repositories Games.Descent

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997-2009 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. /*@{*/
  93. typedef enum {
  94.         SDL_FALSE = 0,
  95.         SDL_TRUE  = 1
  96. } SDL_bool;
  97.  
  98. typedef int8_t          Sint8;
  99. typedef uint8_t         Uint8;
  100. typedef int16_t         Sint16;
  101. typedef uint16_t        Uint16;
  102. typedef int32_t         Sint32;
  103. typedef uint32_t        Uint32;
  104.  
  105. #ifdef SDL_HAS_64BIT_TYPE
  106. typedef int64_t         Sint64;
  107. #ifndef SYMBIAN32_GCCE
  108. typedef uint64_t        Uint64;
  109. #endif
  110. #else
  111. /* This is really just a hack to prevent the compiler from complaining */
  112. typedef 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.  
  125. SDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1);
  126. SDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1);
  127. SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2);
  128. SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2);
  129. SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4);
  130. SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4);
  131. SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8);
  132. SDL_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.  
  146. typedef enum {
  147.         DUMMY_ENUM_VALUE
  148. } SDL_DUMMY_ENUM;
  149.  
  150. #ifndef __NDS__
  151. SDL_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
  158. extern "C" {
  159. #endif
  160.  
  161. #ifdef HAVE_MALLOC
  162. #define SDL_malloc      malloc
  163. #else
  164. extern DECLSPEC void * SDLCALL SDL_malloc(size_t size);
  165. #endif
  166.  
  167. #ifdef HAVE_CALLOC
  168. #define SDL_calloc      calloc
  169. #else
  170. extern 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
  176. extern DECLSPEC void * SDLCALL SDL_realloc(void *mem, size_t size);
  177. #endif
  178.  
  179. #ifdef HAVE_FREE
  180. #define SDL_free        free
  181. #else
  182. extern 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
  218. extern DECLSPEC char * SDLCALL SDL_getenv(const char *name);
  219. #endif
  220.  
  221. #ifdef HAVE_PUTENV
  222. #define SDL_putenv      putenv
  223. #else
  224. extern DECLSPEC int SDLCALL SDL_putenv(const char *variable);
  225. #endif
  226.  
  227. #ifdef HAVE_QSORT
  228. #define SDL_qsort       qsort
  229. #else
  230. extern 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
  258. extern 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)                              \
  263. do {                                                            \
  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)              \
  275. do {                                            \
  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)                                         \
  296. do {                                                                      \
  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
  319. extern 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)                              \
  328. do {                                                            \
  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)                       \
  344. do {                                                    \
  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
  370. extern 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)                      \
  379. do {                                                    \
  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
  391. extern 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
  397. extern DECLSPEC size_t SDLCALL SDL_strlen(const char *string);
  398. #endif
  399.  
  400. #ifdef HAVE_STRLCPY
  401. #define SDL_strlcpy     strlcpy
  402. #else
  403. extern 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
  409. extern 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
  415. extern DECLSPEC char * SDLCALL SDL_strdup(const char *string);
  416. #endif
  417.  
  418. #ifdef HAVE__STRREV
  419. #define SDL_strrev      _strrev
  420. #else
  421. extern DECLSPEC char * SDLCALL SDL_strrev(char *string);
  422. #endif
  423.  
  424. #ifdef HAVE__STRUPR
  425. #define SDL_strupr      _strupr
  426. #else
  427. extern DECLSPEC char * SDLCALL SDL_strupr(char *string);
  428. #endif
  429.  
  430. #ifdef HAVE__STRLWR
  431. #define SDL_strlwr      _strlwr
  432. #else
  433. extern 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
  441. extern 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
  449. extern DECLSPEC char * SDLCALL SDL_strrchr(const char *string, int c);
  450. #endif
  451.  
  452. #ifdef HAVE_STRSTR
  453. #define SDL_strstr      strstr
  454. #else
  455. extern 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
  467. extern 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
  479. extern 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
  485. extern 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
  491. extern 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
  499. extern 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
  505. extern 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
  511. extern 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
  517. extern 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
  525. extern 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
  543. extern 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
  549. extern 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
  557. extern 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
  565. extern 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
  571. extern 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
  577. extern 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
  583. extern 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
  601. typedef struct _SDL_iconv_t *SDL_iconv_t;
  602. extern DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode, const char *fromcode);
  603. extern DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd);
  604. #endif
  605. extern 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.  */
  609. extern 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.