summaryrefslogtreecommitdiff
path: root/thirdparty/thekla_atlas/poshlib
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/thekla_atlas/poshlib')
-rw-r--r--thirdparty/thekla_atlas/poshlib/posh.c1006
-rw-r--r--thirdparty/thekla_atlas/poshlib/posh.h1030
2 files changed, 2036 insertions, 0 deletions
diff --git a/thirdparty/thekla_atlas/poshlib/posh.c b/thirdparty/thekla_atlas/poshlib/posh.c
new file mode 100644
index 0000000000..bd3fcc66ea
--- /dev/null
+++ b/thirdparty/thekla_atlas/poshlib/posh.c
@@ -0,0 +1,1006 @@
+/*
+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.
+*/
+/**
+ @file posh.c
+ @author Brian Hook
+ @date 2002
+ @brief Portable Open Source Harness primary source file
+*/
+#include "posh.h"
+
+#if !defined FORCE_DOXYGEN
+
+#if !defined POSH_NO_FLOAT
+# define POSH_FLOAT_STRING "enabled"
+#else
+# define POSH_FLOAT_STRING "disabled"
+#endif
+
+#if defined POSH_64BIT_INTEGER
+# define POSH_64BIT_INTEGER_STRING "yes"
+#else
+# define POSH_64BIT_INTEGER_STRING "no"
+#endif
+
+#if defined POSH_64BIT_POINTER
+# define POSH_POINTER_STRING "64-bits"
+#else
+# define POSH_POINTER_STRING "32-bits"
+#endif
+
+#if defined POSH_LITTLE_ENDIAN
+# define IS_BIG_ENDIAN 0
+
+# define NATIVE16 POSH_LittleU16
+# define NATIVE32 POSH_LittleU32
+# define NATIVE64 POSH_LittleU64
+# define FOREIGN16 POSH_BigU16
+# define FOREIGN32 POSH_BigU32
+# define FOREIGN64 POSH_BigU64
+#else
+# define IS_BIG_ENDIAN 1
+
+# define NATIVE16 POSH_BigU16
+# define NATIVE32 POSH_BigU32
+# define NATIVE64 POSH_BigU64
+# define FOREIGN16 POSH_LittleU16
+# define FOREIGN32 POSH_LittleU32
+# define FOREIGN64 POSH_LittleU64
+#endif /* POSH_LITTLE_ENDIAN */
+
+static
+int
+s_testBigEndian( void )
+{
+ union
+ {
+ posh_byte_t c[ 4 ];
+ posh_u32_t i;
+ } u;
+
+ u.i= 1;
+
+ if ( u.c[ 0 ] == 1 )
+ {
+ return 0;
+ }
+ return 1;
+}
+
+static
+const char *
+s_testSerialization( void )
+{
+ posh_byte_t serbuf[ 8 ];
+ posh_u16_t tmp16;
+ posh_u32_t tmp32;
+
+ /* 16-bit serialization */
+ POSH_WriteU16ToLittle( serbuf, 0xABCD );
+ if ( ( tmp16 = POSH_ReadU16FromLittle( serbuf ) ) != 0xABCD )
+ {
+ return "*ERROR: failed little-endian 16-bit serialization test";
+ }
+
+ POSH_WriteU16ToBig( serbuf, 0xABCD );
+ if ( ( tmp16 = POSH_ReadU16FromBig( serbuf ) ) != 0xABCD )
+ {
+ return "*ERROR: failed big-endian 16-bit serialization test";
+ }
+
+ /* 32-bit serialization */
+ POSH_WriteU32ToLittle( serbuf, 0xABCD1234L );
+ if ( ( tmp32 = POSH_ReadU32FromLittle( serbuf ) ) != 0xABCD1234 )
+ {
+ return "*ERROR: failed little-endian 32-bit serialization test";
+ }
+
+ POSH_WriteU32ToBig( serbuf, 0xABCD1234L );
+ if ( ( tmp32 = POSH_ReadU32FromBig( serbuf ) ) != 0xABCD1234 )
+ {
+ return "*ERROR: failed big-endian 32-bit serialization test";
+ }
+
+#if defined POSH_64BIT_INTEGER
+ {
+#define REF64 POSH_U64(0xFEDCBA9876543210)
+
+ posh_u64_t tmp64;
+
+ POSH_WriteU64ToLittle( serbuf, REF64 );
+
+ if ( ( tmp64 = POSH_ReadU64FromLittle( serbuf ) ) != REF64 )
+ {
+ return "*ERROR: failed little-endian 64-bit serialization test";
+ }
+
+ POSH_WriteU64ToBig( serbuf, REF64 );
+
+ if ( ( tmp64 = POSH_ReadU64FromBig( serbuf ) ) != REF64 )
+ {
+ return "*ERROR: failed big-endian 64-bit serialization test";
+ }
+ }
+#endif
+
+ return 0;
+}
+
+#if !defined POSH_NO_FLOAT
+static
+const char *
+s_testFloatingPoint( void )
+{
+ float fRef = 10.0f/30.0f;
+ double dRef = 10.0/30.0;
+ posh_byte_t dbuf[ 8 ];
+ float fTmp;
+ double dTmp;
+
+ fTmp = POSH_FloatFromLittleBits( POSH_LittleFloatBits( fRef ) );
+
+ if ( fTmp != fRef )
+ {
+ return "*ERROR: POSH little endian floating point conversion failed. Please report this to poshlib@poshlib.org!\n";
+ }
+
+ fTmp = POSH_FloatFromBigBits( POSH_BigFloatBits( fRef ) );
+ if ( fTmp != fRef )
+ {
+ return "*ERROR: POSH big endian floating point conversion failed. Please report this to poshlib@poshlib.org!\n";
+ }
+
+ POSH_DoubleBits( dRef, dbuf );
+
+ dTmp = POSH_DoubleFromBits( dbuf );
+
+ if ( dTmp != dRef )
+ {
+ return "*ERROR: POSH double precision floating point serialization failed. Please report this to poshlib@poshlib.org!\n";
+ }
+
+ return 0;
+}
+#endif /* !defined POSH_NO_FLOAT */
+
+static
+const char *
+s_testEndianess( void )
+{
+ /* check endianess */
+ if ( s_testBigEndian() != IS_BIG_ENDIAN )
+ {
+ return "*ERROR: POSH compile time endianess does not match run-time endianess verification. Please report this to poshlib@poshlib.org!\n";
+ }
+
+ /* make sure our endian swap routines work */
+ if ( ( NATIVE32( 0x11223344L ) != 0x11223344L ) ||
+ ( FOREIGN32( 0x11223344L ) != 0x44332211L ) ||
+ ( NATIVE16( 0x1234 ) != 0x1234 ) ||
+ ( FOREIGN16( 0x1234 ) != 0x3412 ) )
+ {
+ return "*ERROR: POSH endianess macro selection failed. Please report this to poshlib@poshlib.org!\n";
+ }
+
+ /* test serialization routines */
+
+ return 0;
+}
+#endif /* !defined FORCE_DOXYGEN */
+
+/**
+ Returns a string describing this platform's basic attributes.
+
+ POSH_GetArchString() reports on an architecture's statically determined
+ attributes. In addition, it will perform run-time verification checks
+ to make sure the various platform specific functions work. If an error
+ occurs, please contact me at poshlib@poshlib.org so we can try to resolve
+ what the specific failure case is.
+ @returns a string describing this platform on success, or a string in the
+ form "*ERROR: [text]" on failure. You can simply check to see if
+ the first character returned is '*' to verify an error condition.
+*/
+const char *
+POSH_GetArchString( void )
+{
+ const char *err;
+ const char *s = "OS:.............."POSH_OS_STRING"\n"
+ "CPU:............."POSH_CPU_STRING"\n"
+ "endian:.........."POSH_ENDIAN_STRING"\n"
+ "ptr size:........"POSH_POINTER_STRING"\n"
+ "64-bit ints......"POSH_64BIT_INTEGER_STRING"\n"
+ "floating point..."POSH_FLOAT_STRING"\n"
+ "compiler........."POSH_COMPILER_STRING"\n";
+
+ /* test endianess */
+ err = s_testEndianess();
+
+ if ( err != 0 )
+ {
+ return err;
+ }
+
+ /* test serialization */
+ err = s_testSerialization();
+
+ if ( err != 0 )
+ {
+ return err;
+ }
+
+#if !defined POSH_NO_FLOAT
+ /* check that our floating point support is correct */
+ err = s_testFloatingPoint();
+
+ if ( err != 0 )
+ {
+ return err;
+ }
+
+#endif
+
+ return s;
+}
+
+/* ---------------------------------------------------------------------------*/
+/* BYTE SWAPPING SUPPORT */
+/* ---------------------------------------------------------------------------*/
+/**
+ * Byte swaps a 16-bit unsigned value
+ *
+ @ingroup ByteSwapFunctions
+ @param v [in] unsigned 16-bit input value to swap
+ @returns a byte swapped version of v
+ */
+posh_u16_t
+POSH_SwapU16( posh_u16_t v )
+{
+ posh_u16_t swapped;
+
+ swapped = v << 8;
+ swapped |= v >> 8;
+
+ return swapped;
+}
+
+/**
+ * Byte swaps a 16-bit signed value
+ *
+ @ingroup ByteSwapFunctions
+ @param v [in] signed 16-bit input value to swap
+ @returns a byte swapped version of v
+ @remarks This just calls back to the unsigned version, since byte swapping
+ is independent of sign. However, we still provide this function to
+ avoid signed/unsigned mismatch compiler warnings.
+ */
+posh_i16_t
+POSH_SwapI16( posh_i16_t v )
+{
+ return ( posh_i16_t ) POSH_SwapU16( v );
+}
+
+/**
+ * Byte swaps a 32-bit unsigned value
+ *
+ @ingroup ByteSwapFunctions
+ @param v [in] unsigned 32-bit input value to swap
+ @returns a byte swapped version of v
+ */
+posh_u32_t
+POSH_SwapU32( posh_u32_t v )
+{
+ posh_u32_t swapped;
+
+ swapped = ( v & 0xFF ) << 24;
+ swapped |= ( v & 0xFF00 ) << 8;
+ swapped |= ( v >> 8 ) & 0xFF00;
+ swapped |= ( v >> 24 );
+
+ return swapped;
+}
+
+/**
+ * Byte swaps a 32-bit signed value
+ *
+ @ingroup ByteSwapFunctions
+ @param v [in] signed 32-bit input value to swap
+ @returns a byte swapped version of v
+ @remarks This just calls back to the unsigned version, since byte swapping
+ is independent of sign. However, we still provide this function to
+ avoid signed/unsigned mismatch compiler warnings.
+ */
+posh_i32_t
+POSH_SwapI32( posh_i32_t v )
+{
+ return ( posh_i32_t ) POSH_SwapU32( ( posh_u32_t ) v );
+}
+
+#if defined POSH_64BIT_INTEGER
+/**
+ * Byte swaps a 64-bit unsigned value
+
+ @param v [in] a 64-bit input value to swap
+ @ingroup SixtyFourBit
+ @returns a byte swapped version of v
+*/
+posh_u64_t
+POSH_SwapU64( posh_u64_t v )
+{
+ posh_byte_t tmp;
+ union {
+ posh_byte_t bytes[ 8 ];
+ posh_u64_t u64;
+ } u;
+
+ u.u64 = v;
+
+ tmp = u.bytes[ 0 ]; u.bytes[ 0 ] = u.bytes[ 7 ]; u.bytes[ 7 ] = tmp;
+ tmp = u.bytes[ 1 ]; u.bytes[ 1 ] = u.bytes[ 6 ]; u.bytes[ 6 ] = tmp;
+ tmp = u.bytes[ 2 ]; u.bytes[ 2 ] = u.bytes[ 5 ]; u.bytes[ 5 ] = tmp;
+ tmp = u.bytes[ 3 ]; u.bytes[ 3 ] = u.bytes[ 4 ]; u.bytes[ 4 ] = tmp;
+
+ return u.u64;
+}
+
+/**
+ * Byte swaps a 64-bit signed value
+
+ @param v [in] a 64-bit input value to swap
+ @ingroup SixtyFourBit
+ @returns a byte swapped version of v
+*/
+posh_i64_t
+POSH_SwapI64( posh_i64_t v )
+{
+ return ( posh_i64_t ) POSH_SwapU64( ( posh_u64_t ) v );
+}
+
+#endif /* defined POSH_64BIT_INTEGER */
+
+/* ---------------------------------------------------------------------------*/
+/* IN-MEMORY SERIALIZATION */
+/* ---------------------------------------------------------------------------*/
+
+/**
+ * Writes an unsigned 16-bit value to a little endian buffer
+
+ @ingroup MemoryBuffer
+ @param dst [out] pointer to the destination buffer, may not be NULL. Alignment doesn't matter.
+ @param value [in] host-endian unsigned 16-bit value
+ @returns a pointer to the location two bytes after dst
+ @remarks does no validation of the inputs
+*/
+posh_u16_t *
+POSH_WriteU16ToLittle( void *dst, posh_u16_t value )
+{
+ posh_u16_t *p16 = ( posh_u16_t * ) dst;
+ posh_byte_t *p = ( posh_byte_t * ) dst;
+
+ p[ 0 ] = value & 0xFF;
+ p[ 1 ] = ( value & 0xFF00) >> 8;
+
+ return p16 + 1;
+}
+
+/**
+ * Writes a signed 16-bit value to a little endian buffer
+
+ @ingroup MemoryBuffer
+ @param dst [out] pointer to the destination buffer, may not be NULL
+ @param value [in] host-endian signed 16-bit value
+ @returns a pointer to the location two bytes after dst
+ @remarks does no validation of the inputs. This simply calls
+ POSH_WriteU16ToLittle() with appropriate casting.
+*/
+posh_i16_t *
+POSH_WriteI16ToLittle( void *dst, posh_i16_t value )
+{
+ return ( posh_i16_t * ) POSH_WriteU16ToLittle( dst, ( posh_u16_t ) value );
+}
+
+/**
+ * Writes an unsigned 32-bit value to a little endian buffer
+
+ @ingroup MemoryBuffer
+ @param dst [out] pointer to the destination buffer, may not be NULL
+ @param value [in] host-endian signed 32-bit value
+ @returns a pointer to the location four bytes after dst
+ @remarks does no validation of the inputs.
+*/
+posh_u32_t *
+POSH_WriteU32ToLittle( void *dst, posh_u32_t value )
+{
+ posh_u32_t *p32 = ( posh_u32_t * ) dst;
+ posh_byte_t *p = ( posh_byte_t * ) dst;
+
+ p[ 0 ] = ( value & 0xFF );
+ p[ 1 ] = ( value & 0xFF00 ) >> 8;
+ p[ 2 ] = ( value & 0xFF0000 ) >> 16;
+ p[ 3 ] = ( value & 0xFF000000 ) >> 24;
+
+ return p32 + 1;
+}
+
+/**
+ * Writes a signed 32-bit value to a little endian buffer
+
+ @ingroup MemoryBuffer
+ @param dst [out] pointer to the destination buffer, may not be NULL
+ @param value [in] host-endian signed 32-bit value
+ @returns a pointer to the location four bytes after dst
+ @remarks does no validation of the inputs. This simply calls
+ POSH_WriteU32ToLittle() with appropriate casting.
+*/
+posh_i32_t *
+POSH_WriteI32ToLittle( void *dst, posh_i32_t value )
+{
+ return ( posh_i32_t * ) POSH_WriteU32ToLittle( dst, ( posh_u32_t ) value );
+}
+
+/**
+ * Writes an unsigned 16-bit value to a big endian buffer
+
+ @ingroup MemoryBuffer
+ @param dst [out] pointer to the destination buffer, may not be NULL
+ @param value [in] host-endian unsigned 16-bit value
+ @returns a pointer to the location two bytes after dst
+ @remarks does no validation of the inputs
+*/
+posh_u16_t *
+POSH_WriteU16ToBig( void *dst, posh_u16_t value )
+{
+ posh_u16_t *p16 = ( posh_u16_t * ) dst;
+ posh_byte_t *p = ( posh_byte_t * ) dst;
+
+ p[ 1 ] = ( value & 0xFF );
+ p[ 0 ] = ( value & 0xFF00 ) >> 8;
+
+ return p16 + 1;
+}
+
+/**
+ * Writes a signed 16-bit value to a big endian buffer
+
+ @ingroup MemoryBuffer
+ @param dst [out] pointer to the destination buffer, may not be NULL
+ @param value [in] host-endian signed 16-bit value
+ @returns a pointer to the location two bytes after dst
+ @remarks does no validation of the inputs. This simply calls
+ POSH_WriteU16ToLittle() with appropriate casting.
+*/
+posh_i16_t *
+POSH_WriteI16ToBig( void *dst, posh_i16_t value )
+{
+ return ( posh_i16_t * ) POSH_WriteU16ToBig( dst, ( posh_u16_t ) value );
+}
+
+/**
+ * Writes an unsigned 32-bit value to a big endian buffer
+
+ @ingroup MemoryBuffer
+ @param dst [out] pointer to the destination buffer, may not be NULL
+ @param value [in] host-endian unsigned 32-bit value
+ @returns a pointer to the location four bytes after dst
+ @remarks does no validation of the inputs.
+*/
+posh_u32_t *
+POSH_WriteU32ToBig( void *dst, posh_u32_t value )
+{
+ posh_u32_t *p32 = ( posh_u32_t * ) dst;
+ posh_byte_t *p = ( posh_byte_t * ) dst;
+
+ p[ 3 ] = ( value & 0xFF );
+ p[ 2 ] = ( value & 0xFF00 ) >> 8;
+ p[ 1 ] = ( value & 0xFF0000 ) >> 16;
+ p[ 0 ] = ( value & 0xFF000000 ) >> 24;
+
+ return p32 + 1;
+}
+
+/**
+ * Writes a signed 32-bit value to a big endian buffer
+
+ @ingroup MemoryBuffer
+ @param dst [out] pointer to the destination buffer, may not be NULL
+ @param value [in] host-endian signed 32-bit value
+ @returns a pointer to the location four bytes after dst
+ @remarks does no validation of the inputs. This simply calls
+ POSH_WriteU32ToBig() with appropriate casting.
+*/
+posh_i32_t *
+POSH_WriteI32ToBig( void *dst, posh_i32_t value )
+{
+ return ( posh_i32_t * ) POSH_WriteU32ToBig( dst, ( posh_u32_t ) value );
+}
+
+#if defined POSH_64BIT_INTEGER
+/**
+ * Writes an unsigned 64-bit value to a little-endian buffer
+
+ @ingroup SixtyFourBit
+ @param dst [out] pointer to the destination buffer, may not be NULL
+ @param value [in] host-endian unsigned 64-bit value
+ @returns a pointer to the location eight bytes after dst
+ @remarks does no validation of the inputs.
+*/
+posh_u64_t *
+POSH_WriteU64ToLittle( void *dst, posh_u64_t value )
+{
+ posh_u64_t *p64 = ( posh_u64_t * ) dst;
+ posh_byte_t *p = ( posh_byte_t * ) dst;
+ int i;
+
+ for ( i = 0; i < 8; i++, value >>= 8 )
+ {
+ p[ i ] = ( posh_byte_t ) ( value & 0xFF );
+ }
+
+ return p64 + 1;
+}
+
+/**
+ * Writes a signed 64-bit value to a little-endian buffer
+
+ @ingroup SixtyFourBit
+ @param dst [out] pointer to the destination buffer, may not be NULL
+ @param value [in] host-endian unsigned 64-bit value
+ @returns a pointer to the location eight bytes after dst
+ @remarks does no validation of the inputs.
+*/
+posh_i64_t *
+POSH_WriteI64ToLittle( void *dst, posh_i64_t value )
+{
+ return ( posh_i64_t * ) POSH_WriteU64ToLittle( dst, ( posh_u64_t ) value );
+}
+
+/**
+ * Writes an unsigned 64-bit value to a big-endian buffer
+
+ @ingroup SixtyFourBit
+ @param dst [out] pointer to the destination buffer, may not be NULL
+ @param value [in] host-endian unsigned 64-bit value
+ @returns a pointer to the location eight bytes after dst
+ @remarks does no validation of the inputs.
+*/
+posh_u64_t *
+POSH_WriteU64ToBig( void *dst, posh_u64_t value )
+{
+ posh_u64_t *p64 = ( posh_u64_t * ) dst;
+ posh_byte_t *p = ( posh_byte_t * ) dst;
+ int i;
+
+ for ( i = 0; i < 8; i++, value >>= 8 )
+ {
+ p[ 7-i ] = ( posh_byte_t ) ( value & 0xFF );
+ }
+
+ return p64 + 8;
+}
+
+/**
+ * Writes a signed 64-bit value to a big-endian buffer
+
+ @ingroup SixtyFourBit
+ @param dst [out] pointer to the destination buffer, may not be NULL
+ @param value [in] host-endian signed 64-bit value
+ @returns a pointer to the location eight bytes after dst
+ @remarks does no validation of the inputs.
+*/
+posh_i64_t *
+POSH_WriteI64ToBig( void *dst, posh_i64_t value )
+{
+ return ( posh_i64_t * ) POSH_WriteU64ToBig( dst, ( posh_u64_t ) value );
+}
+
+#endif /* POSH_64BIT_INTEGER */
+
+/* ---------------------------------------------------------------------------*/
+/* IN-MEMORY DESERIALIZATION */
+/* ---------------------------------------------------------------------------*/
+
+/**
+ * Reads an unsigned 16-bit value from a little-endian buffer
+ @ingroup MemoryBuffer
+ @param src [in] source buffer
+ @returns host-endian unsigned 16-bit value
+*/
+posh_u16_t
+POSH_ReadU16FromLittle( const void *src )
+{
+ posh_u16_t v = 0;
+ posh_byte_t *p = ( posh_byte_t * ) src;
+
+ v |= p[ 0 ];
+ v |= ( ( posh_u16_t ) p[ 1 ] ) << 8;
+
+ return v;
+}
+
+/**
+ * Reads a signed 16-bit value from a little-endian buffer
+ @ingroup MemoryBuffer
+ @param src [in] source buffer
+ @returns host-endian signed 16-bit value
+*/
+posh_i16_t
+POSH_ReadI16FromLittle( const void *src )
+{
+ return ( posh_i16_t ) POSH_ReadU16FromLittle( src );
+}
+
+/**
+ * Reads an unsigned 32-bit value from a little-endian buffer
+ @ingroup MemoryBuffer
+ @param src [in] source buffer
+ @returns host-endian unsigned 32-bit value
+*/
+posh_u32_t
+POSH_ReadU32FromLittle( const void *src )
+{
+ posh_u32_t v = 0;
+ posh_byte_t *p = ( posh_byte_t * ) src;
+
+ v |= p[ 0 ];
+ v |= ( ( posh_u32_t ) p[ 1 ] ) << 8;
+ v |= ( ( posh_u32_t ) p[ 2 ] ) << 16;
+ v |= ( ( posh_u32_t ) p[ 3 ] ) << 24;
+
+ return v;
+}
+
+/**
+ * Reads a signed 32-bit value from a little-endian buffer
+ @ingroup MemoryBuffer
+ @param src [in] source buffer
+ @returns host-endian signed 32-bit value
+*/
+posh_i32_t
+POSH_ReadI32FromLittle( const void *src )
+{
+ return ( posh_i32_t ) POSH_ReadU32FromLittle( src );
+}
+
+
+/**
+ * Reads an unsigned 16-bit value from a big-endian buffer
+ @ingroup MemoryBuffer
+ @param src [in] source buffer
+ @returns host-endian unsigned 16-bit value
+*/
+posh_u16_t
+POSH_ReadU16FromBig( const void *src )
+{
+ posh_u16_t v = 0;
+ posh_byte_t *p = ( posh_byte_t * ) src;
+
+ v |= p[ 1 ];
+ v |= ( ( posh_u16_t ) p[ 0 ] ) << 8;
+
+ return v;
+}
+
+/**
+ * Reads a signed 16-bit value from a big-endian buffer
+ @ingroup MemoryBuffer
+ @param src [in] source buffer
+ @returns host-endian signed 16-bit value
+*/
+posh_i16_t
+POSH_ReadI16FromBig( const void *src )
+{
+ return ( posh_i16_t ) POSH_ReadU16FromBig( src );
+}
+
+/**
+ * Reads an unsigned 32-bit value from a big-endian buffer
+ @ingroup MemoryBuffer
+ @param src [in] source buffer
+ @returns host-endian unsigned 32-bit value
+*/
+posh_u32_t
+POSH_ReadU32FromBig( const void *src )
+{
+ posh_u32_t v = 0;
+ posh_byte_t *p = ( posh_byte_t * ) src;
+
+ v |= p[ 3 ];
+ v |= ( ( posh_u32_t ) p[ 2 ] ) << 8;
+ v |= ( ( posh_u32_t ) p[ 1 ] ) << 16;
+ v |= ( ( posh_u32_t ) p[ 0 ] ) << 24;
+
+ return v;
+}
+
+/**
+ * Reads a signed 32-bit value from a big-endian buffer
+ @ingroup MemoryBuffer
+ @param src [in] source buffer
+ @returns host-endian signed 32-bit value
+*/
+posh_i32_t
+POSH_ReadI32FromBig( const void *src )
+{
+ return POSH_BigI32( (*(const posh_i32_t*)src ) );
+}
+
+#if defined POSH_64BIT_INTEGER
+
+/**
+ * Reads an unsigned 64-bit value from a little-endian buffer
+ @param src [in] source buffer
+ @returns host-endian unsigned 32-bit value
+*/
+posh_u64_t
+POSH_ReadU64FromLittle( const void *src )
+{
+ posh_u64_t v = 0;
+ posh_byte_t *p = ( posh_byte_t * ) src;
+ int i;
+
+ for ( i = 0; i < 8; i++ )
+ {
+ v |= ( ( posh_u64_t ) p[ i ] ) << (i*8);
+ }
+
+ return v;
+}
+
+/**
+ * Reads a signed 64-bit value from a little-endian buffer
+ @param src [in] source buffer
+ @returns host-endian signed 32-bit value
+*/
+posh_i64_t
+POSH_ReadI64FromLittle( const void *src )
+{
+ return ( posh_i64_t ) POSH_ReadU64FromLittle( src );
+}
+
+/**
+ * Reads an unsigned 64-bit value from a big-endian buffer
+ @param src [in] source buffer
+ @returns host-endian unsigned 32-bit value
+*/
+posh_u64_t
+POSH_ReadU64FromBig( const void *src )
+{
+ posh_u64_t v = 0;
+ posh_byte_t *p = ( posh_byte_t * ) src;
+ int i;
+
+ for ( i = 0; i < 8; i++ )
+ {
+ v |= ( ( posh_u64_t ) p[ 7-i ] ) << (i*8);
+ }
+
+ return v;
+}
+
+/**
+ * Reads an signed 64-bit value from a big-endian buffer
+ @param src [in] source buffer
+ @returns host-endian signed 32-bit value
+*/
+posh_i64_t
+POSH_ReadI64FromBig( const void *src )
+{
+ return ( posh_i64_t ) POSH_ReadU64FromBig( src );
+}
+
+#endif /* POSH_64BIT_INTEGER */
+
+/* ---------------------------------------------------------------------------*/
+/* FLOATING POINT SUPPORT */
+/* ---------------------------------------------------------------------------*/
+
+#if !defined POSH_NO_FLOAT
+
+/** @ingroup FloatingPoint
+ @param[in] f floating point value
+ @returns a little-endian bit representation of f
+ */
+posh_u32_t
+POSH_LittleFloatBits( float f )
+{
+ union
+ {
+ float f32;
+ posh_u32_t u32;
+ } u;
+
+ u.f32 = f;
+
+ return POSH_LittleU32( u.u32 );
+}
+
+/**
+ * Extracts raw big-endian bits from a 32-bit floating point value
+ *
+ @ingroup FloatingPoint
+ @param f [in] floating point value
+ @returns a big-endian bit representation of f
+ */
+posh_u32_t
+POSH_BigFloatBits( float f )
+{
+ union
+ {
+ float f32;
+ posh_u32_t u32;
+ } u;
+
+ u.f32 = f;
+
+ return POSH_BigU32( u.u32 );
+}
+
+/**
+ * Extracts raw, little-endian bit representation from a 64-bit double.
+ *
+ @param d [in] 64-bit double precision value
+ @param dst [out] 8-byte storage buffer
+ @ingroup FloatingPoint
+ @returns the raw bits used to represent the value 'd', in the form dst[0]=LSB
+ */
+void
+POSH_DoubleBits( double d, posh_byte_t dst[ 8 ] )
+{
+ union
+ {
+ double d64;
+ posh_byte_t bytes[ 8 ];
+ } u;
+
+ u.d64 = d;
+
+#if defined POSH_LITTLE_ENDIAN
+ dst[ 0 ] = u.bytes[ 0 ];
+ dst[ 1 ] = u.bytes[ 1 ];
+ dst[ 2 ] = u.bytes[ 2 ];
+ dst[ 3 ] = u.bytes[ 3 ];
+ dst[ 4 ] = u.bytes[ 4 ];
+ dst[ 5 ] = u.bytes[ 5 ];
+ dst[ 6 ] = u.bytes[ 6 ];
+ dst[ 7 ] = u.bytes[ 7 ];
+#else
+ dst[ 0 ] = u.bytes[ 7 ];
+ dst[ 1 ] = u.bytes[ 6 ];
+ dst[ 2 ] = u.bytes[ 5 ];
+ dst[ 3 ] = u.bytes[ 4 ];
+ dst[ 4 ] = u.bytes[ 3 ];
+ dst[ 5 ] = u.bytes[ 2 ];
+ dst[ 6 ] = u.bytes[ 1 ];
+ dst[ 7 ] = u.bytes[ 0 ];
+#endif
+}
+
+/**
+ * Creates a double-precision, 64-bit floating point value from a set of raw,
+ * little-endian bits
+
+ @ingroup FloatingPoint
+ @param src [in] little-endian byte representation of 64-bit double precision
+ floating point value
+ @returns double precision floating point representation of the raw bits
+ @remarks No error checking is performed, so there are no guarantees that the
+ result is a valid number, nor is there any check to ensure that src is
+ non-NULL. BE CAREFUL USING THIS.
+ */
+double
+POSH_DoubleFromBits( const posh_byte_t src[ 8 ] )
+{
+ union
+ {
+ double d64;
+ posh_byte_t bytes[ 8 ];
+ } u;
+
+#if defined POSH_LITTLE_ENDIAN
+ u.bytes[ 0 ] = src[ 0 ];
+ u.bytes[ 1 ] = src[ 1 ];
+ u.bytes[ 2 ] = src[ 2 ];
+ u.bytes[ 3 ] = src[ 3 ];
+ u.bytes[ 4 ] = src[ 4 ];
+ u.bytes[ 5 ] = src[ 5 ];
+ u.bytes[ 6 ] = src[ 6 ];
+ u.bytes[ 7 ] = src[ 7 ];
+#else
+ u.bytes[ 0 ] = src[ 7 ];
+ u.bytes[ 1 ] = src[ 6 ];
+ u.bytes[ 2 ] = src[ 5 ];
+ u.bytes[ 3 ] = src[ 4 ];
+ u.bytes[ 4 ] = src[ 3 ];
+ u.bytes[ 5 ] = src[ 2 ];
+ u.bytes[ 6 ] = src[ 1 ];
+ u.bytes[ 7 ] = src[ 0 ];
+#endif
+
+ return u.d64;
+}
+
+/**
+ * Creates a floating point number from little endian bits
+ *
+ @ingroup FloatingPoint
+ @param bits [in] raw floating point bits in little-endian form
+ @returns a floating point number based on the given bit representation
+ @remarks No error checking is performed, so there are no guarantees that the
+ result is a valid number. BE CAREFUL USING THIS.
+ */
+float
+POSH_FloatFromLittleBits( posh_u32_t bits )
+{
+ union
+ {
+ float f32;
+ posh_u32_t u32;
+ } u;
+
+ u.u32 = bits;
+#if defined POSH_BIG_ENDIAN
+ u.u32 = POSH_SwapU32( u.u32 );
+#endif
+
+ return u.f32;
+}
+
+/**
+ * Creates a floating point number from big-endian bits
+ *
+ @ingroup FloatingPoint
+ @param bits [in] raw floating point bits in big-endian form
+ @returns a floating point number based on the given bit representation
+ @remarks No error checking is performed, so there are no guarantees that the
+ result is a valid number. BE CAREFUL USING THIS.
+ */
+float
+POSH_FloatFromBigBits( posh_u32_t bits )
+{
+ union
+ {
+ float f32;
+ posh_u32_t u32;
+ } u;
+
+ u.u32 = bits;
+#if defined POSH_LITTLE_ENDIAN
+ u.u32 = POSH_SwapU32( u.u32 );
+#endif
+
+ return u.f32;
+}
+
+#endif /* !defined POSH_NO_FLOAT */
diff --git a/thirdparty/thekla_atlas/poshlib/posh.h b/thirdparty/thekla_atlas/poshlib/posh.h
new file mode 100644
index 0000000000..c3efe26a2d
--- /dev/null
+++ b/thirdparty/thekla_atlas/poshlib/posh.h
@@ -0,0 +1,1030 @@
+/**
+@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 __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 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
+
+