📄 sdl_stdinc.h
字号:
/* SDL - Simple DirectMedia Layer Copyright (C) 1997-2006 Sam Lantinga This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Sam Lantinga slouken@libsdl.org*//* This is a general header that includes C language support */#ifndef _SDL_stdinc_h#define _SDL_stdinc_h#include "SDL_config.h"#ifdef HAVE_SYS_TYPES_H#include <sys/types.h>#endif#ifdef HAVE_STDIO_H#include <stdio.h>#endif#if defined(STDC_HEADERS)# include <stdlib.h># include <stddef.h># include <stdarg.h>#else# if defined(HAVE_STDLIB_H)# include <stdlib.h># elif defined(HAVE_MALLOC_H)# include <malloc.h># endif# if defined(HAVE_STDDEF_H)# include <stddef.h># endif# if defined(HAVE_STDARG_H)# include <stdarg.h># endif#endif#ifdef HAVE_STRING_H# if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H)# include <memory.h># endif# include <string.h>#endif#ifdef HAVE_STRINGS_H# include <strings.h>#endif#if defined(HAVE_INTTYPES_H)# include <inttypes.h>#elif defined(HAVE_STDINT_H)# include <stdint.h>#endif#ifdef HAVE_CTYPE_H# include <ctype.h>#endif#ifdef HAVE_ICONV_H# include <iconv.h>#endif/* The number of elements in an array */#define SDL_arraysize(array) (sizeof(array)/sizeof(array[0]))#define SDL_TABLESIZE(table) SDL_arraysize(table)/* Basic data types */typedef enum SDL_bool { SDL_FALSE = 0, SDL_TRUE = 1} SDL_bool;typedef int8_t Sint8;typedef uint8_t Uint8;typedef int16_t Sint16;typedef uint16_t Uint16;typedef int32_t Sint32;typedef uint32_t Uint32;#ifdef SDL_HAS_64BIT_TYPEtypedef int64_t Sint64;#ifndef SYMBIAN32_GCCEtypedef uint64_t Uint64;#endif#else/* This is really just a hack to prevent the compiler from complaining */typedef struct { Uint32 hi; Uint32 lo;} Uint64, Sint64;#endif/* Make sure the types really have the right sizes */#define SDL_COMPILE_TIME_ASSERT(name, x) \ typedef int SDL_dummy_ ## name[(x) * 2 - 1]SDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1);SDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1);SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2);SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2);SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4);SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4);SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8);SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8);/* Check to make sure enums are the size of ints, for structure packing. For both Watcom C/C++ and Borland C/C++ the compiler option that makes enums having the size of an int must be enabled. This is "-b" for Borland C/C++ and "-ei" for Watcom C/C++ (v11).*//* Enable enums always int in CodeWarrior (for MPW use "-enum int") */#ifdef __MWERKS__#pragma enumsalwaysint on#endiftypedef enum { DUMMY_ENUM_VALUE} SDL_DUMMY_ENUM;#ifndef __NDS__SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int));#endif#include "begin_code.h"/* Set up for C function definitions, even when using C++ */#ifdef __cplusplusextern "C" {#endif#ifdef HAVE_MALLOC#define SDL_malloc malloc#elseextern DECLSPEC void * SDLCALL SDL_malloc(size_t size);#endif#ifdef HAVE_CALLOC#define SDL_calloc calloc#elseextern DECLSPEC void * SDLCALL SDL_calloc(size_t nmemb, size_t size);#endif#ifdef HAVE_REALLOC#define SDL_realloc realloc#elseextern DECLSPEC void * SDLCALL SDL_realloc(void *mem, size_t size);#endif#ifdef HAVE_FREE#define SDL_free free#elseextern DECLSPEC void SDLCALL SDL_free(void *mem);#endif#if defined(HAVE_ALLOCA) && !defined(alloca)# if defined(HAVE_ALLOCA_H)# include <alloca.h># elif defined(__GNUC__)# define alloca __builtin_alloca# elif defined(_MSC_VER)# include <malloc.h># define alloca _alloca# elif defined(__WATCOMC__)# include <malloc.h># elif defined(__BORLANDC__)# include <malloc.h># elif defined(__DMC__)# include <stdlib.h># elif defined(__AIX__) #pragma alloca# elif defined(__MRC__) void *alloca (unsigned);# else char *alloca ();# endif#endif#ifdef HAVE_ALLOCA#define SDL_stack_alloc(type, count) (type*)alloca(sizeof(type)*(count))#define SDL_stack_free(data)#else#define SDL_stack_alloc(type, count) (type*)SDL_malloc(sizeof(type)*(count))#define SDL_stack_free(data) SDL_free(data)#endif#ifdef HAVE_GETENV#define SDL_getenv getenv#elseextern DECLSPEC char * SDLCALL SDL_getenv(const char *name);#endif#ifdef HAVE_PUTENV#define SDL_putenv putenv#elseextern DECLSPEC int SDLCALL SDL_putenv(const char *variable);#endif#ifdef HAVE_QSORT#define SDL_qsort qsort#elseextern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, int (*compare)(const void *, const void *));#endif#ifdef HAVE_ABS#define SDL_abs abs#else#define SDL_abs(X) ((X) < 0 ? -(X) : (X))#endif#define SDL_min(x, y) (((x) < (y)) ? (x) : (y))#define SDL_max(x, y) (((x) > (y)) ? (x) : (y))#ifdef HAVE_CTYPE_H#define SDL_isdigit(X) isdigit(X)#define SDL_isspace(X) isspace(X)#define SDL_toupper(X) toupper(X)#define SDL_tolower(X) tolower(X)#else#define SDL_isdigit(X) (((X) >= '0') && ((X) <= '9'))#define SDL_isspace(X) (((X) == ' ') || ((X) == '\t') || ((X) == '\r') || ((X) == '\n'))#define SDL_toupper(X) (((X) >= 'a') && ((X) <= 'z') ? ('A'+((X)-'a')) : (X))#define SDL_tolower(X) (((X) >= 'A') && ((X) <= 'Z') ? ('a'+((X)-'A')) : (X))#endif#ifdef HAVE_MEMSET#define SDL_memset memset#elseextern DECLSPEC void * SDLCALL SDL_memset(void *dst, int c, size_t len);#endif#if defined(__GNUC__) && defined(i386)#define SDL_memset4(dst, val, len) \do { \ int u0, u1, u2; \ __asm__ __volatile__ ( \ "cld\n\t" \ "rep ; stosl\n\t" \ : "=&D" (u0), "=&a" (u1), "=&c" (u2) \ : "0" (dst), "1" (val), "2" ((Uint32)(len)) \ : "memory" ); \} while(0)#endif#ifndef SDL_memset4#define SDL_memset4(dst, val, len) \do { \ unsigned _count = (len); \ unsigned _n = (_count + 3) / 4; \ Uint32 *_p = (Uint32 *)(dst); \ Uint32 _val = (val); \ switch (_count % 4) { \ case 0: do { *_p++ = _val; \ case 3: *_p++ = _val; \ case 2: *_p++ = _val; \ case 1: *_p++ = _val; \ } while ( --_n ); \ } \} while(0)#endif/* We can count on memcpy existing on Mac OS X and being well-tuned. */#if defined(__MACH__) && defined(__APPLE__)#define SDL_memcpy(dst, src, len) memcpy(dst, src, len)#elif defined(__GNUC__) && defined(i386)#define SDL_memcpy(dst, src, len) \do { \ int u0, u1, u2; \ __asm__ __volatile__ ( \ "cld\n\t" \ "rep ; movsl\n\t" \ "testb $2,%b4\n\t" \ "je 1f\n\t" \ "movsw\n" \ "1:\ttestb $1,%b4\n\t" \ "je 2f\n\t" \ "movsb\n" \ "2:" \ : "=&c" (u0), "=&D" (u1), "=&S" (u2) \ : "0" ((unsigned)(len)/4), "q" (len), "1" (dst),"2" (src) \ : "memory" ); \} while(0)#endif#ifndef SDL_memcpy#ifdef HAVE_MEMCPY#define SDL_memcpy memcpy#elif defined(HAVE_BCOPY)#define SDL_memcpy(d, s, n) bcopy((s), (d), (n))#else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -