Home | History | Annotate | Download | only in SDL
      1 /*
      2     SDL - Simple DirectMedia Layer
      3     Copyright (C) 1997-2012 Sam Lantinga
      4 
      5     This library is free software; you can redistribute it and/or
      6     modify it under the terms of the GNU Library General Public
      7     License as published by the Free Software Foundation; either
      8     version 2 of the License, or (at your option) any later version.
      9 
     10     This library is distributed in the hope that it will be useful,
     11     but WITHOUT ANY WARRANTY; without even the implied warranty of
     12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13     Library General Public License for more details.
     14 
     15     You should have received a copy of the GNU Library General Public
     16     License along with this library; if not, write to the Free
     17     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     18 
     19     Sam Lantinga
     20     slouken (at) libsdl.org
     21 */
     22 
     23 /**
     24  *  @file begin_code.h
     25  *  This file sets things up for C dynamic library function definitions,
     26  *  static inlined functions, and structures aligned at 4-byte alignment.
     27  *  If you don't like ugly C preprocessor code, don't look at this file. :)
     28  */
     29 
     30 /**
     31  *  @file begin_code.h
     32  *  This shouldn't be nested -- included it around code only.
     33  */
     34 #ifdef _begin_code_h
     35 #error Nested inclusion of begin_code.h
     36 #endif
     37 #define _begin_code_h
     38 
     39 /**
     40  *  @def DECLSPEC
     41  *  Some compilers use a special export keyword
     42  */
     43 #ifndef DECLSPEC
     44 # if defined(__BEOS__) || defined(__HAIKU__)
     45 #  if defined(__GNUC__)
     46 #   define DECLSPEC
     47 #  else
     48 #   define DECLSPEC	__declspec(export)
     49 #  endif
     50 # elif defined(__WIN32__)
     51 #  ifdef __BORLANDC__
     52 #   ifdef BUILD_SDL
     53 #    define DECLSPEC
     54 #   else
     55 #    define DECLSPEC	__declspec(dllimport)
     56 #   endif
     57 #  else
     58 #   define DECLSPEC	__declspec(dllexport)
     59 #  endif
     60 # elif defined(__OS2__)
     61 #  ifdef __WATCOMC__
     62 #   ifdef BUILD_SDL
     63 #    define DECLSPEC	__declspec(dllexport)
     64 #   else
     65 #    define DECLSPEC
     66 #   endif
     67 #  elif defined (__GNUC__) && __GNUC__ < 4
     68 #   /* Added support for GCC-EMX <v4.x */
     69 #   /* this is needed for XFree86/OS2 developement */
     70 #   /* F. Ambacher(anakor (at) snafu.de) 05.2008 */
     71 #   ifdef BUILD_SDL
     72 #    define DECLSPEC    __declspec(dllexport)
     73 #   else
     74 #    define DECLSPEC
     75 #   endif
     76 #  else
     77 #   define DECLSPEC
     78 #  endif
     79 # else
     80 #  if defined(__GNUC__) && __GNUC__ >= 4
     81 #   define DECLSPEC	__attribute__ ((visibility("default")))
     82 #  else
     83 #   define DECLSPEC
     84 #  endif
     85 # endif
     86 #endif
     87 
     88 /**
     89  *  @def SDLCALL
     90  *  By default SDL uses the C calling convention
     91  */
     92 #ifndef SDLCALL
     93 # if defined(__WIN32__) && !defined(__GNUC__)
     94 #  define SDLCALL __cdecl
     95 # elif defined(__OS2__)
     96 #  if defined (__GNUC__) && __GNUC__ < 4
     97 #   /* Added support for GCC-EMX <v4.x */
     98 #   /* this is needed for XFree86/OS2 developement */
     99 #   /* F. Ambacher(anakor (at) snafu.de) 05.2008 */
    100 #   define SDLCALL _cdecl
    101 #  else
    102 #   /* On other compilers on OS/2, we use the _System calling convention */
    103 #   /* to be compatible with every compiler */
    104 #   define SDLCALL _System
    105 #  endif
    106 # else
    107 #  define SDLCALL
    108 # endif
    109 #endif /* SDLCALL */
    110 
    111 #ifdef __SYMBIAN32__
    112 #ifndef EKA2
    113 #undef DECLSPEC
    114 #define DECLSPEC
    115 #elif !defined(__WINS__)
    116 #undef DECLSPEC
    117 #define DECLSPEC __declspec(dllexport)
    118 #endif /* !EKA2 */
    119 #endif /* __SYMBIAN32__ */
    120 
    121 /**
    122  *  @file begin_code.h
    123  *  Force structure packing at 4 byte alignment.
    124  *  This is necessary if the header is included in code which has structure
    125  *  packing set to an alternate value, say for loading structures from disk.
    126  *  The packing is reset to the previous value in close_code.h
    127  */
    128 #if defined(_MSC_VER) || defined(__MWERKS__) || defined(__BORLANDC__)
    129 #ifdef _MSC_VER
    130 #pragma warning(disable: 4103)
    131 #endif
    132 #ifdef __BORLANDC__
    133 #pragma nopackwarning
    134 #endif
    135 #ifdef _M_X64
    136 /* Use 8-byte alignment on 64-bit architectures, so pointers are aligned */
    137 #pragma pack(push,8)
    138 #else
    139 #pragma pack(push,4)
    140 #endif
    141 #elif (defined(__MWERKS__) && defined(__MACOS__))
    142 #pragma options align=mac68k4byte
    143 #pragma enumsalwaysint on
    144 #endif /* Compiler needs structure packing set */
    145 
    146 /**
    147  *  @def SDL_INLINE_OKAY
    148  *  Set up compiler-specific options for inlining functions
    149  */
    150 #ifndef SDL_INLINE_OKAY
    151 #ifdef __GNUC__
    152 #define SDL_INLINE_OKAY
    153 #else
    154 /* Add any special compiler-specific cases here */
    155 #if defined(_MSC_VER) || defined(__BORLANDC__) || \
    156     defined(__DMC__) || defined(__SC__) || \
    157     defined(__WATCOMC__) || defined(__LCC__) || \
    158     defined(__DECC) || defined(__EABI__)
    159 #ifndef __inline__
    160 #define __inline__	__inline
    161 #endif
    162 #define SDL_INLINE_OKAY
    163 #else
    164 #if !defined(__MRC__) && !defined(_SGI_SOURCE)
    165 #ifndef __inline__
    166 #define __inline__ inline
    167 #endif
    168 #define SDL_INLINE_OKAY
    169 #endif /* Not a funky compiler */
    170 #endif /* Visual C++ */
    171 #endif /* GNU C */
    172 #endif /* SDL_INLINE_OKAY */
    173 
    174 /**
    175  *  @def __inline__
    176  *  If inlining isn't supported, remove "__inline__", turning static
    177  *  inlined functions into static functions (resulting in code bloat
    178  *  in all files which include the offending header files)
    179  */
    180 #ifndef SDL_INLINE_OKAY
    181 #define __inline__
    182 #endif
    183 
    184 /**
    185  *  @def NULL
    186  *  Apparently this is needed by several Windows compilers
    187  */
    188 #if !defined(__MACH__)
    189 #ifndef NULL
    190 #ifdef __cplusplus
    191 #define NULL 0
    192 #else
    193 #define NULL ((void *)0)
    194 #endif
    195 #endif /* NULL */
    196 #endif /* ! Mac OS X - breaks precompiled headers */
    197