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@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@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@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