SDL Library
Embed:
(wiki syntax)
Show/hide line numbers
SDL_stdinc.h
Go to the documentation of this file.
00001 /* 00002 Simple DirectMedia Layer 00003 Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org> 00004 00005 This software is provided 'as-is', without any express or implied 00006 warranty. In no event will the authors be held liable for any damages 00007 arising from the use of this software. 00008 00009 Permission is granted to anyone to use this software for any purpose, 00010 including commercial applications, and to alter it and redistribute it 00011 freely, subject to the following restrictions: 00012 00013 1. The origin of this software must not be misrepresented; you must not 00014 claim that you wrote the original software. If you use this software 00015 in a product, an acknowledgment in the product documentation would be 00016 appreciated but is not required. 00017 2. Altered source versions must be plainly marked as such, and must not be 00018 misrepresented as being the original software. 00019 3. This notice may not be removed or altered from any source distribution. 00020 */ 00021 00022 /** 00023 * \file SDL_stdinc.h 00024 * 00025 * This is a general header that includes C language support. 00026 */ 00027 00028 #ifndef _SDL_stdinc_h 00029 #define _SDL_stdinc_h 00030 00031 #include "SDL_config.h" 00032 00033 #ifdef HAVE_SYS_TYPES_H 00034 #include <sys/types.h> 00035 #endif 00036 #ifdef HAVE_STDIO_H 00037 #include <stdio.h> 00038 #endif 00039 #if defined(STDC_HEADERS) 00040 # include <stdlib.h> 00041 # include <stddef.h> 00042 # include <stdarg.h> 00043 #else 00044 # if defined(HAVE_STDLIB_H) 00045 # include <stdlib.h> 00046 # elif defined(HAVE_MALLOC_H) 00047 # include <malloc.h> 00048 # endif 00049 # if defined(HAVE_STDDEF_H) 00050 # include <stddef.h> 00051 # endif 00052 # if defined(HAVE_STDARG_H) 00053 # include <stdarg.h> 00054 # endif 00055 #endif 00056 #ifdef HAVE_STRING_H 00057 # if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H) 00058 # include <memory.h> 00059 # endif 00060 # include <string.h> 00061 #endif 00062 #ifdef HAVE_STRINGS_H 00063 # include <strings.h> 00064 #endif 00065 #if defined(HAVE_INTTYPES_H) 00066 # include <inttypes.h> 00067 #elif defined(HAVE_STDINT_H) 00068 # include <stdint.h> 00069 #endif 00070 #ifdef HAVE_CTYPE_H 00071 # include <ctype.h> 00072 #endif 00073 #ifdef HAVE_MATH_H 00074 # include <math.h> 00075 #endif 00076 #if defined(HAVE_ICONV) && defined(HAVE_ICONV_H) 00077 # include <iconv.h> 00078 #endif 00079 00080 /** 00081 * The number of elements in an array. 00082 */ 00083 #define SDL_arraysize(array) (sizeof(array)/sizeof(array[0])) 00084 #define SDL_TABLESIZE(table) SDL_arraysize(table) 00085 00086 /** 00087 * \name Cast operators 00088 * 00089 * Use proper C++ casts when compiled as C++ to be compatible with the option 00090 * -Wold-style-cast of GCC (and -Werror=old-style-cast in GCC 4.2 and above). 00091 */ 00092 /* @{ */ 00093 #ifdef __cplusplus 00094 #define SDL_reinterpret_cast(type, expression) reinterpret_cast<type>(expression) 00095 #define SDL_static_cast(type, expression) static_cast<type>(expression) 00096 #define SDL_const_cast(type, expression) const_cast<type>(expression) 00097 #else 00098 #define SDL_reinterpret_cast(type, expression) ((type)(expression)) 00099 #define SDL_static_cast(type, expression) ((type)(expression)) 00100 #define SDL_const_cast(type, expression) ((type)(expression)) 00101 #endif 00102 /* @} *//* Cast operators */ 00103 00104 /* Define a four character code as a Uint32 */ 00105 #define SDL_FOURCC(A, B, C, D) \ 00106 ((SDL_static_cast(Uint32, SDL_static_cast(Uint8, (A))) << 0) | \ 00107 (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (B))) << 8) | \ 00108 (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (C))) << 16) | \ 00109 (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (D))) << 24)) 00110 00111 /** 00112 * \name Basic data types 00113 */ 00114 /* @{ */ 00115 00116 typedef enum 00117 { 00118 SDL_FALSE = 0, 00119 SDL_TRUE = 1 00120 } SDL_bool; 00121 00122 /** 00123 * \brief A signed 8-bit integer type. 00124 */ 00125 typedef int8_t Sint8; 00126 /** 00127 * \brief An unsigned 8-bit integer type. 00128 */ 00129 typedef uint8_t Uint8; 00130 /** 00131 * \brief A signed 16-bit integer type. 00132 */ 00133 typedef int16_t Sint16; 00134 /** 00135 * \brief An unsigned 16-bit integer type. 00136 */ 00137 typedef uint16_t Uint16; 00138 /** 00139 * \brief A signed 32-bit integer type. 00140 */ 00141 typedef int32_t Sint32; 00142 /** 00143 * \brief An unsigned 32-bit integer type. 00144 */ 00145 typedef uint32_t Uint32; 00146 00147 /** 00148 * \brief A signed 64-bit integer type. 00149 */ 00150 typedef int64_t Sint64; 00151 /** 00152 * \brief An unsigned 64-bit integer type. 00153 */ 00154 typedef uint64_t Uint64; 00155 00156 /* @} *//* Basic data types */ 00157 00158 00159 #define SDL_COMPILE_TIME_ASSERT(name, x) \ 00160 typedef int SDL_dummy_ ## name[(x) * 2 - 1] 00161 /** \cond */ 00162 #ifndef DOXYGEN_SHOULD_IGNORE_THIS 00163 SDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1); 00164 SDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1); 00165 SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2); 00166 SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2); 00167 SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4); 00168 SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4); 00169 SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8); 00170 SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8); 00171 #endif /* DOXYGEN_SHOULD_IGNORE_THIS */ 00172 /** \endcond */ 00173 00174 /* Check to make sure enums are the size of ints, for structure packing. 00175 For both Watcom C/C++ and Borland C/C++ the compiler option that makes 00176 enums having the size of an int must be enabled. 00177 This is "-b" for Borland C/C++ and "-ei" for Watcom C/C++ (v11). 00178 */ 00179 00180 /** \cond */ 00181 #ifndef DOXYGEN_SHOULD_IGNORE_THIS 00182 #if !defined(__ANDROID__) 00183 /* TODO: include/SDL_stdinc.h:174: error: size of array 'SDL_dummy_enum' is negative */ 00184 typedef enum 00185 { 00186 DUMMY_ENUM_VALUE 00187 } SDL_DUMMY_ENUM; 00188 00189 SDL_COMPILE_TIME_ASSERT(enum, sizeof(4) == sizeof(int));//SDL_DUMMY_ENUM instead of '4' 00190 #endif 00191 #endif /* DOXYGEN_SHOULD_IGNORE_THIS */ 00192 /** \endcond */ 00193 00194 #include "begin_code.h" 00195 /* Set up for C function definitions, even when using C++ */ 00196 #ifdef __cplusplus 00197 extern "C" { 00198 #endif 00199 00200 #if defined(HAVE_ALLOCA) && !defined(alloca) 00201 # if defined(HAVE_ALLOCA_H) 00202 # include <alloca.h> 00203 # elif defined(__GNUC__) 00204 # define alloca __builtin_alloca 00205 # elif defined(_MSC_VER) 00206 # include <malloc.h> 00207 # define alloca _alloca 00208 # elif defined(__WATCOMC__) 00209 # include <malloc.h> 00210 # elif defined(__BORLANDC__) 00211 # include <malloc.h> 00212 # elif defined(__DMC__) 00213 # include <stdlib.h> 00214 # elif defined(__AIX__) 00215 #pragma alloca 00216 # elif defined(__MRC__) 00217 void *alloca(unsigned); 00218 # else 00219 char *alloca(); 00220 # endif 00221 #endif 00222 #ifdef HAVE_ALLOCA 00223 #define SDL_stack_alloc(type, count) (type*)alloca(sizeof(type)*(count)) 00224 #define SDL_stack_free(data) 00225 #else 00226 #define SDL_stack_alloc(type, count) (type*)SDL_malloc(sizeof(type)*(count)) 00227 #define SDL_stack_free(data) SDL_free(data) 00228 #endif 00229 00230 extern DECLSPEC void *SDLCALL SDL_malloc(size_t size); 00231 extern DECLSPEC void *SDLCALL SDL_calloc(size_t nmemb, size_t size); 00232 extern DECLSPEC void *SDLCALL SDL_realloc(void *mem, size_t size); 00233 extern DECLSPEC void SDLCALL SDL_free(void *mem); 00234 00235 extern DECLSPEC char *SDLCALL SDL_getenv(const char *name); 00236 extern DECLSPEC int SDLCALL SDL_setenv(const char *name, const char *value, int overwrite); 00237 00238 extern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, int (*compare) (const void *, const void *)); 00239 00240 extern DECLSPEC int SDLCALL SDL_abs(int x); 00241 00242 /* !!! FIXME: these have side effects. You probably shouldn't use them. */ 00243 /* !!! FIXME: Maybe we do forceinline functions of SDL_mini, SDL_minf, etc? */ 00244 #define SDL_min(x, y) (((x) < (y)) ? (x) : (y)) 00245 #define SDL_max(x, y) (((x) > (y)) ? (x) : (y)) 00246 00247 extern DECLSPEC int SDLCALL SDL_isdigit(int x); 00248 extern DECLSPEC int SDLCALL SDL_isspace(int x); 00249 extern DECLSPEC int SDLCALL SDL_toupper(int x); 00250 extern DECLSPEC int SDLCALL SDL_tolower(int x); 00251 00252 extern DECLSPEC void *SDLCALL SDL_memset(void *dst, int c, size_t len); 00253 00254 #define SDL_zero(x) SDL_memset(&(x), 0, sizeof((x))) 00255 #define SDL_zerop(x) SDL_memset((x), 0, sizeof(*(x))) 00256 00257 /* Note that memset() is a byte assignment and this is a 32-bit assignment, so they're not directly equivalent. */ 00258 SDL_FORCE_INLINE void SDL_memset4(void *dst, Uint32 val, size_t dwords) 00259 { 00260 #if defined(__GNUC__) && defined(i386) 00261 int u0, u1, u2; 00262 __asm__ __volatile__ ( 00263 "cld \n\t" 00264 "rep ; stosl \n\t" 00265 : "=&D" (u0), "=&a" (u1), "=&c" (u2) 00266 : "0" (dst), "1" (val), "2" (SDL_static_cast(Uint32, dwords)) 00267 : "memory" 00268 ); 00269 #else 00270 size_t _n = (dwords + 3) / 4; 00271 Uint32 *_p = SDL_static_cast(Uint32 *, dst); 00272 Uint32 _val = (val); 00273 if (dwords == 0) 00274 return; 00275 switch (dwords % 4) 00276 { 00277 case 0: do { *_p++ = _val; 00278 case 3: *_p++ = _val; 00279 case 2: *_p++ = _val; 00280 case 1: *_p++ = _val; 00281 } while ( --_n ); 00282 } 00283 #endif 00284 } 00285 00286 00287 extern DECLSPEC void *SDLCALL SDL_memcpy(void *dst, const void *src, size_t len); 00288 00289 SDL_FORCE_INLINE void *SDL_memcpy4(void *dst, const void *src, size_t dwords) 00290 { 00291 return SDL_memcpy(dst, src, dwords * 4); 00292 } 00293 00294 extern DECLSPEC void *SDLCALL SDL_memmove(void *dst, const void *src, size_t len); 00295 extern DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_t len); 00296 00297 extern DECLSPEC size_t SDLCALL SDL_wcslen(const wchar_t *wstr); 00298 extern DECLSPEC size_t SDLCALL SDL_wcslcpy(wchar_t *dst, const wchar_t *src, size_t maxlen); 00299 extern DECLSPEC size_t SDLCALL SDL_wcslcat(wchar_t *dst, const wchar_t *src, size_t maxlen); 00300 00301 extern DECLSPEC size_t SDLCALL SDL_strlen(const char *str); 00302 extern DECLSPEC size_t SDLCALL SDL_strlcpy(char *dst, const char *src, size_t maxlen); 00303 extern DECLSPEC size_t SDLCALL SDL_utf8strlcpy(char *dst, const char *src, size_t dst_bytes); 00304 extern DECLSPEC size_t SDLCALL SDL_strlcat(char *dst, const char *src, size_t maxlen); 00305 extern DECLSPEC char *SDLCALL SDL_strdup(const char *str); 00306 extern DECLSPEC char *SDLCALL SDL_strrev(char *str); 00307 extern DECLSPEC char *SDLCALL SDL_strupr(char *str); 00308 extern DECLSPEC char *SDLCALL SDL_strlwr(char *str); 00309 extern DECLSPEC char *SDLCALL SDL_strchr(const char *str, int c); 00310 extern DECLSPEC char *SDLCALL SDL_strrchr(const char *str, int c); 00311 extern DECLSPEC char *SDLCALL SDL_strstr(const char *haystack, const char *needle); 00312 00313 extern DECLSPEC char *SDLCALL SDL_itoa(int value, char *str, int radix); 00314 extern DECLSPEC char *SDLCALL SDL_uitoa(unsigned int value, char *str, int radix); 00315 extern DECLSPEC char *SDLCALL SDL_ltoa(long value, char *str, int radix); 00316 extern DECLSPEC char *SDLCALL SDL_ultoa(unsigned long value, char *str, int radix); 00317 extern DECLSPEC char *SDLCALL SDL_lltoa(Sint64 value, char *str, int radix); 00318 extern DECLSPEC char *SDLCALL SDL_ulltoa(Uint64 value, char *str, int radix); 00319 00320 extern DECLSPEC int SDLCALL SDL_atoi(const char *str); 00321 extern DECLSPEC double SDLCALL SDL_atof(const char *str); 00322 extern DECLSPEC long SDLCALL SDL_strtol(const char *str, char **endp, int base); 00323 extern DECLSPEC unsigned long SDLCALL SDL_strtoul(const char *str, char **endp, int base); 00324 extern DECLSPEC Sint64 SDLCALL SDL_strtoll(const char *str, char **endp, int base); 00325 extern DECLSPEC Uint64 SDLCALL SDL_strtoull(const char *str, char **endp, int base); 00326 extern DECLSPEC double SDLCALL SDL_strtod(const char *str, char **endp); 00327 00328 extern DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2); 00329 extern DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, size_t maxlen); 00330 extern DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str2); 00331 extern DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t len); 00332 00333 extern DECLSPEC int SDLCALL SDL_sscanf(const char *text, const char *fmt, ...); 00334 extern DECLSPEC int SDLCALL SDL_vsscanf(const char *text, const char *fmt, va_list ap); 00335 extern DECLSPEC int SDLCALL SDL_snprintf(char *text, size_t maxlen, const char *fmt, ...); 00336 extern DECLSPEC int SDLCALL SDL_vsnprintf(char *text, size_t maxlen, const char *fmt, va_list ap); 00337 00338 #ifndef HAVE_M_PI 00339 #ifndef M_PI 00340 #define M_PI 3.14159265358979323846264338327950288 /* pi */ 00341 #endif 00342 #endif 00343 00344 extern DECLSPEC double SDLCALL SDL_acos(double x); 00345 extern DECLSPEC double SDLCALL SDL_asin(double x); 00346 extern DECLSPEC double SDLCALL SDL_atan(double x); 00347 extern DECLSPEC double SDLCALL SDL_atan2(double x, double y); 00348 extern DECLSPEC double SDLCALL SDL_ceil(double x); 00349 extern DECLSPEC double SDLCALL SDL_copysign(double x, double y); 00350 extern DECLSPEC double SDLCALL SDL_cos(double x); 00351 extern DECLSPEC float SDLCALL SDL_cosf(float x); 00352 extern DECLSPEC double SDLCALL SDL_fabs(double x); 00353 extern DECLSPEC double SDLCALL SDL_floor(double x); 00354 extern DECLSPEC double SDLCALL SDL_log(double x); 00355 extern DECLSPEC double SDLCALL SDL_pow(double x, double y); 00356 extern DECLSPEC double SDLCALL SDL_scalbn(double x, int n); 00357 extern DECLSPEC double SDLCALL SDL_sin(double x); 00358 extern DECLSPEC float SDLCALL SDL_sinf(float x); 00359 extern DECLSPEC double SDLCALL SDL_sqrt(double x); 00360 00361 /* The SDL implementation of iconv() returns these error codes */ 00362 #define SDL_ICONV_ERROR (size_t)-1 00363 #define SDL_ICONV_E2BIG (size_t)-2 00364 #define SDL_ICONV_EILSEQ (size_t)-3 00365 #define SDL_ICONV_EINVAL (size_t)-4 00366 00367 /* SDL_iconv_* are now always real symbols/types, not macros or inlined. */ 00368 typedef struct _SDL_iconv_t *SDL_iconv_t; 00369 extern DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode, 00370 const char *fromcode); 00371 extern DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd); 00372 extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, 00373 size_t * inbytesleft, char **outbuf, 00374 size_t * outbytesleft); 00375 /** 00376 * This function converts a string between encodings in one pass, returning a 00377 * string that must be freed with SDL_free() or NULL on error. 00378 */ 00379 extern DECLSPEC char *SDLCALL SDL_iconv_string(const char *tocode, 00380 const char *fromcode, 00381 const char *inbuf, 00382 size_t inbytesleft); 00383 #define SDL_iconv_utf8_locale(S) SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1) 00384 #define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2-INTERNAL", "UTF-8", S, SDL_strlen(S)+1) 00385 #define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4-INTERNAL", "UTF-8", S, SDL_strlen(S)+1) 00386 00387 /* Ends C function definitions when using C++ */ 00388 #ifdef __cplusplus 00389 } 00390 #endif 00391 #include "close_code.h" 00392 00393 #endif /* _SDL_stdinc_h */ 00394 00395 /* vi: set ts=4 sw=4 expandtab: */
Generated on Tue Jul 12 2022 15:10:20 by 1.7.2