cscg22-gearboy

CSCG 2022 Challenge 'Gearboy'
git clone https://git.sinitax.com/sinitax/cscg22-gearboy
Log | Files | Refs | sfeed.txt

SDL_stdinc.h (16614B)


      1/*
      2  Simple DirectMedia Layer
      3  Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
      4
      5  This software is provided 'as-is', without any express or implied
      6  warranty.  In no event will the authors be held liable for any damages
      7  arising from the use of this software.
      8
      9  Permission is granted to anyone to use this software for any purpose,
     10  including commercial applications, and to alter it and redistribute it
     11  freely, subject to the following restrictions:
     12
     13  1. The origin of this software must not be misrepresented; you must not
     14     claim that you wrote the original software. If you use this software
     15     in a product, an acknowledgment in the product documentation would be
     16     appreciated but is not required.
     17  2. Altered source versions must be plainly marked as such, and must not be
     18     misrepresented as being the original software.
     19  3. This notice may not be removed or altered from any source distribution.
     20*/
     21
     22/**
     23 *  \file SDL_stdinc.h
     24 *
     25 *  This is a general header that includes C language support.
     26 */
     27
     28#ifndef _SDL_stdinc_h
     29#define _SDL_stdinc_h
     30
     31#include "SDL_config.h"
     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#ifdef HAVE_MATH_H
     74# if defined(__WINRT__)
     75/* Defining _USE_MATH_DEFINES is required to get M_PI to be defined on
     76   WinRT.  See http://msdn.microsoft.com/en-us/library/4hwaceh6.aspx
     77   for more information.
     78*/
     79#  define _USE_MATH_DEFINES
     80# endif
     81# include <math.h>
     82#endif
     83#ifdef HAVE_FLOAT_H
     84# include <float.h>
     85#endif
     86#if defined(HAVE_ICONV) && defined(HAVE_ICONV_H)
     87# include <iconv.h>
     88#endif
     89
     90/**
     91 *  The number of elements in an array.
     92 */
     93#define SDL_arraysize(array)    (sizeof(array)/sizeof(array[0]))
     94#define SDL_TABLESIZE(table)    SDL_arraysize(table)
     95
     96/**
     97 *  \name Cast operators
     98 *
     99 *  Use proper C++ casts when compiled as C++ to be compatible with the option
    100 *  -Wold-style-cast of GCC (and -Werror=old-style-cast in GCC 4.2 and above).
    101 */
    102/* @{ */
    103#ifdef __cplusplus
    104#define SDL_reinterpret_cast(type, expression) reinterpret_cast<type>(expression)
    105#define SDL_static_cast(type, expression) static_cast<type>(expression)
    106#define SDL_const_cast(type, expression) const_cast<type>(expression)
    107#else
    108#define SDL_reinterpret_cast(type, expression) ((type)(expression))
    109#define SDL_static_cast(type, expression) ((type)(expression))
    110#define SDL_const_cast(type, expression) ((type)(expression))
    111#endif
    112/* @} *//* Cast operators */
    113
    114/* Define a four character code as a Uint32 */
    115#define SDL_FOURCC(A, B, C, D) \
    116    ((SDL_static_cast(Uint32, SDL_static_cast(Uint8, (A))) << 0) | \
    117     (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (B))) << 8) | \
    118     (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (C))) << 16) | \
    119     (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (D))) << 24))
    120
    121/**
    122 *  \name Basic data types
    123 */
    124/* @{ */
    125
    126typedef enum
    127{
    128    SDL_FALSE = 0,
    129    SDL_TRUE = 1
    130} SDL_bool;
    131
    132/**
    133 * \brief A signed 8-bit integer type.
    134 */
    135typedef int8_t Sint8;
    136/**
    137 * \brief An unsigned 8-bit integer type.
    138 */
    139typedef uint8_t Uint8;
    140/**
    141 * \brief A signed 16-bit integer type.
    142 */
    143typedef int16_t Sint16;
    144/**
    145 * \brief An unsigned 16-bit integer type.
    146 */
    147typedef uint16_t Uint16;
    148/**
    149 * \brief A signed 32-bit integer type.
    150 */
    151typedef int32_t Sint32;
    152/**
    153 * \brief An unsigned 32-bit integer type.
    154 */
    155typedef uint32_t Uint32;
    156
    157/**
    158 * \brief A signed 64-bit integer type.
    159 */
    160typedef int64_t Sint64;
    161/**
    162 * \brief An unsigned 64-bit integer type.
    163 */
    164typedef uint64_t Uint64;
    165
    166/* @} *//* Basic data types */
    167
    168/* Make sure we have macros for printing 64 bit values.
    169 * <stdint.h> should define these but this is not true all platforms.
    170 * (for example win32) */
    171#ifndef SDL_PRIs64
    172#ifdef PRIs64
    173#define SDL_PRIs64 PRIs64
    174#elif defined(__WIN32__)
    175#define SDL_PRIs64 "I64"
    176#else
    177#define SDL_PRIs64 "lld"
    178#endif
    179#endif
    180#ifndef SDL_PRIu64
    181#ifdef PRIu64
    182#define SDL_PRIu64 PRIu64
    183#elif defined(__WIN32__)
    184#define SDL_PRIu64 "I64u"
    185#else
    186#define SDL_PRIu64 "llu"
    187#endif
    188#endif
    189
    190/* Annotations to help code analysis tools */
    191#ifdef SDL_DISABLE_ANALYZE_MACROS
    192#define SDL_IN_BYTECAP(x)
    193#define SDL_INOUT_Z_CAP(x)
    194#define SDL_OUT_Z_CAP(x)
    195#define SDL_OUT_CAP(x)
    196#define SDL_OUT_BYTECAP(x)
    197#define SDL_OUT_Z_BYTECAP(x)
    198#define SDL_PRINTF_FORMAT_STRING
    199#define SDL_SCANF_FORMAT_STRING
    200#define SDL_PRINTF_VARARG_FUNC( fmtargnumber )
    201#define SDL_SCANF_VARARG_FUNC( fmtargnumber )
    202#else
    203#if _MSC_VER >= 1600 /* VS 2010 and above */
    204#include <sal.h>
    205
    206#define SDL_IN_BYTECAP(x) _In_bytecount_(x)
    207#define SDL_INOUT_Z_CAP(x) _Inout_z_cap_(x)
    208#define SDL_OUT_Z_CAP(x) _Out_z_cap_(x)
    209#define SDL_OUT_CAP(x) _Out_cap_(x)
    210#define SDL_OUT_BYTECAP(x) _Out_bytecap_(x)
    211#define SDL_OUT_Z_BYTECAP(x) _Out_z_bytecap_(x)
    212
    213#define SDL_PRINTF_FORMAT_STRING _Printf_format_string_
    214#define SDL_SCANF_FORMAT_STRING _Scanf_format_string_impl_
    215#else
    216#define SDL_IN_BYTECAP(x)
    217#define SDL_INOUT_Z_CAP(x)
    218#define SDL_OUT_Z_CAP(x)
    219#define SDL_OUT_CAP(x)
    220#define SDL_OUT_BYTECAP(x)
    221#define SDL_OUT_Z_BYTECAP(x)
    222#define SDL_PRINTF_FORMAT_STRING
    223#define SDL_SCANF_FORMAT_STRING
    224#endif
    225#if defined(__GNUC__)
    226#define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __printf__, fmtargnumber, fmtargnumber+1 )))
    227#define SDL_SCANF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __scanf__, fmtargnumber, fmtargnumber+1 )))
    228#else
    229#define SDL_PRINTF_VARARG_FUNC( fmtargnumber )
    230#define SDL_SCANF_VARARG_FUNC( fmtargnumber )
    231#endif
    232#endif /* SDL_DISABLE_ANALYZE_MACROS */
    233
    234#define SDL_COMPILE_TIME_ASSERT(name, x)               \
    235       typedef int SDL_dummy_ ## name[(x) * 2 - 1]
    236/** \cond */
    237#ifndef DOXYGEN_SHOULD_IGNORE_THIS
    238SDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1);
    239SDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1);
    240SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2);
    241SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2);
    242SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4);
    243SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4);
    244SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8);
    245SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8);
    246#endif /* DOXYGEN_SHOULD_IGNORE_THIS */
    247/** \endcond */
    248
    249/* Check to make sure enums are the size of ints, for structure packing.
    250   For both Watcom C/C++ and Borland C/C++ the compiler option that makes
    251   enums having the size of an int must be enabled.
    252   This is "-b" for Borland C/C++ and "-ei" for Watcom C/C++ (v11).
    253*/
    254
    255/** \cond */
    256#ifndef DOXYGEN_SHOULD_IGNORE_THIS
    257#if !defined(__ANDROID__)
    258   /* TODO: include/SDL_stdinc.h:174: error: size of array 'SDL_dummy_enum' is negative */
    259typedef enum
    260{
    261    DUMMY_ENUM_VALUE
    262} SDL_DUMMY_ENUM;
    263
    264SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int));
    265#endif
    266#endif /* DOXYGEN_SHOULD_IGNORE_THIS */
    267/** \endcond */
    268
    269#include "begin_code.h"
    270/* Set up for C function definitions, even when using C++ */
    271#ifdef __cplusplus
    272extern "C" {
    273#endif
    274
    275#if defined(HAVE_ALLOCA) && !defined(alloca)
    276# if defined(HAVE_ALLOCA_H)
    277#  include <alloca.h>
    278# elif defined(__GNUC__)
    279#  define alloca __builtin_alloca
    280# elif defined(_MSC_VER)
    281#  include <malloc.h>
    282#  define alloca _alloca
    283# elif defined(__WATCOMC__)
    284#  include <malloc.h>
    285# elif defined(__BORLANDC__)
    286#  include <malloc.h>
    287# elif defined(__DMC__)
    288#  include <stdlib.h>
    289# elif defined(__AIX__)
    290#pragma alloca
    291# elif defined(__MRC__)
    292void *alloca(unsigned);
    293# else
    294char *alloca();
    295# endif
    296#endif
    297#ifdef HAVE_ALLOCA
    298#define SDL_stack_alloc(type, count)    (type*)alloca(sizeof(type)*(count))
    299#define SDL_stack_free(data)
    300#else
    301#define SDL_stack_alloc(type, count)    (type*)SDL_malloc(sizeof(type)*(count))
    302#define SDL_stack_free(data)            SDL_free(data)
    303#endif
    304
    305extern DECLSPEC void *SDLCALL SDL_malloc(size_t size);
    306extern DECLSPEC void *SDLCALL SDL_calloc(size_t nmemb, size_t size);
    307extern DECLSPEC void *SDLCALL SDL_realloc(void *mem, size_t size);
    308extern DECLSPEC void SDLCALL SDL_free(void *mem);
    309
    310extern DECLSPEC char *SDLCALL SDL_getenv(const char *name);
    311extern DECLSPEC int SDLCALL SDL_setenv(const char *name, const char *value, int overwrite);
    312
    313extern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, int (*compare) (const void *, const void *));
    314
    315extern DECLSPEC int SDLCALL SDL_abs(int x);
    316
    317/* !!! FIXME: these have side effects. You probably shouldn't use them. */
    318/* !!! FIXME: Maybe we do forceinline functions of SDL_mini, SDL_minf, etc? */
    319#define SDL_min(x, y) (((x) < (y)) ? (x) : (y))
    320#define SDL_max(x, y) (((x) > (y)) ? (x) : (y))
    321
    322extern DECLSPEC int SDLCALL SDL_isdigit(int x);
    323extern DECLSPEC int SDLCALL SDL_isspace(int x);
    324extern DECLSPEC int SDLCALL SDL_toupper(int x);
    325extern DECLSPEC int SDLCALL SDL_tolower(int x);
    326
    327extern DECLSPEC void *SDLCALL SDL_memset(SDL_OUT_BYTECAP(len) void *dst, int c, size_t len);
    328
    329#define SDL_zero(x) SDL_memset(&(x), 0, sizeof((x)))
    330#define SDL_zerop(x) SDL_memset((x), 0, sizeof(*(x)))
    331
    332/* Note that memset() is a byte assignment and this is a 32-bit assignment, so they're not directly equivalent. */
    333SDL_FORCE_INLINE void SDL_memset4(void *dst, Uint32 val, size_t dwords)
    334{
    335#if defined(__GNUC__) && defined(i386)
    336    int u0, u1, u2;
    337    __asm__ __volatile__ (
    338        "cld \n\t"
    339        "rep ; stosl \n\t"
    340        : "=&D" (u0), "=&a" (u1), "=&c" (u2)
    341        : "0" (dst), "1" (val), "2" (SDL_static_cast(Uint32, dwords))
    342        : "memory"
    343    );
    344#else
    345    size_t _n = (dwords + 3) / 4;
    346    Uint32 *_p = SDL_static_cast(Uint32 *, dst);
    347    Uint32 _val = (val);
    348    if (dwords == 0)
    349        return;
    350    switch (dwords % 4)
    351    {
    352        case 0: do {    *_p++ = _val;
    353        case 3:         *_p++ = _val;
    354        case 2:         *_p++ = _val;
    355        case 1:         *_p++ = _val;
    356        } while ( --_n );
    357    }
    358#endif
    359}
    360
    361
    362extern DECLSPEC void *SDLCALL SDL_memcpy(SDL_OUT_BYTECAP(len) void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len);
    363
    364SDL_FORCE_INLINE void *SDL_memcpy4(SDL_OUT_BYTECAP(dwords*4) void *dst, SDL_IN_BYTECAP(dwords*4) const void *src, size_t dwords)
    365{
    366    return SDL_memcpy(dst, src, dwords * 4);
    367}
    368
    369extern DECLSPEC void *SDLCALL SDL_memmove(SDL_OUT_BYTECAP(len) void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len);
    370extern DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_t len);
    371
    372extern DECLSPEC size_t SDLCALL SDL_wcslen(const wchar_t *wstr);
    373extern DECLSPEC size_t SDLCALL SDL_wcslcpy(SDL_OUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen);
    374extern DECLSPEC size_t SDLCALL SDL_wcslcat(SDL_INOUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen);
    375
    376extern DECLSPEC size_t SDLCALL SDL_strlen(const char *str);
    377extern DECLSPEC size_t SDLCALL SDL_strlcpy(SDL_OUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen);
    378extern DECLSPEC size_t SDLCALL SDL_utf8strlcpy(SDL_OUT_Z_CAP(dst_bytes) char *dst, const char *src, size_t dst_bytes);
    379extern DECLSPEC size_t SDLCALL SDL_strlcat(SDL_INOUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen);
    380extern DECLSPEC char *SDLCALL SDL_strdup(const char *str);
    381extern DECLSPEC char *SDLCALL SDL_strrev(char *str);
    382extern DECLSPEC char *SDLCALL SDL_strupr(char *str);
    383extern DECLSPEC char *SDLCALL SDL_strlwr(char *str);
    384extern DECLSPEC char *SDLCALL SDL_strchr(const char *str, int c);
    385extern DECLSPEC char *SDLCALL SDL_strrchr(const char *str, int c);
    386extern DECLSPEC char *SDLCALL SDL_strstr(const char *haystack, const char *needle);
    387
    388extern DECLSPEC char *SDLCALL SDL_itoa(int value, char *str, int radix);
    389extern DECLSPEC char *SDLCALL SDL_uitoa(unsigned int value, char *str, int radix);
    390extern DECLSPEC char *SDLCALL SDL_ltoa(long value, char *str, int radix);
    391extern DECLSPEC char *SDLCALL SDL_ultoa(unsigned long value, char *str, int radix);
    392extern DECLSPEC char *SDLCALL SDL_lltoa(Sint64 value, char *str, int radix);
    393extern DECLSPEC char *SDLCALL SDL_ulltoa(Uint64 value, char *str, int radix);
    394
    395extern DECLSPEC int SDLCALL SDL_atoi(const char *str);
    396extern DECLSPEC double SDLCALL SDL_atof(const char *str);
    397extern DECLSPEC long SDLCALL SDL_strtol(const char *str, char **endp, int base);
    398extern DECLSPEC unsigned long SDLCALL SDL_strtoul(const char *str, char **endp, int base);
    399extern DECLSPEC Sint64 SDLCALL SDL_strtoll(const char *str, char **endp, int base);
    400extern DECLSPEC Uint64 SDLCALL SDL_strtoull(const char *str, char **endp, int base);
    401extern DECLSPEC double SDLCALL SDL_strtod(const char *str, char **endp);
    402
    403extern DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2);
    404extern DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, size_t maxlen);
    405extern DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str2);
    406extern DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t len);
    407
    408extern DECLSPEC int SDLCALL SDL_sscanf(const char *text, SDL_SCANF_FORMAT_STRING const char *fmt, ...) SDL_SCANF_VARARG_FUNC(2);
    409extern DECLSPEC int SDLCALL SDL_vsscanf(const char *text, const char *fmt, va_list ap);
    410extern DECLSPEC int SDLCALL SDL_snprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, SDL_PRINTF_FORMAT_STRING const char *fmt, ... ) SDL_PRINTF_VARARG_FUNC(3);
    411extern DECLSPEC int SDLCALL SDL_vsnprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, const char *fmt, va_list ap);
    412
    413#ifndef HAVE_M_PI
    414#ifndef M_PI
    415#define M_PI    3.14159265358979323846264338327950288   /* pi */
    416#endif
    417#endif
    418
    419extern DECLSPEC double SDLCALL SDL_acos(double x);
    420extern DECLSPEC double SDLCALL SDL_asin(double x);
    421extern DECLSPEC double SDLCALL SDL_atan(double x);
    422extern DECLSPEC double SDLCALL SDL_atan2(double x, double y);
    423extern DECLSPEC double SDLCALL SDL_ceil(double x);
    424extern DECLSPEC double SDLCALL SDL_copysign(double x, double y);
    425extern DECLSPEC double SDLCALL SDL_cos(double x);
    426extern DECLSPEC float SDLCALL SDL_cosf(float x);
    427extern DECLSPEC double SDLCALL SDL_fabs(double x);
    428extern DECLSPEC double SDLCALL SDL_floor(double x);
    429extern DECLSPEC double SDLCALL SDL_log(double x);
    430extern DECLSPEC double SDLCALL SDL_pow(double x, double y);
    431extern DECLSPEC double SDLCALL SDL_scalbn(double x, int n);
    432extern DECLSPEC double SDLCALL SDL_sin(double x);
    433extern DECLSPEC float SDLCALL SDL_sinf(float x);
    434extern DECLSPEC double SDLCALL SDL_sqrt(double x);
    435extern DECLSPEC float SDLCALL SDL_sqrtf(float x);
    436extern DECLSPEC double SDLCALL SDL_tan(double x);
    437extern DECLSPEC float SDLCALL SDL_tanf(float x);
    438
    439/* The SDL implementation of iconv() returns these error codes */
    440#define SDL_ICONV_ERROR     (size_t)-1
    441#define SDL_ICONV_E2BIG     (size_t)-2
    442#define SDL_ICONV_EILSEQ    (size_t)-3
    443#define SDL_ICONV_EINVAL    (size_t)-4
    444
    445/* SDL_iconv_* are now always real symbols/types, not macros or inlined. */
    446typedef struct _SDL_iconv_t *SDL_iconv_t;
    447extern DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode,
    448                                                   const char *fromcode);
    449extern DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd);
    450extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf,
    451                                         size_t * inbytesleft, char **outbuf,
    452                                         size_t * outbytesleft);
    453/**
    454 *  This function converts a string between encodings in one pass, returning a
    455 *  string that must be freed with SDL_free() or NULL on error.
    456 */
    457extern DECLSPEC char *SDLCALL SDL_iconv_string(const char *tocode,
    458                                               const char *fromcode,
    459                                               const char *inbuf,
    460                                               size_t inbytesleft);
    461#define SDL_iconv_utf8_locale(S)    SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1)
    462#define SDL_iconv_utf8_ucs2(S)      (Uint16 *)SDL_iconv_string("UCS-2-INTERNAL", "UTF-8", S, SDL_strlen(S)+1)
    463#define SDL_iconv_utf8_ucs4(S)      (Uint32 *)SDL_iconv_string("UCS-4-INTERNAL", "UTF-8", S, SDL_strlen(S)+1)
    464
    465/* Ends C function definitions when using C++ */
    466#ifdef __cplusplus
    467}
    468#endif
    469#include "close_code.h"
    470
    471#endif /* _SDL_stdinc_h */
    472
    473/* vi: set ts=4 sw=4 expandtab: */