## Public API Reference

- Main Page
- Modules
- Namespaces
- Classes
- Files
- Related Pages

- File List
- File Members

# csutil/win32/csosdefs.h

    00001 /*
    00002     Copyright (C) 1998 by Jorrit Tyberghein
    00003     Written by Andrew Zabolotny <bit@eltech.ru>
    00004
    00005     This library is free software; you can redistribute it and/or
    00006     modify it under the terms of the GNU Library General Public
    00007     License as published by the Free Software Foundation; either
    00008     version 2 of the License, or (at your option) any later version.
    00009
    00010     This library is distributed in the hope that it will be useful,
    00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
    00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    00013     Library General Public License for more details.
    00014
    00015     You should have received a copy of the GNU Library General Public
    00016     License along with this library; if not, write to the Free
    00017     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
    00018 */
    00019
    00020 #ifndef __CS_CSOSDEFS_H__
    00021 #define __CS_CSOSDEFS_H__
    00022
    00023 #define CS_EXPORT_SYM_DLL       __declspec(dllexport)
    00024 #define CS_IMPORT_SYM_DLL       __declspec(dllimport)
    00025
    00026 #ifdef CS_BUILD_SHARED_LIBS
    00027   #define CS_EXPORT_SYM CS_EXPORT_SYM_DLL
    00028   #define CS_IMPORT_SYM CS_IMPORT_SYM_DLL
    00029 #else
    00030   #define CS_EXPORT_SYM
    00031   #define CS_IMPORT_SYM
    00032 #endif // CS_BUILD_SHARED_LIBS
    00033
    00034 #if defined(CS_COMPILER_MSVC)
    00035   //#pragma warning(disable:4097)   // use of xxx as synonym for a classname
    00036   //#pragma warning(disable:4099)   // type seen as both 'struct' and `class'
    00037   //#pragma warning(disable:4100)   // Use of void* as a formal function parameter
    00038   //#pragma warning(disable:4102)   // 'label' : unreferenced label
    00039   //#pragma warning(disable:4146)   /* unary minus operator applied to unsigned
    00040   //                                 * type, result still unsigned */
    00041   //#pragma warning(disable:4201)   // VC6: structure/ union without name.
    00042   #pragma warning(disable:4244)   // conversion from 'double' to 'float'
    00043   #pragma warning(disable:4250)   // '...' inherits '..' via dominance
    00044   //#pragma warning(disable:4251)   /* class needs to have dll-interface to be
    00045   //                               * used by clients */
    00046   //#pragma warning(disable:4275)   /* non-DLL-interface used as base for
    00047   //                                 * DLL-interface */
    00048   //#pragma warning(disable:4291)   // no matching operator delete found
    00049   #pragma warning(disable:4312)   /* 'variable' : conversion from 'type' to
    00050                                    * 'type' of greater size */
    00051   #pragma warning(disable:4345)   /* VC7.1: an object of POD type constructed
    00052                                    * with an initializer of the form () will
    00053                                    * be default-initialized */
    00054   #pragma warning(disable:4355)   // 'this' used in base member initializer list
    00055   //#pragma warning(disable:4390)   // Empty control statement
    00056   //#pragma warning(disable:4505)   /* 'function' : unreferenced local function
    00057   //                                 * has been removed */
    00058   //#pragma warning(disable:4611)   /* interaction between _setjmp and C++
    00059   //                                 * destructors not portable */
    00060   //#pragma warning(disable:4702)   // Unreachable Code
    00061   //#pragma warning(disable:4706)   // Assignment in conditional expression
    00062   //#pragma warning(disable:4710)   // function not inlined
    00063 //  #pragma warning(disable:4711)   /* function 'function' selected for inline
    00064 //                                 * expansion */
    00065 //  #pragma warning(disable:4786)   /* VC6: identifier was truncated to '255'
    00066 //                                 * characters in the browser information */
    00067 //  #pragma warning(disable:4800)   // Forcing value to bool
    00068   //#pragma warning(disable:4805)   // unsafe mix of bool and int.
    00069
    00070 //  #pragma warning(default:4265)   /* class has virtual functions, but
    00071 //                                 * destructor is not virtual */
    00072
    00073   #pragma inline_depth (255)
    00074   #pragma inline_recursion (on)
    00075   #pragma auto_inline (on)
    00076
    00077   #define CS_FORCEINLINE __forceinline
    00078
    00079   #pragma intrinsic (memset, memcpy, memcmp)
    00080   #pragma intrinsic (strcpy, strcmp, strlen, strcat)
    00081   #pragma intrinsic (abs, fabs)
    00082
    00083   #if defined(__CRYSTAL_SPACE__) && !defined(CS_DEBUG)
    00084     #pragma code_seg("CSpace")    // Just for fun :)
    00085     // However, doing this in debug builds prevents Edit & Continue from
    00086     // functioning properly :/
    00087   #endif
    00088
    00089   // VC8 quirks
    00090   #if (_MSC_VER >= 1400)
    00091     // Also note quirk in csconfig.h
    00092
    00093     // Nothing else atm.
    00094   #endif
    00095 #endif
    00096
    00097 #ifndef WINVER
    00098 #define WINVER 0x0400
    00099 #endif
    00100
    00101 // Although MSVC6 generally supports templated functions within templated
    00102 // classes, nevertheless it crashes and burns horribly when arguments to those
    00103 // functions are function-pointers or functors.  In fact, such usage triggers a
    00104 // slew of bugs, mostly "internal compiler error" but also several other
    00105 // Worse, the bugs manifest in "random" locations throughout the project, often
    00106 // in completely unrelated code.  Consequently, instruct csArray<> to avoid
    00107 // such usage for MSVC6.
    00108 #if defined(CS_COMPILER_MSVC) && (_MSC_VER < 1300)
    00109 #define CSARRAY_INHIBIT_TYPED_KEYS
    00110 #endif
    00111
    00112 // So many things require this. IF you have an issue with something defined
    00113 // in it then undef that def here.
    00114
    00115 #if defined(CS_COMPILER_GCC)
    00116
    00117 // From the w32api header files:
    00118
    00119 #if defined(__i686__) && !defined(_M_IX86)
    00120 #define _M_IX86 600
    00121 #elif defined(__i586__) && !defined(_M_IX86)
    00122 #define _M_IX86 500
    00123 #elif defined(__i486__) && !defined(_M_IX86)
    00124 #define _M_IX86 400
    00125 #elif defined(__i386__) && !defined(_M_IX86)
    00126 #define _M_IX86 300
    00127 #endif
    00128 #if defined(_M_IX86) && !defined(_X86_)
    00129 #define _X86_
    00130 #endif
    00131
    00132 #ifdef __GNUC__
    00133 #ifndef NONAMELESSUNION
    00134 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
    00135 #define _ANONYMOUS_UNION __extension__
    00136 #define _ANONYMOUS_STRUCT __extension__
    00137 #else
    00138 #if defined(__cplusplus)
    00139 #define _ANONYMOUS_UNION __extension__
    00140 #endif /* __cplusplus */
    00141 #endif /* __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) */
    00142 #endif /* NONAMELESSUNION */
    00143 #endif /* __GNUC__ */
    00144
    00145 #ifndef _ANONYMOUS_UNION
    00146 #define _ANONYMOUS_UNION
    00147 #define _UNION_NAME(x) x
    00148 #define DUMMYUNIONNAME  u
    00149 #define DUMMYUNIONNAME2 u2
    00150 #define DUMMYUNIONNAME3 u3
    00151 #define DUMMYUNIONNAME4 u4
    00152 #define DUMMYUNIONNAME5 u5
    00153 #define DUMMYUNIONNAME6 u6
    00154 #define DUMMYUNIONNAME7 u7
    00155 #define DUMMYUNIONNAME8 u8
    00156 #else
    00157 #define _UNION_NAME(x)
    00158 #define DUMMYUNIONNAME
    00159 #define DUMMYUNIONNAME2
    00160 #define DUMMYUNIONNAME3
    00161 #define DUMMYUNIONNAME4
    00162 #define DUMMYUNIONNAME5
    00163 #define DUMMYUNIONNAME6
    00164 #define DUMMYUNIONNAME7
    00165 #define DUMMYUNIONNAME8
    00166 #endif
    00167 #ifndef _ANONYMOUS_STRUCT
    00168 #define _ANONYMOUS_STRUCT
    00169 #define _STRUCT_NAME(x) x
    00170 #define DUMMYSTRUCTNAME s
    00171 #define DUMMYSTRUCTNAME2 s2
    00172 #define DUMMYSTRUCTNAME3 s3
    00173 #else
    00174 #define _STRUCT_NAME(x)
    00175 #define DUMMYSTRUCTNAME
    00176 #define DUMMYSTRUCTNAME2
    00177 #define DUMMYSTRUCTNAME3
    00178 #endif
    00179
    00180 #else
    00181
    00182 #if !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && \
    00183      defined(_M_IX86)
    00184 #define _X86_
    00185 #endif
    00186
    00187 #if !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && \
    00188      defined(_M_AMD64)
    00189 #define _AMD64_
    00190 #endif
    00191
    00192 #if !defined(_X86_) && !defined(_M_IX86) && !defined(_AMD64_) && \
    00193      defined(_M_IA64) && !defined(_IA64_)
    00194 #define _IA64_
    00195 #endif
    00196
    00197 #endif
    00198
    00199 #ifndef __CYGWIN32__
    00200 #include <excpt.h>
    00201 #endif
    00202 #include <stdarg.h>
    00203 #include <windef.h>
    00204 #include <winbase.h>
    00205 #include <malloc.h>
    00206 #include <sys/types.h>
    00207 #include <sys/stat.h>
    00208 #ifdef CS_HAVE_SYS_PARAM_H
    00209 #include <sys/param.h>
    00210 #endif
    00211 #ifndef __CYGWIN32__
    00212 #include <direct.h>
    00213 #endif
    00214
    00215
    00216 #ifndef WINGDIAPI
    00217 #define WINGDIAPI DECLSPEC_IMPORT
    00218 #endif
    00219
    00220 /*
    00221   LONG_PTR is used in the Win32 canvases, but it's only defined in newer
    00222   Platform or DirectX SDKs (in BaseTsd.h).
    00223   Ergo, on older SDKs, we have to define it ourselves. One indicator for the
    00224   presence of LONG_PTR seems to be if the __int3264 macro is #defined.
    00225   So, if it's not, we define LONG_PTR.
    00226  */
    00227 #ifndef __int3264
    00228   typedef LONG LONG_PTR;
    00229   typedef ULONG ULONG_PTR;
    00230   typedef DWORD DWORD_PTR;
    00231 #endif
    00232
    00233 #if defined(_DEBUG) || defined(CS_DEBUG)
    00234   #include <assert.h>
    00235   #ifndef CS_DEBUG
    00236     #define CS_DEBUG
    00237   #endif
    00238
    00239   #if defined(CS_COMPILER_MSVC)
    00240     #include <crtdbg.h>
    00241
    00242     #if defined(CS_EXTENSIVE_MEMDEBUG)
    00243       #define malloc(size) \
    00244         _malloc_dbg ((size), _NORMAL_BLOCK, __FILE__, __LINE__)
    00245       #define free(ptr) _free_dbg ((ptr), _NORMAL_BLOCK)
    00246       #define realloc(ptr, size) \
    00247         _realloc_dbg ((ptr), (size), _NORMAL_BLOCK, __FILE__, __LINE__)
    00248       #define calloc(num, size) \
    00249         _calloc_dbg ((num), (size), _NORMAL_BLOCK, __FILE__, __LINE__)
    00250
    00251       // heap consistency check is on by default, leave it
    00252       #define CS_WIN32_MSVC_DEBUG_GOOP \
    00253         _CrtSetDbgFlag ( \
    00254           _CrtSetDbgFlag (_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF)
    00255     #else
    00256       // turn heap consistency check off
    00257       #define CS_WIN32_MSVC_DEBUG_GOOP \
    00258         _CrtSetDbgFlag ( \
    00259           (_CrtSetDbgFlag (_CRTDBG_REPORT_FLAG) & ~_CRTDBG_ALLOC_MEM_DF) | \
    00260           _CRTDBG_LEAK_CHECK_DF)
    00261     #endif
    00262   #endif
    00263
    00264 #endif
    00265
    00266 #ifdef CS_WIN32_MSVC_DEBUG_GOOP
    00267   #define CS_INITIALIZE_PLATFORM_APPLICATION CS_WIN32_MSVC_DEBUG_GOOP
    00268 #endif
    00269
    00270 // The 2D graphics driver used by software renderer on this platform
    00271 #define CS_SOFTWARE_2D_DRIVER "crystalspace.graphics2d.directdraw"
    00272 #define CS_OPENGL_2D_DRIVER "crystalspace.graphics2d.glwin32"
    00273
    00274 // The sound driver
    00275 #define CS_SOUND_DRIVER "crystalspace.sound.driver.waveout"
    00276 #define CS_SNDSYS_DRIVER "crystalspace.sndsys.software.driver.directsound"
    00277
    00278 // SCF symbol export facility.
    00279 #ifndef CS_STATIC_LINKED
    00280 // No need to export the symbols when statically linking into one big binary.
    00281 # undef CS_EXPORTED_FUNCTION
    00282 # define CS_EXPORTED_FUNCTION extern "C" __declspec(dllexport)
    00283 #endif
    00284
    00285 #if defined (CS_COMPILER_BCC)
    00286 #  define strcasecmp stricmp
    00287 #  define strncasecmp strnicmp
    00288 #endif
    00289
    00290 #if defined (CS_COMPILER_MSVC)
    00291 #  define strcasecmp _stricmp
    00292 #  define strncasecmp _strnicmp
    00293 #endif
    00294
    00295 #if defined (CS_COMPILER_MSVC)
    00296 #  if defined(_MSC_VER) && (_MSC_VER < 1300)
    00297 #    include <assert.h>
    00298 static inline longlong strtoll(char const* s, char** sN, int base)
    00299 {
    00300   assert(sN == 0);
    00301   assert(base == 10);
    00302   return _atoi64(s);
    00303 }
    00304 #  else
    00305 #   define strtoll _strtoi64
    00306 #  endif
    00307 #endif
    00308
    00309 // Maximal path length
    00310 #ifndef CS_MAXPATHLEN
    00311 #  ifdef _MAX_FNAME
    00312 #    define CS_MAXPATHLEN _MAX_FNAME
    00313 #  else
    00314 #    define CS_MAXPATHLEN 260 /* not 256 */
    00315 #  endif
    00316 #endif
    00317 #define CS_PATH_DELIMITER ';'
    00318 #define CS_PATH_SEPARATOR '\\'
    00319
    00320 #if defined (__CYGWIN32__)
    00321 #  define CS_MKDIR(path) mkdir(path, 0755)
    00322 #else
    00323 #  define CS_MKDIR(path) _mkdir(path)
    00324 #endif
    00325
    00326 // Directory read functions, file access, etc.
    00327 #include <io.h>
    00328 #ifndef F_OK
    00329 #  define F_OK 0
    00330 #endif
    00331 #ifndef R_OK
    00332 #  define R_OK 2
    00333 #endif
    00334 #ifndef W_OK
    00335 #  define W_OK 4
    00336 #endif
    00337
    00338 #define CS_PROVIDES_EXPAND_PATH 1
    00339 inline void csPlatformExpandPath(const char* path, char* buffer, int nbuf) {}
    00340
    00341 // Although CS_COMPILER_GCC has opendir(), readdir(), etc., we prefer the CS
    00342 // versions of these functions.
    00343 #define CS_WIN32_USE_CUSTOM_OPENDIR
    00344
    00345 #ifndef CS_WIN32_USE_CUSTOM_OPENDIR
    00346 # include <dirent.h>
    00347 #else
    00348 struct dirent
    00349 {
    00350   char d_name [CS_MAXPATHLEN + 1]; // File name, 0 terminated
    00351   size_t d_size; // File size (bytes)
    00352   long dwFileAttributes; // File attributes (Windows-specific)
    00353 };
    00354
    00355 struct DIR;
    00356 # ifdef CS_CRYSTALSPACE_LIB
    00357   extern "C" CS_EXPORT_SYM DIR *opendir (const char *name);
    00358   extern "C" CS_EXPORT_SYM dirent *readdir (DIR *dirp);
    00359   extern "C" CS_EXPORT_SYM int closedir (DIR *dirp);
    00360   extern "C" CS_EXPORT_SYM bool isdir (const char *path, dirent *de);
    00361 # else
    00362   extern "C" CS_IMPORT_SYM DIR *opendir (const char *name);
    00363   extern "C" CS_IMPORT_SYM dirent *readdir (DIR *dirp);
    00364   extern "C" CS_IMPORT_SYM int closedir (DIR *dirp);
    00365   extern "C" CS_IMPORT_SYM bool isdir (const char *path, dirent *de);
    00366 # endif // CS_BUILD_SHARED_LIBS
    00367 #endif
    00368
    00369 #if defined (CS_COMPILER_BCC) || defined (__CYGWIN32__)
    00370 #  define GETPID() getpid()
    00371 #else
    00372 #  define GETPID() _getpid()
    00373 #endif
    00374
    00375 #ifdef __CYGWIN32__
    00376 #  include <unistd.h>
    00377 #  define CS_TEMP_FILE "cs%lu.tmp", (unsigned long)getpid()
    00378 #  define CS_TEMP_DIR  "/tmp"
    00379 #else
    00380 #  include <process.h>
    00381 #  define CS_TEMP_FILE "%x.cs", (int)GETPID()
    00382 #  define CS_TEMP_DIR win32_tempdir()
    00383    // This is the function called by CS_TEMP_DIR macro
    00384    static inline char *win32_tempdir()
    00385    {
    00386      char *tmp;
    00387      if ((tmp = getenv ("TMP")) != 0)
    00388        return tmp;
    00389      if ((tmp = getenv ("TEMP")) != 0)
    00390        return tmp;
    00391      return "";
    00392    }
    00393 #endif
    00394
    00395 // Microsoft Visual C++ compiler includes a very in-efficient 'memcpy'.
    00396 // This also replaces the older 'better_memcpy', which was also not as
    00397 // efficient as it could be ergo... heres a better solution.
    00398 #if defined(CS_COMPILER_MSVC) && (_MSC_VER < 1300)
    00399 #include <memory.h>
    00400 #define memcpy fast_mem_copy
    00401 static inline void* fast_mem_copy (void *dest, const void *src, int count)
    00402 {
    00403     __asm
    00404     {
    00405       mov               eax, count
    00406       mov               esi, src
    00407       mov               edi, dest
    00408       xor               ecx, ecx
    00409
    00410       // Check for 'short' moves
    00411       cmp               eax, 16
    00412       jl                do_short
    00413
    00414       // Move enough bytes to align 'dest'
    00415       sub               ecx, edi
    00416       and               ecx, 3
    00417       je                skip
    00418       sub               eax, ecx
    00419       rep               movsb
    00420
    00421       skip:
    00422         mov             ecx, eax
    00423         and             eax, 3
    00424         shr             ecx, 2
    00425         rep             movsd
    00426         test    eax, eax
    00427         je              end
    00428
    00429       do_short:
    00430         mov             ecx, eax
    00431         rep             movsb
    00432
    00433       end:
    00434     }
    00435
    00436     return dest;
    00437 }
    00438 #endif
    00439
    00440 #ifdef CS_COMPILER_BCC
    00441 // Major hack due to pow failures in CS for Borland, removing this
    00442 // causes millions of strings to print out -- Brandon Ehle
    00443 #define pow(arga, argb) ( (!arga && !argb)?0:pow(arga, argb) )
    00444 // Dunno why this is in CS -- Brandon Ehle
    00445 #define DEBUG_BREAK
    00446 #endif
    00447
    00448 #if defined (CS_PROCESSOR_X86)
    00449 #  define CS_LITTLE_ENDIAN
    00450 #else
    00451 #  error "Please define a suitable CS_XXX_ENDIAN macro in win32/csosdefs.h!"
    00452 #endif
    00453
    00454 #if defined(CS_COMPILER_BCC)
    00455   // The Borland C++ compiler does not accept a 'main' routine
    00456   // in a program which already contains WinMain. This is a work-around.
    00457   #undef main
    00458   #define main csMain
    00459 #endif
    00460
    00461 // cygwin has no _beginthread and _endthread functions
    00462 #ifdef __CYGWIN32__
    00463 #ifndef _beginthread
    00464 #define _beginthread(func, stack, ptr)  CreateThread (0, 0, \
    00465           LPTHREAD_START_ROUTINE(func), ptr, CREATE_SUSPENDED, 0)
    00466 #endif
    00467 #ifndef _endthread
    00468 #define _endthread()  {}
    00469 #endif
    00470 #endif
    00471
    00472 // Fake up setenv(), if necessary
    00473 #ifndef CS_HAVE_SETENV
    00474   #ifdef CS_CRYSTALSPACE_LIB
    00475     CS_EXPORT_SYM int setenv (const char* name, const char* value,
    00476       bool overwrite);
    00477   #else
    00478     CS_IMPORT_SYM int setenv (const char* name, const char* value,
    00479       bool overwrite);
    00480   #endif
    00481 #endif
    00482
    00483 // just to avoid windows.h inclusion
    00484 #define csSW_SHOWNORMAL 1
    00485
    00486 #if defined(CS_COMPILER_GCC) && defined(__STRICT_ANSI__)
    00487 // Need those...
    00488   extern int            _argc;
    00489   extern char** _argv;
    00490   #define CS_WIN32_ARGC _argc
    00491   #define CS_WIN32_ARGV _argv
    00492 #elif defined(CS_COMPILER_BCC)
    00493   #define CS_WIN32_ARGC _argc
    00494   #define CS_WIN32_ARGV _argv
    00495 #else
    00496   #define CS_WIN32_ARGC __argc
    00497   #define CS_WIN32_ARGV __argv
    00498 #endif
    00499
    00500
    00501 #ifdef __CYGWIN32__
    00502 #if !defined(CS_IMPLEMENT_PLATFORM_APPLICATION)
    00503 #define CS_IMPLEMENT_PLATFORM_APPLICATION
    00504 #endif
    00505
    00506 #else // __CYGWIN32__
    00507
    00508 /*
    00509  if the EXE is compiled as a GUI app,
    00510  a WinMain is needed. But if compiled
    00511  as a console app it's not used but main() is
    00512  instead.
    00513  */
    00514
    00515 #if !defined(CS_IMPLEMENT_PLATFORM_APPLICATION)
    00516 #ifndef __STRICT_ANSI__
    00517   #define csMain main
    00518 #else
    00519   /* Work around "error: ISO C++ forbids taking address of function `::main'"
    00520    * when compiling -ansi -pedantic */
    00521   #define csMain mainWithAnotherNameBecauseISOCPPForbidsIt
    00522 #endif
    00523 #define CS_IMPLEMENT_PLATFORM_APPLICATION                              \
    00524 int csMain (int argc, char* argv[]);                            \
    00525 int WINAPI WinMain (HINSTANCE hApp, HINSTANCE prev, LPSTR cmd, int show)\
    00526 {                                                                      \
    00527   (void)hApp;                                                          \
    00528   (void)show;                                                          \
    00529   (void)prev;                                                          \
    00530   (void)cmd;                                                           \
    00531   int ret = csMain (CS_WIN32_ARGC, CS_WIN32_ARGV);                     \
    00532   return ret;                                                          \
    00533 }
    00534 #ifdef __STRICT_ANSI__
    00535   #define main mainWithAnotherNameBecauseISOCPPForbidsIt
    00536 #endif
    00537 #endif // CS_IMPLEMENT_PLATFORM_APPLICATION
    00538
    00539 #endif // __CYGWIN32__
    00540
    00541 #if !defined(CS_STATIC_LINKED)
    00542
    00543 #if !defined(CS_IMPLEMENT_PLATFORM_PLUGIN)
    00544 #define CS_IMPLEMENT_PLATFORM_PLUGIN                                   \
    00545 int _cs_main(int /*argc*/, char* /*argv*/[])                           \
    00546 {                                                                      \
    00547          return 0;                                                     \
    00548 }                                                                      \
    00549 extern "C" BOOL WINAPI                                                 \
    00550 DllMain (HINSTANCE /*hinstDLL*/, DWORD /*fdwReason*/, LPVOID /*lpvReserved*/) \
    00551 {                                                                      \
    00552           return TRUE;                                                 \
    00553 }                                                                      \
    00554 CS_EXPORTED_FUNCTION const char* plugin_compiler()                     \
    00555 {                                                                      \
    00556          return CS_COMPILER_NAME;                                      \
    00557 }
    00558 #endif // CS_IMPLEMENT_PLATFORM_PLUGIN
    00559
    00560 #endif // CS_STATIC_LINKED
    00561
    00562 // Check for support of native aligned allocation
    00563 #if defined(CS_COMPILER_MSVC) && defined(_MSC_VER) && (_MSC_VER >= 1300)
    00564   #define csAlignedMalloc(size, align) _aligned_malloc(size, align)
    00565   #define csAlignedFree(ptr) _aligned_free(ptr)
    00566   #define CS_HAVE_CSALIGNED_MALLOC
    00567 #endif
    00568
    00569 #include "sanity.inc"
    00570
    00571 #endif // __CS_CSOSDEFS_H__