| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047 |
- /**
- @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__
- LLVM:
- - __llvm__
- - __clang__
- */
- /*
- ** ----------------------------------------------------------------------------
- ** 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 __clang__
- # define POSH_COMPILER_STRING "Clang"
- # define POSH_COMPILER_CLANG 1
- #endif
- #if defined __GNUC__ && !defined __clang__
- # define POSH_COMPILER_STRING "Gnu GCC"
- # define POSH_COMPILER_GCC 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
- #if !defined __clang__
- # define POSH_COMPILER_STRING "Microsoft Visual C++"
- # define POSH_COMPILER_MSVC 1
- #endif
- #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__ || defined EMSCRIPTEN
- # define POSH_OS_LINUX 1
- # define POSH_OS_STRING "Linux"
- #endif
- #if defined __FreeBSD__
- # define POSH_OS_FREEBSD 1
- # define POSH_OS_STRING "FreeBSD"
- #endif
- #if defined __OpenBSD__
- # define POSH_OS_OPENBSD 1
- # define POSH_OS_STRING "OpenBSD"
- #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
- #if ( defined __MWERKS__ && defined __powerc && !defined macintosh ) || defined __APPLE_CC__ || defined macosx
- # define POSH_OS_OSX 1
- # define POSH_OS_STRING "MacOS X"
- #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 _WIN32 || defined WIN32 || defined __NT__ || defined __WIN32__
- # define POSH_OS_WIN32 1
- # if !defined POSH_OS_XBOX
- # if defined _WIN64
- # define POSH_OS_WIN64 1
- # if !defined POSH_OS_STRING
- # define POSH_OS_STRING "Win64"
- # endif // !defined POSH_OS_STRING
- # 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 || defined _M_ARM
- # define POSH_CPU_STRONGARM 1
- # define POSH_CPU_STRING "ARM"
- #endif
- #if defined __aarch64__ || defined _M_ARM64
- # define POSH_CPU_AARCH64 1
- # define POSH_CPU_STRING "ARM64"
- #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 __riscv64 || (defined __riscv && __riscv_xlen == 64)
- # define POSH_CPU_RISCV64 1
- # define POSH_CPU_STRING "RISC-V 64"
- #endif
- #if defined __loongarch64 || (defined __loongarch__ && __loongarch_grlen == 64)
- # define POSH_CPU_LOONGARCH64 1
- # define POSH_CPU_STRING "LoongArch64"
- #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 EMSCRIPTEN
- # define POSH_CPU_EMSCRIPTEN 1
- # define POSH_CPU_STRING "EMSCRIPTEN"
- #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 ([email protected] 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_CPU_AARCH64 || defined POSH_CPU_RISCV64 || defined POSH_CPU_LOONGARCH64 || defined POSH_OS_WIN32 || defined POSH_OS_WINCE || defined __MIPSEL__ || defined POSH_CPU_EMSCRIPTEN
- # 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##i64))
- # define POSH_U64( x ) ((posh_u64_t)(x##ui64))
- # 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 ([email protected]) */
- 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
|