SDL Library

Dependents:   H261_decoder

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SDL_stdinc.h Source File

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: */