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