SDL_stdinc.h
上传用户:detong
上传日期:2022-06-22
资源大小:20675k
文件大小:15k
源码类别:

系统编程

开发平台:

Unix_Linux

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