1041 lines
31 KiB
C++
1041 lines
31 KiB
C++
/**
|
|
@file posh.h
|
|
@author Brian Hook
|
|
@version 1.3.001
|
|
|
|
Header file for POSH, the Portable Open Source Harness project.
|
|
|
|
NOTE: Unlike most header files, this one is designed to be included
|
|
multiple times, which is why it does not have the @#ifndef/@#define
|
|
preamble.
|
|
|
|
POSH relies on environment specified preprocessor symbols in order
|
|
to infer as much as possible about the target OS/architecture and
|
|
the host compiler capabilities.
|
|
|
|
NOTE: POSH is simple and focused. It attempts to provide basic
|
|
functionality and information, but it does NOT attempt to emulate
|
|
missing functionality. I am also not willing to make POSH dirty
|
|
and hackish to support truly ancient and/or outmoded and/or bizarre
|
|
technologies such as non-ANSI compilers, systems with non-IEEE
|
|
floating point formats, segmented 16-bit operating systems, etc.
|
|
|
|
Please refer to the accompanying HTML documentation or visit
|
|
http://www.poshlib.org for more information on how to use POSH.
|
|
|
|
LICENSE:
|
|
|
|
Copyright (c) 2004, Brian Hook
|
|
All rights reserved.
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
modification, are permitted provided that the following conditions are
|
|
met:
|
|
|
|
* Redistributions of source code must retain the above copyright
|
|
notice, this list of conditions and the following disclaimer.
|
|
|
|
* Redistributions in binary form must reproduce the above
|
|
copyright notice, this list of conditions and the following
|
|
disclaimer in the documentation and/or other materials provided
|
|
with the distribution.
|
|
|
|
* The names of this package'ss contributors contributors may not
|
|
be used to endorse or promote products derived from this
|
|
software without specific prior written permission.
|
|
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
REVISION:
|
|
|
|
I've been lax about revision histories, so this starts at, um, 1.3.001.
|
|
Sorry for any inconveniences.
|
|
|
|
1.3.001 - 2/23/2006 - Incorporated fix for bug reported by Bill Cary,
|
|
where I was not detecting Visual Studio
|
|
compilation on x86-64 systems. Added check for
|
|
_M_X64 which should fix that.
|
|
|
|
*/
|
|
/*
|
|
I have yet to find an authoritative reference on preprocessor
|
|
symbols, but so far this is what I've gleaned:
|
|
|
|
GNU GCC/G++:
|
|
- __GNUC__: GNU C version
|
|
- __GNUG__: GNU C++ compiler
|
|
- __sun__ : on Sun platforms
|
|
- __svr4__: on Solaris and other SysV R4 platforms
|
|
- __mips__: on MIPS processor platforms
|
|
- __sparc_v9__: on Sparc 64-bit CPUs
|
|
- __sparcv9: 64-bit Solaris
|
|
- __MIPSEL__: mips processor, compiled for little endian
|
|
- __MIPSEB__: mips processor, compiled for big endian
|
|
- _R5900: MIPS/Sony/Toshiba R5900 (PS2)
|
|
- mc68000: 68K
|
|
- m68000: 68K
|
|
- m68k: 68K
|
|
- __palmos__: PalmOS
|
|
|
|
Intel C/C++ Compiler:
|
|
- __ECC : compiler version, IA64 only
|
|
- __EDG__
|
|
- __ELF__
|
|
- __GXX_ABI_VERSION
|
|
- __i386 : IA-32 only
|
|
- __i386__ : IA-32 only
|
|
- i386 : IA-32 only
|
|
- __ia64 : IA-64 only
|
|
- __ia64__ : IA-64 only
|
|
- ia64 : IA-64 only
|
|
- __ICC : IA-32 only
|
|
- __INTEL_COMPILER : IA-32 or IA-64, newer versions only
|
|
|
|
Apple's C/C++ Compiler for OS X:
|
|
- __APPLE_CC__
|
|
- __APPLE__
|
|
- __BIG_ENDIAN__
|
|
- __APPLE__
|
|
- __ppc__
|
|
- __MACH__
|
|
|
|
DJGPP:
|
|
- __MSDOS__
|
|
- __unix__
|
|
- __unix
|
|
- __GNUC__
|
|
- __GO32
|
|
- DJGPP
|
|
- __i386, __i386, i386
|
|
|
|
Cray's C compiler:
|
|
- _ADDR64: if 64-bit pointers
|
|
- _UNICOS:
|
|
- __unix:
|
|
|
|
SGI's CC compiler predefines the following (and more) with -ansi:
|
|
- __sgi
|
|
- __unix
|
|
- __host_mips
|
|
- _SYSTYPE_SVR4
|
|
- __mips
|
|
- _MIPSEB
|
|
- anyone know if there is a predefined symbol for the compiler?!
|
|
|
|
MinGW:
|
|
- as GnuC but also defines _WIN32, __WIN32, WIN32, _X86_, __i386, __i386__, and several others
|
|
- __MINGW32__
|
|
|
|
Cygwin:
|
|
- as Gnu C, but also
|
|
- __unix__
|
|
- __CYGWIN32__
|
|
|
|
Microsoft Visual Studio predefines the following:
|
|
- _MSC_VER
|
|
- _WIN32: on Win32
|
|
- _M_IX6 (on x86 systems)
|
|
- _M_X64: on x86-64 systems
|
|
- _M_ALPHA (on DEC AXP systems)
|
|
- _SH3: WinCE, Hitachi SH-3
|
|
- _MIPS: WinCE, MIPS
|
|
- _ARM: WinCE, ARM
|
|
|
|
Sun's C Compiler:
|
|
- sun and _sun
|
|
- unix and _unix
|
|
- sparc and _sparc (SPARC systems only)
|
|
- i386 and _i386 (x86 systems only)
|
|
- __SVR4 (Solaris only)
|
|
- __sparcv9: 64-bit solaris
|
|
- __SUNPRO_C
|
|
- _LP64: defined in 64-bit LP64 mode, but only if <sys/types.h> is included
|
|
|
|
Borland C/C++ predefines the following:
|
|
- __BORLANDC__:
|
|
|
|
DEC/Compaq C/C++ on Alpha:
|
|
- __alpha
|
|
- __arch64__
|
|
- __unix__ (on Tru64 Unix)
|
|
- __osf__
|
|
- __DECC
|
|
- __DECCXX (C++ compilation)
|
|
- __DECC_VER
|
|
- __DECCXX_VER
|
|
|
|
IBM's AIX compiler:
|
|
- __64BIT__ if 64-bit mode
|
|
- _AIX
|
|
- __IBMC__: C compiler version
|
|
- __IBMCPP__: C++ compiler version
|
|
- _LONG_LONG: compiler allows long long
|
|
|
|
Watcom:
|
|
- __WATCOMC__
|
|
- __DOS__ : if targeting DOS
|
|
- __386__ : if 32-bit support
|
|
- __WIN32__ : if targetin 32-bit Windows
|
|
|
|
HP-UX C/C++ Compiler:
|
|
- __hpux
|
|
- __unix
|
|
- __hppa (on PA-RISC)
|
|
- __LP64__: if compiled in 64-bit mode
|
|
|
|
Metrowerks:
|
|
- __MWERKS__
|
|
- __powerpc__
|
|
- _powerc
|
|
- __MC68K__
|
|
- macintosh when compiling for MacOS
|
|
- __INTEL__ for x86 targets
|
|
- __POWERPC__
|
|
|
|
*/
|
|
|
|
/*
|
|
** ----------------------------------------------------------------------------
|
|
** Include <limits.h> optionally
|
|
** ----------------------------------------------------------------------------
|
|
*/
|
|
#ifdef POSH_USE_LIMITS_H
|
|
# include <limits.h>
|
|
#endif
|
|
|
|
/*
|
|
** ----------------------------------------------------------------------------
|
|
** Determine compilation environment
|
|
** ----------------------------------------------------------------------------
|
|
*/
|
|
#if defined __ECC || defined __ICC || defined __INTEL_COMPILER
|
|
# define POSH_COMPILER_STRING "Intel C/C++"
|
|
# define POSH_COMPILER_INTEL 1
|
|
#endif
|
|
|
|
#if ( defined __host_mips || defined __sgi ) && !defined __GNUC__
|
|
# define POSH_COMPILER_STRING "MIPSpro C/C++"
|
|
# define POSH_COMPILER_MIPSPRO 1
|
|
#endif
|
|
|
|
#if defined __hpux && !defined __GNUC__
|
|
# define POSH_COMPILER_STRING "HP-UX CC"
|
|
# define POSH_COMPILER_HPCC 1
|
|
#endif
|
|
|
|
#if defined __GNUC__ && !defined __clang__
|
|
# define POSH_COMPILER_STRING "Gnu GCC"
|
|
# define POSH_COMPILER_GCC 1
|
|
#endif
|
|
|
|
#if defined __clang__
|
|
# define POSH_COMPILER_STRING "Clang"
|
|
# define POSH_COMPILER_CLANG 1
|
|
#endif
|
|
|
|
#if defined __APPLE_CC__
|
|
/* we don't define the compiler string here, let it be GNU */
|
|
# define POSH_COMPILER_APPLECC 1
|
|
#endif
|
|
|
|
#if defined __IBMC__ || defined __IBMCPP__
|
|
# define POSH_COMPILER_STRING "IBM C/C++"
|
|
# define POSH_COMPILER_IBM 1
|
|
#endif
|
|
|
|
#if defined _MSC_VER
|
|
# define POSH_COMPILER_STRING "Microsoft Visual C++"
|
|
# define POSH_COMPILER_MSVC 1
|
|
#endif
|
|
|
|
#if defined __SUNPRO_C
|
|
# define POSH_COMPILER_STRING "Sun Pro"
|
|
# define POSH_COMPILER_SUN 1
|
|
#endif
|
|
|
|
#if defined __BORLANDC__
|
|
# define POSH_COMPILER_STRING "Borland C/C++"
|
|
# define POSH_COMPILER_BORLAND 1
|
|
#endif
|
|
|
|
#if defined __MWERKS__
|
|
# define POSH_COMPILER_STRING "MetroWerks CodeWarrior"
|
|
# define POSH_COMPILER_METROWERKS 1
|
|
#endif
|
|
|
|
#if defined __DECC || defined __DECCXX
|
|
# define POSH_COMPILER_STRING "Compaq/DEC C/C++"
|
|
# define POSH_COMPILER_DEC 1
|
|
#endif
|
|
|
|
#if defined __WATCOMC__
|
|
# define POSH_COMPILER_STRING "Watcom C/C++"
|
|
# define POSH_COMPILER_WATCOM 1
|
|
#endif
|
|
|
|
#if !defined POSH_COMPILER_STRING
|
|
# define POSH_COMPILER_STRING "Unknown compiler"
|
|
#endif
|
|
|
|
/*
|
|
** ----------------------------------------------------------------------------
|
|
** Determine target operating system
|
|
** ----------------------------------------------------------------------------
|
|
*/
|
|
#if defined linux || defined __linux__
|
|
# define POSH_OS_LINUX 1
|
|
# define POSH_OS_STRING "Linux"
|
|
#endif
|
|
|
|
#if defined __HAIKU__
|
|
# define POSH_OS_HAIKU 1
|
|
# define POSH_OS_STRING "Haiku"
|
|
#endif
|
|
|
|
#if defined __FreeBSD__
|
|
# define POSH_OS_FREEBSD 1
|
|
# define POSH_OS_STRING "FreeBSD"
|
|
#endif
|
|
|
|
#if defined __CYGWIN32__
|
|
# define POSH_OS_CYGWIN32 1
|
|
# define POSH_OS_STRING "Cygwin"
|
|
#endif
|
|
|
|
#if defined GEKKO
|
|
# define POSH_OS_GAMECUBE
|
|
# define __powerpc__
|
|
# define POSH_OS_STRING "GameCube"
|
|
#endif
|
|
|
|
#if defined __MINGW32__
|
|
# define POSH_OS_MINGW 1
|
|
# define POSH_OS_STRING "MinGW"
|
|
#endif
|
|
|
|
#if defined GO32 && defined DJGPP && defined __MSDOS__
|
|
# define POSH_OS_GO32 1
|
|
# define POSH_OS_STRING "GO32/MS-DOS"
|
|
#endif
|
|
|
|
/* NOTE: make sure you use /bt=DOS if compiling for 32-bit DOS,
|
|
otherwise Watcom assumes host=target */
|
|
#if defined __WATCOMC__ && defined __386__ && defined __DOS__
|
|
# define POSH_OS_DOS32 1
|
|
# define POSH_OS_STRING "DOS/32-bit"
|
|
#endif
|
|
|
|
#if defined _UNICOS
|
|
# define POSH_OS_UNICOS 1
|
|
# define POSH_OS_STRING "UNICOS"
|
|
#endif
|
|
|
|
//ACS if we're in xcode, look at the target conditionals to figure out if this is ios or osx
|
|
#if defined __APPLE__
|
|
# include "TargetConditionals.h"
|
|
#endif
|
|
#if TARGET_OS_IPHONE
|
|
# define POSH_OS_IOS 1
|
|
# define POSH_OS_STRING "iOS"
|
|
#else
|
|
# if ( defined __MWERKS__ && defined __powerc && !defined macintosh ) || defined __APPLE_CC__ || defined macosx
|
|
# define POSH_OS_OSX 1
|
|
# define POSH_OS_STRING "MacOS X"
|
|
# endif
|
|
#endif
|
|
|
|
#if defined __sun__ || defined sun || defined __sun || defined __solaris__
|
|
# if defined __SVR4 || defined __svr4__ || defined __solaris__
|
|
# define POSH_OS_STRING "Solaris"
|
|
# define POSH_OS_SOLARIS 1
|
|
# endif
|
|
# if !defined POSH_OS_STRING
|
|
# define POSH_OS_STRING "SunOS"
|
|
# define POSH_OS_SUNOS 1
|
|
# endif
|
|
#endif
|
|
|
|
#if defined __sgi__ || defined sgi || defined __sgi
|
|
# define POSH_OS_IRIX 1
|
|
# define POSH_OS_STRING "Irix"
|
|
#endif
|
|
|
|
#if defined __hpux__ || defined __hpux
|
|
# define POSH_OS_HPUX 1
|
|
# define POSH_OS_STRING "HP-UX"
|
|
#endif
|
|
|
|
#if defined _AIX
|
|
# define POSH_OS_AIX 1
|
|
# define POSH_OS_STRING "AIX"
|
|
#endif
|
|
|
|
#if ( defined __alpha && defined __osf__ )
|
|
# define POSH_OS_TRU64 1
|
|
# define POSH_OS_STRING "Tru64"
|
|
#endif
|
|
|
|
#if defined __BEOS__ || defined __beos__
|
|
# define POSH_OS_BEOS 1
|
|
# define POSH_OS_STRING "BeOS"
|
|
#endif
|
|
|
|
#if defined amiga || defined amigados || defined AMIGA || defined _AMIGA
|
|
# define POSH_OS_AMIGA 1
|
|
# define POSH_OS_STRING "Amiga"
|
|
#endif
|
|
|
|
#if defined __unix__
|
|
# define POSH_OS_UNIX 1
|
|
# if !defined POSH_OS_STRING
|
|
# define POSH_OS_STRING "Unix-like(generic)"
|
|
# endif
|
|
#endif
|
|
|
|
#if defined _WIN32_WCE
|
|
# define POSH_OS_WINCE 1
|
|
# define POSH_OS_STRING "Windows CE"
|
|
#endif
|
|
|
|
#if defined _XBOX || defined _XBOX_VER
|
|
# define POSH_OS_XBOX 1
|
|
# define POSH_OS_STRING "XBOX"
|
|
#endif
|
|
|
|
#if defined __ORBIS__
|
|
# define POSH_OS_ORBIS
|
|
#endif
|
|
|
|
#if defined _WIN32 || defined WIN32 || defined __NT__ || defined __WIN32__
|
|
# if !defined POSH_OS_XBOX
|
|
# define POSH_OS_WIN32 1
|
|
# if defined _WIN64
|
|
# define POSH_OS_WIN64 1
|
|
# define POSH_OS_STRING "Win64"
|
|
# else
|
|
# if !defined POSH_OS_STRING
|
|
# define POSH_OS_STRING "Win32"
|
|
# endif
|
|
# endif
|
|
# endif
|
|
#endif
|
|
|
|
#if defined __palmos__
|
|
# define POSH_OS_PALM 1
|
|
# define POSH_OS_STRING "PalmOS"
|
|
#endif
|
|
|
|
#if defined THINK_C || defined macintosh
|
|
# define POSH_OS_MACOS 1
|
|
# define POSH_OS_STRING "MacOS"
|
|
#endif
|
|
|
|
/*
|
|
** -----------------------------------------------------------------------------
|
|
** Determine target CPU
|
|
** -----------------------------------------------------------------------------
|
|
*/
|
|
|
|
#if defined GEKKO
|
|
# define POSH_CPU_PPC750 1
|
|
# define POSH_CPU_STRING "IBM PowerPC 750 (NGC)"
|
|
#endif
|
|
|
|
#if defined mc68000 || defined m68k || defined __MC68K__ || defined m68000
|
|
# define POSH_CPU_68K 1
|
|
# define POSH_CPU_STRING "MC68000"
|
|
#endif
|
|
|
|
#if defined __PPC__ || defined __POWERPC__ || defined powerpc || defined _POWER || defined __ppc__ || defined __powerpc__ || defined _M_PPC
|
|
# define POSH_CPU_PPC 1
|
|
# if !defined POSH_CPU_STRING
|
|
# if defined __powerpc64__
|
|
# define POSH_CPU_STRING "PowerPC64"
|
|
# else
|
|
# define POSH_CPU_STRING "PowerPC"
|
|
# endif
|
|
# endif
|
|
#endif
|
|
|
|
#if defined _CRAYT3E || defined _CRAYMPP
|
|
# define POSH_CPU_CRAYT3E 1 /* target processor is a DEC Alpha 21164 used in a Cray T3E*/
|
|
# define POSH_CPU_STRING "Cray T3E (Alpha 21164)"
|
|
#endif
|
|
|
|
#if defined CRAY || defined _CRAY && !defined _CRAYT3E
|
|
# error Non-AXP Cray systems not supported
|
|
#endif
|
|
|
|
#if defined _SH3
|
|
# define POSH_CPU_SH3 1
|
|
# define POSH_CPU_STRING "Hitachi SH-3"
|
|
#endif
|
|
|
|
#if defined __sh4__ || defined __SH4__
|
|
# define POSH_CPU_SH3 1
|
|
# define POSH_CPU_SH4 1
|
|
# define POSH_CPU_STRING "Hitachi SH-4"
|
|
#endif
|
|
|
|
#if defined __sparc__ || defined __sparc
|
|
# if defined __arch64__ || defined __sparcv9 || defined __sparc_v9__
|
|
# define POSH_CPU_SPARC64 1
|
|
# define POSH_CPU_STRING "Sparc/64"
|
|
# else
|
|
# define POSH_CPU_STRING "Sparc/32"
|
|
# endif
|
|
# define POSH_CPU_SPARC 1
|
|
#endif
|
|
|
|
#if defined ARM || defined __arm__ || defined _ARM
|
|
# define POSH_CPU_STRONGARM 1
|
|
# define POSH_CPU_STRING "ARM"
|
|
#endif
|
|
|
|
#if defined AARCH64 || defined __aarch64__ || defined _AARCH64
|
|
# define POSH_CPU_STRONGARM 1
|
|
# define POSH_CPU_STRING "AARCH64"
|
|
#endif
|
|
|
|
#if defined mips || defined __mips__ || defined __MIPS__ || defined _MIPS
|
|
# define POSH_CPU_MIPS 1
|
|
# if defined _R5900
|
|
# define POSH_CPU_STRING "MIPS R5900 (PS2)"
|
|
# else
|
|
# define POSH_CPU_STRING "MIPS"
|
|
# endif
|
|
#endif
|
|
|
|
#if defined __ia64 || defined _M_IA64 || defined __ia64__
|
|
# define POSH_CPU_IA64 1
|
|
# define POSH_CPU_STRING "IA64"
|
|
#endif
|
|
|
|
#if defined __X86__ || defined __i386__ || defined i386 || defined _M_IX86 || defined __386__ || defined __x86_64__ || defined _M_X64
|
|
# define POSH_CPU_X86 1
|
|
# if defined __x86_64__ || defined _M_X64
|
|
# define POSH_CPU_X86_64 1
|
|
# endif
|
|
# if defined POSH_CPU_X86_64
|
|
# define POSH_CPU_STRING "AMD x86-64"
|
|
# else
|
|
# define POSH_CPU_STRING "Intel 386+"
|
|
# endif
|
|
#endif
|
|
|
|
#if defined __alpha || defined alpha || defined _M_ALPHA || defined __alpha__
|
|
# define POSH_CPU_AXP 1
|
|
# define POSH_CPU_STRING "AXP"
|
|
#endif
|
|
|
|
#if defined __hppa || defined hppa
|
|
# define POSH_CPU_HPPA 1
|
|
# define POSH_CPU_STRING "PA-RISC"
|
|
#endif
|
|
|
|
#if !defined POSH_CPU_STRING
|
|
# error POSH cannot determine target CPU
|
|
# define POSH_CPU_STRING "Unknown" /* this is here for Doxygen's benefit */
|
|
#endif
|
|
|
|
/*
|
|
** -----------------------------------------------------------------------------
|
|
** Attempt to autodetect building for embedded on Sony PS2
|
|
** -----------------------------------------------------------------------------
|
|
*/
|
|
#if !defined POSH_OS_STRING
|
|
# if !defined FORCE_DOXYGEN
|
|
# define POSH_OS_EMBEDDED 1
|
|
# endif
|
|
# if defined _R5900
|
|
# define POSH_OS_STRING "Sony PS2(embedded)"
|
|
# else
|
|
# define POSH_OS_STRING "Embedded/Unknown"
|
|
# endif
|
|
#endif
|
|
|
|
/*
|
|
** ---------------------------------------------------------------------------
|
|
** Handle cdecl, stdcall, fastcall, etc.
|
|
** ---------------------------------------------------------------------------
|
|
*/
|
|
#if defined POSH_CPU_X86 && !defined POSH_CPU_X86_64
|
|
# if defined __GNUC__
|
|
# define POSH_CDECL __attribute__((cdecl))
|
|
# define POSH_STDCALL __attribute__((stdcall))
|
|
# define POSH_FASTCALL __attribute__((fastcall))
|
|
# elif ( defined _MSC_VER || defined __WATCOMC__ || defined __BORLANDC__ || defined __MWERKS__ )
|
|
# define POSH_CDECL __cdecl
|
|
# define POSH_STDCALL __stdcall
|
|
# define POSH_FASTCALL __fastcall
|
|
# endif
|
|
#else
|
|
# define POSH_CDECL
|
|
# define POSH_STDCALL
|
|
# define POSH_FASTCALL
|
|
#endif
|
|
|
|
/*
|
|
** ---------------------------------------------------------------------------
|
|
** Define POSH_IMPORTEXPORT signature based on POSH_DLL and POSH_BUILDING_LIB
|
|
** ---------------------------------------------------------------------------
|
|
*/
|
|
|
|
/*
|
|
** We undefine this so that multiple inclusions will work
|
|
*/
|
|
#if defined POSH_IMPORTEXPORT
|
|
# undef POSH_IMPORTEXPORT
|
|
#endif
|
|
|
|
#if defined POSH_DLL
|
|
# if defined POSH_OS_WIN32
|
|
# if defined _MSC_VER
|
|
# if ( _MSC_VER >= 800 )
|
|
# if defined POSH_BUILDING_LIB
|
|
# define POSH_IMPORTEXPORT __declspec( dllexport )
|
|
# else
|
|
# define POSH_IMPORTEXPORT __declspec( dllimport )
|
|
# endif
|
|
# else
|
|
# if defined POSH_BUILDING_LIB
|
|
# define POSH_IMPORTEXPORT __export
|
|
# else
|
|
# define POSH_IMPORTEXPORT
|
|
# endif
|
|
# endif
|
|
# endif /* defined _MSC_VER */
|
|
# if defined __BORLANDC__
|
|
# if ( __BORLANDC__ >= 0x500 )
|
|
# if defined POSH_BUILDING_LIB
|
|
# define POSH_IMPORTEXPORT __declspec( dllexport )
|
|
# else
|
|
# define POSH_IMPORTEXPORT __declspec( dllimport )
|
|
# endif
|
|
# else
|
|
# if defined POSH_BUILDING_LIB
|
|
# define POSH_IMPORTEXPORT __export
|
|
# else
|
|
# define POSH_IMPORTEXPORT
|
|
# endif
|
|
# endif
|
|
# endif /* defined __BORLANDC__ */
|
|
/* for all other compilers, we're just making a blanket assumption */
|
|
# if defined __GNUC__ || defined __WATCOMC__ || defined __MWERKS__
|
|
# if defined POSH_BUILDING_LIB
|
|
# define POSH_IMPORTEXPORT __declspec( dllexport )
|
|
# else
|
|
# define POSH_IMPORTEXPORT __declspec( dllimport )
|
|
# endif
|
|
# endif /* all other compilers */
|
|
# if !defined POSH_IMPORTEXPORT
|
|
# error Building DLLs not supported on this compiler (poshlib@poshlib.org if you know how)
|
|
# endif
|
|
# endif /* defined POSH_OS_WIN32 */
|
|
#endif
|
|
|
|
/* On pretty much everything else, we can thankfully just ignore this */
|
|
#if !defined POSH_IMPORTEXPORT
|
|
# define POSH_IMPORTEXPORT
|
|
#endif
|
|
|
|
#if defined FORCE_DOXYGEN
|
|
# define POSH_DLL
|
|
# define POSH_BUILDING_LIB
|
|
# undef POSH_DLL
|
|
# undef POSH_BUILDING_LIB
|
|
#endif
|
|
|
|
/*
|
|
** ----------------------------------------------------------------------------
|
|
** (Re)define POSH_PUBLIC_API export signature
|
|
** ----------------------------------------------------------------------------
|
|
*/
|
|
#ifdef POSH_PUBLIC_API
|
|
# undef POSH_PUBLIC_API
|
|
#endif
|
|
|
|
#if ( ( defined _MSC_VER ) && ( _MSC_VER < 800 ) ) || ( defined __BORLANDC__ && ( __BORLANDC__ < 0x500 ) )
|
|
# define POSH_PUBLIC_API(rtype) extern rtype POSH_IMPORTEXPORT
|
|
#else
|
|
# define POSH_PUBLIC_API(rtype) extern POSH_IMPORTEXPORT rtype
|
|
#endif
|
|
|
|
/*
|
|
** ----------------------------------------------------------------------------
|
|
** Try to infer endianess. Basically we just go through the CPUs we know are
|
|
** little endian, and assume anything that isn't one of those is big endian.
|
|
** As a sanity check, we also do this with operating systems we know are
|
|
** little endian, such as Windows. Some processors are bi-endian, such as
|
|
** the MIPS series, so we have to be careful about those.
|
|
** ----------------------------------------------------------------------------
|
|
*/
|
|
#if defined POSH_CPU_X86 || defined POSH_CPU_AXP || defined POSH_CPU_STRONGARM || defined POSH_OS_WIN32 || defined POSH_OS_WINCE || defined __MIPSEL__
|
|
# define POSH_ENDIAN_STRING "little"
|
|
# define POSH_LITTLE_ENDIAN 1
|
|
#else
|
|
# define POSH_ENDIAN_STRING "big"
|
|
# define POSH_BIG_ENDIAN 1
|
|
#endif
|
|
|
|
#if defined FORCE_DOXYGEN
|
|
# define POSH_LITTLE_ENDIAN
|
|
#endif
|
|
|
|
/*
|
|
** ----------------------------------------------------------------------------
|
|
** Cross-platform compile time assertion macro
|
|
** ----------------------------------------------------------------------------
|
|
*/
|
|
#define POSH_COMPILE_TIME_ASSERT(name, x) typedef int _POSH_dummy_ ## name[(x) ? 1 : -1 ]
|
|
|
|
/*
|
|
** ----------------------------------------------------------------------------
|
|
** 64-bit Integer
|
|
**
|
|
** We don't require 64-bit support, nor do we emulate its functionality, we
|
|
** simply export it if it's available. Since we can't count on <limits.h>
|
|
** for 64-bit support, we ignore the POSH_USE_LIMITS_H directive.
|
|
** ----------------------------------------------------------------------------
|
|
*/
|
|
#if defined ( __LP64__ ) || defined ( __powerpc64__ ) || defined POSH_CPU_SPARC64
|
|
# define POSH_64BIT_INTEGER 1
|
|
typedef long posh_i64_t;
|
|
typedef unsigned long posh_u64_t;
|
|
# define POSH_I64( x ) ((posh_i64_t)x)
|
|
# define POSH_U64( x ) ((posh_u64_t)x)
|
|
# define POSH_I64_PRINTF_PREFIX "l"
|
|
#elif defined _MSC_VER || defined __BORLANDC__ || defined __WATCOMC__ || ( defined __alpha && defined __DECC )
|
|
# define POSH_64BIT_INTEGER 1
|
|
typedef __int64 posh_i64_t;
|
|
typedef unsigned __int64 posh_u64_t;
|
|
# define POSH_I64( x ) ((posh_i64_t)x)
|
|
# define POSH_U64( x ) ((posh_u64_t)x)
|
|
# define POSH_I64_PRINTF_PREFIX "I64"
|
|
#elif defined __GNUC__ || defined __MWERKS__ || defined __SUNPRO_C || defined __SUNPRO_CC || defined __APPLE_CC__ || defined POSH_OS_IRIX || defined _LONG_LONG || defined _CRAYC
|
|
# define POSH_64BIT_INTEGER 1
|
|
typedef long long posh_i64_t;
|
|
typedef unsigned long long posh_u64_t;
|
|
# define POSH_U64( x ) ((posh_u64_t)(x##LL))
|
|
# define POSH_I64( x ) ((posh_i64_t)(x##LL))
|
|
# define POSH_I64_PRINTF_PREFIX "ll"
|
|
#endif
|
|
|
|
/* hack */
|
|
/*#ifdef __MINGW32__
|
|
#undef POSH_I64
|
|
#undef POSH_U64
|
|
#undef POSH_I64_PRINTF_PREFIX
|
|
#define POSH_I64( x ) ((posh_i64_t)x)
|
|
#define POSH_U64( x ) ((posh_u64_t)x)
|
|
#define POSH_I64_PRINTF_PREFIX "I64"
|
|
#endif*/
|
|
|
|
#ifdef FORCE_DOXYGEN
|
|
typedef long long posh_i64_t;
|
|
typedef unsigned long posh_u64_t;
|
|
# define POSH_64BIT_INTEGER
|
|
# define POSH_I64_PRINTF_PREFIX
|
|
# define POSH_I64(x)
|
|
# define POSH_U64(x)
|
|
#endif
|
|
|
|
/** Minimum value for a 64-bit signed integer */
|
|
#define POSH_I64_MIN POSH_I64(0x8000000000000000)
|
|
/** Maximum value for a 64-bit signed integer */
|
|
#define POSH_I64_MAX POSH_I64(0x7FFFFFFFFFFFFFFF)
|
|
/** Minimum value for a 64-bit unsigned integer */
|
|
#define POSH_U64_MIN POSH_U64(0)
|
|
/** Maximum value for a 64-bit unsigned integer */
|
|
#define POSH_U64_MAX POSH_U64(0xFFFFFFFFFFFFFFFF)
|
|
|
|
/* ----------------------------------------------------------------------------
|
|
** Basic Sized Types
|
|
**
|
|
** These types are expected to be EXACTLY sized so you can use them for
|
|
** serialization.
|
|
** ----------------------------------------------------------------------------
|
|
*/
|
|
#define POSH_FALSE 0
|
|
#define POSH_TRUE 1
|
|
|
|
typedef int posh_bool_t;
|
|
typedef unsigned char posh_byte_t;
|
|
|
|
/* NOTE: These assume that CHAR_BIT is 8!! */
|
|
typedef unsigned char posh_u8_t;
|
|
typedef signed char posh_i8_t;
|
|
|
|
#if defined POSH_USE_LIMITS_H
|
|
# if CHAR_BITS > 8
|
|
# error This machine uses 9-bit characters. This is a warning, you can comment this out now.
|
|
# endif /* CHAR_BITS > 8 */
|
|
|
|
/* 16-bit */
|
|
# if ( USHRT_MAX == 65535 )
|
|
typedef unsigned short posh_u16_t;
|
|
typedef short posh_i16_t;
|
|
# else
|
|
/* Yes, in theory there could still be a 16-bit character type and shorts are
|
|
32-bits in size...if you find such an architecture, let me know =P */
|
|
# error No 16-bit type found
|
|
# endif
|
|
|
|
/* 32-bit */
|
|
# if ( INT_MAX == 2147483647 )
|
|
typedef unsigned posh_u32_t;
|
|
typedef int posh_i32_t;
|
|
# elif ( LONG_MAX == 2147483647 )
|
|
typedef unsigned long posh_u32_t;
|
|
typedef long posh_i32_t;
|
|
# else
|
|
error No 32-bit type found
|
|
# endif
|
|
|
|
#else /* POSH_USE_LIMITS_H */
|
|
|
|
typedef unsigned short posh_u16_t;
|
|
typedef short posh_i16_t;
|
|
|
|
# if !defined POSH_OS_PALM
|
|
typedef unsigned posh_u32_t;
|
|
typedef int posh_i32_t;
|
|
# else
|
|
typedef unsigned long posh_u32_t;
|
|
typedef long posh_i32_t;
|
|
# endif
|
|
#endif
|
|
|
|
/** Minimum value for a byte */
|
|
#define POSH_BYTE_MIN 0
|
|
/** Maximum value for an 8-bit unsigned value */
|
|
#define POSH_BYTE_MAX 255
|
|
/** Minimum value for a byte */
|
|
#define POSH_I16_MIN ( ( posh_i16_t ) 0x8000 )
|
|
/** Maximum value for a 16-bit signed value */
|
|
#define POSH_I16_MAX ( ( posh_i16_t ) 0x7FFF )
|
|
/** Minimum value for a 16-bit unsigned value */
|
|
#define POSH_U16_MIN 0
|
|
/** Maximum value for a 16-bit unsigned value */
|
|
#define POSH_U16_MAX ( ( posh_u16_t ) 0xFFFF )
|
|
/** Minimum value for a 32-bit signed value */
|
|
#define POSH_I32_MIN ( ( posh_i32_t ) 0x80000000 )
|
|
/** Maximum value for a 32-bit signed value */
|
|
#define POSH_I32_MAX ( ( posh_i32_t ) 0x7FFFFFFF )
|
|
/** Minimum value for a 32-bit unsigned value */
|
|
#define POSH_U32_MIN 0
|
|
/** Maximum value for a 32-bit unsigned value */
|
|
#define POSH_U32_MAX ( ( posh_u32_t ) 0xFFFFFFFF )
|
|
|
|
/*
|
|
** ----------------------------------------------------------------------------
|
|
** Sanity checks on expected sizes
|
|
** ----------------------------------------------------------------------------
|
|
*/
|
|
#if !defined FORCE_DOXYGEN
|
|
|
|
POSH_COMPILE_TIME_ASSERT(posh_byte_t, sizeof(posh_byte_t) == 1);
|
|
POSH_COMPILE_TIME_ASSERT(posh_u8_t, sizeof(posh_u8_t) == 1);
|
|
POSH_COMPILE_TIME_ASSERT(posh_i8_t, sizeof(posh_i8_t) == 1);
|
|
POSH_COMPILE_TIME_ASSERT(posh_u16_t, sizeof(posh_u16_t) == 2);
|
|
POSH_COMPILE_TIME_ASSERT(posh_i16_t, sizeof(posh_i16_t) == 2);
|
|
POSH_COMPILE_TIME_ASSERT(posh_u32_t, sizeof(posh_u32_t) == 4);
|
|
POSH_COMPILE_TIME_ASSERT(posh_i32_t, sizeof(posh_i32_t) == 4);
|
|
|
|
#if !defined POSH_NO_FLOAT
|
|
POSH_COMPILE_TIME_ASSERT(posh_testfloat_t, sizeof(float)==4 );
|
|
POSH_COMPILE_TIME_ASSERT(posh_testdouble_t, sizeof(double)==8);
|
|
#endif
|
|
|
|
#if defined POSH_64BIT_INTEGER
|
|
POSH_COMPILE_TIME_ASSERT(posh_u64_t, sizeof(posh_u64_t) == 8);
|
|
POSH_COMPILE_TIME_ASSERT(posh_i64_t, sizeof(posh_i64_t) == 8);
|
|
#endif
|
|
|
|
#endif
|
|
|
|
/*
|
|
** ----------------------------------------------------------------------------
|
|
** 64-bit pointer support
|
|
** ----------------------------------------------------------------------------
|
|
*/
|
|
#if defined POSH_CPU_AXP && ( defined POSH_OS_TRU64 || defined POSH_OS_LINUX )
|
|
# define POSH_64BIT_POINTER 1
|
|
#endif
|
|
|
|
#if defined POSH_CPU_X86_64 && defined POSH_OS_LINUX
|
|
# define POSH_64BIT_POINTER 1
|
|
#endif
|
|
|
|
#if defined POSH_CPU_SPARC64 || defined POSH_OS_WIN64 || defined __64BIT__ || defined __LP64 || defined _LP64 || defined __LP64__ || defined _ADDR64 || defined _CRAYC
|
|
# define POSH_64BIT_POINTER 1
|
|
#endif
|
|
|
|
#if defined POSH_64BIT_POINTER
|
|
POSH_COMPILE_TIME_ASSERT( posh_64bit_pointer, sizeof( void * ) == 8 );
|
|
#elif !defined FORCE_DOXYGEN
|
|
/* if this assertion is hit then you're on a system that either has 64-bit
|
|
addressing and we didn't catch it, or you're on a system with 16-bit
|
|
pointers. In the latter case, POSH doesn't actually care, we're just
|
|
triggering this assertion to make sure you're aware of the situation,
|
|
so feel free to delete it.
|
|
|
|
If this assertion is triggered on a known 32 or 64-bit platform,
|
|
please let us know (poshlib@poshlib.org) */
|
|
POSH_COMPILE_TIME_ASSERT( posh_32bit_pointer, sizeof( void * ) == 4 );
|
|
#endif
|
|
|
|
#if defined FORCE_DOXYGEN
|
|
# define POSH_64BIT_POINTER
|
|
#endif
|
|
|
|
/*
|
|
** ----------------------------------------------------------------------------
|
|
** POSH Utility Functions
|
|
**
|
|
** These are optional POSH utility functions that are not required if you don't
|
|
** need anything except static checking of your host and target environment.
|
|
**
|
|
** These functions are NOT wrapped with POSH_PUBLIC_API because I didn't want
|
|
** to enforce their export if your own library is only using them internally.
|
|
** ----------------------------------------------------------------------------
|
|
*/
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
const char *POSH_GetArchString( void );
|
|
|
|
#if !defined POSH_NO_FLOAT
|
|
|
|
posh_u32_t POSH_LittleFloatBits( float f );
|
|
posh_u32_t POSH_BigFloatBits( float f );
|
|
float POSH_FloatFromLittleBits( posh_u32_t bits );
|
|
float POSH_FloatFromBigBits( posh_u32_t bits );
|
|
|
|
void POSH_DoubleBits( double d, posh_byte_t dst[ 8 ] );
|
|
double POSH_DoubleFromBits( const posh_byte_t src[ 8 ] );
|
|
|
|
/* unimplemented
|
|
float *POSH_WriteFloatToLittle( void *dst, float f );
|
|
float *POSH_WriteFloatToBig( void *dst, float f );
|
|
float POSH_ReadFloatFromLittle( const void *src );
|
|
float POSH_ReadFloatFromBig( const void *src );
|
|
|
|
double *POSH_WriteDoubleToLittle( void *dst, double d );
|
|
double *POSH_WriteDoubleToBig( void *dst, double d );
|
|
double POSH_ReadDoubleFromLittle( const void *src );
|
|
double POSH_ReadDoubleFromBig( const void *src );
|
|
*/
|
|
#endif /* !defined POSH_NO_FLOAT */
|
|
|
|
#if defined FORCE_DOXYGEN
|
|
# define POSH_NO_FLOAT
|
|
# undef POSH_NO_FLOAT
|
|
#endif
|
|
|
|
extern posh_u16_t POSH_SwapU16( posh_u16_t u );
|
|
extern posh_i16_t POSH_SwapI16( posh_i16_t u );
|
|
extern posh_u32_t POSH_SwapU32( posh_u32_t u );
|
|
extern posh_i32_t POSH_SwapI32( posh_i32_t u );
|
|
|
|
#if defined POSH_64BIT_INTEGER
|
|
|
|
extern posh_u64_t POSH_SwapU64( posh_u64_t u );
|
|
extern posh_i64_t POSH_SwapI64( posh_i64_t u );
|
|
|
|
#endif /*POSH_64BIT_INTEGER */
|
|
|
|
extern posh_u16_t *POSH_WriteU16ToLittle( void *dst, posh_u16_t value );
|
|
extern posh_i16_t *POSH_WriteI16ToLittle( void *dst, posh_i16_t value );
|
|
extern posh_u32_t *POSH_WriteU32ToLittle( void *dst, posh_u32_t value );
|
|
extern posh_i32_t *POSH_WriteI32ToLittle( void *dst, posh_i32_t value );
|
|
|
|
extern posh_u16_t *POSH_WriteU16ToBig( void *dst, posh_u16_t value );
|
|
extern posh_i16_t *POSH_WriteI16ToBig( void *dst, posh_i16_t value );
|
|
extern posh_u32_t *POSH_WriteU32ToBig( void *dst, posh_u32_t value );
|
|
extern posh_i32_t *POSH_WriteI32ToBig( void *dst, posh_i32_t value );
|
|
|
|
extern posh_u16_t POSH_ReadU16FromLittle( const void *src );
|
|
extern posh_i16_t POSH_ReadI16FromLittle( const void *src );
|
|
extern posh_u32_t POSH_ReadU32FromLittle( const void *src );
|
|
extern posh_i32_t POSH_ReadI32FromLittle( const void *src );
|
|
|
|
extern posh_u16_t POSH_ReadU16FromBig( const void *src );
|
|
extern posh_i16_t POSH_ReadI16FromBig( const void *src );
|
|
extern posh_u32_t POSH_ReadU32FromBig( const void *src );
|
|
extern posh_i32_t POSH_ReadI32FromBig( const void *src );
|
|
|
|
#if defined POSH_64BIT_INTEGER
|
|
extern posh_u64_t *POSH_WriteU64ToLittle( void *dst, posh_u64_t value );
|
|
extern posh_i64_t *POSH_WriteI64ToLittle( void *dst, posh_i64_t value );
|
|
extern posh_u64_t *POSH_WriteU64ToBig( void *dst, posh_u64_t value );
|
|
extern posh_i64_t *POSH_WriteI64ToBig( void *dst, posh_i64_t value );
|
|
|
|
extern posh_u64_t POSH_ReadU64FromLittle( const void *src );
|
|
extern posh_i64_t POSH_ReadI64FromLittle( const void *src );
|
|
extern posh_u64_t POSH_ReadU64FromBig( const void *src );
|
|
extern posh_i64_t POSH_ReadI64FromBig( const void *src );
|
|
#endif /* POSH_64BIT_INTEGER */
|
|
|
|
#if defined POSH_LITTLE_ENDIAN
|
|
|
|
# define POSH_LittleU16(x) (x)
|
|
# define POSH_LittleU32(x) (x)
|
|
# define POSH_LittleI16(x) (x)
|
|
# define POSH_LittleI32(x) (x)
|
|
# if defined POSH_64BIT_INTEGER
|
|
# define POSH_LittleU64(x) (x)
|
|
# define POSH_LittleI64(x) (x)
|
|
# endif /* defined POSH_64BIT_INTEGER */
|
|
|
|
# define POSH_BigU16(x) POSH_SwapU16(x)
|
|
# define POSH_BigU32(x) POSH_SwapU32(x)
|
|
# define POSH_BigI16(x) POSH_SwapI16(x)
|
|
# define POSH_BigI32(x) POSH_SwapI32(x)
|
|
# if defined POSH_64BIT_INTEGER
|
|
# define POSH_BigU64(x) POSH_SwapU64(x)
|
|
# define POSH_BigI64(x) POSH_SwapI64(x)
|
|
# endif /* defined POSH_64BIT_INTEGER */
|
|
|
|
#else
|
|
|
|
# define POSH_BigU16(x) (x)
|
|
# define POSH_BigU32(x) (x)
|
|
# define POSH_BigI16(x) (x)
|
|
# define POSH_BigI32(x) (x)
|
|
|
|
# if defined POSH_64BIT_INTEGER
|
|
# define POSH_BigU64(x) (x)
|
|
# define POSH_BigI64(x) (x)
|
|
# endif /* POSH_64BIT_INTEGER */
|
|
|
|
# define POSH_LittleU16(x) POSH_SwapU16(x)
|
|
# define POSH_LittleU32(x) POSH_SwapU32(x)
|
|
# define POSH_LittleI16(x) POSH_SwapI16(x)
|
|
# define POSH_LittleI32(x) POSH_SwapI32(x)
|
|
|
|
# if defined POSH_64BIT_INTEGER
|
|
# define POSH_LittleU64(x) POSH_SwapU64(x)
|
|
# define POSH_LittleI64(x) POSH_SwapI64(x)
|
|
# endif /* POSH_64BIT_INTEGER */
|
|
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
|