|
|
|
|
/*
|
|
|
|
|
File: Endian.h
|
|
|
|
|
|
|
|
|
|
Contains: Endian swapping utilties
|
|
|
|
|
|
|
|
|
|
Version: QuickTime 7.3
|
|
|
|
|
|
|
|
|
|
Copyright: (c) 2007 (c) 1997-2001 by Apple Computer, Inc., all rights reserved
|
|
|
|
|
|
|
|
|
|
Bugs?: For bug reports, consult the following page on
|
|
|
|
|
the World Wide Web:
|
|
|
|
|
|
|
|
|
|
http://developer.apple.com/bugreporter/
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
#ifndef __ENDIAN__
|
|
|
|
|
#define __ENDIAN__
|
|
|
|
|
|
|
|
|
|
#ifndef __CONDITIONALMACROS__
|
|
|
|
|
#include <ConditionalMacros.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifndef __MACTYPES__
|
|
|
|
|
#include <MacTypes.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if PRAGMA_ONCE
|
|
|
|
|
#pragma once
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
extern "C" {
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if PRAGMA_IMPORT
|
|
|
|
|
#pragma import on
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if PRAGMA_STRUCT_ALIGN
|
|
|
|
|
#pragma options align=mac68k
|
|
|
|
|
#elif PRAGMA_STRUCT_PACKPUSH
|
|
|
|
|
#pragma pack(push, 2)
|
|
|
|
|
#elif PRAGMA_STRUCT_PACK
|
|
|
|
|
#pragma pack(2)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
This file provides Endian Flipping routines for dealing with converting data
|
|
|
|
|
between Big-Endian and Little-Endian machines. These routines are useful
|
|
|
|
|
when writing code to compile for both Big and Little Endian machines and
|
|
|
|
|
which must handle other endian number formats, such as reading or writing
|
|
|
|
|
to a file or network packet.
|
|
|
|
|
|
|
|
|
|
These routines are named as follows:
|
|
|
|
|
|
|
|
|
|
Endian<U><W>_<S>to<D>
|
|
|
|
|
|
|
|
|
|
where
|
|
|
|
|
<U> is whether the integer is signed ('S') or unsigned ('U')
|
|
|
|
|
<W> is integer bit width: 16, 32, or 64
|
|
|
|
|
<S> is the source endian format: 'B' for big, 'L' for little, or 'N' for native
|
|
|
|
|
<D> is the destination endian format: 'B' for big, 'L' for little, or 'N' for native
|
|
|
|
|
|
|
|
|
|
For example, to convert a Big Endian 32-bit unsigned integer to the current native format use:
|
|
|
|
|
|
|
|
|
|
long i = EndianU32_BtoN(data);
|
|
|
|
|
|
|
|
|
|
This file is set up so that the function macro to nothing when the target runtime already
|
|
|
|
|
is the desired format (e.g. on Big Endian machines, EndianU32_BtoN() macros away).
|
|
|
|
|
|
|
|
|
|
If long long's are not supported, you cannot get 64-bit quantities as a single value.
|
|
|
|
|
The macros are not defined in that case.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<<< W A R N I N G >>>
|
|
|
|
|
|
|
|
|
|
It is very important not to put any autoincrements inside the macros. This
|
|
|
|
|
will produce erroneous results because each time the address is accessed in the macro,
|
|
|
|
|
the increment occurs.
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
/*
|
|
|
|
|
Note: These functions are currently not implemented in any library
|
|
|
|
|
and are only listed here as function prototypes to document the macros
|
|
|
|
|
*/
|
|
|
|
|
#if CALL_NOT_IN_CARBON
|
|
|
|
|
/*
|
|
|
|
|
* EndianS16_BtoN()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( SInt16 )
|
|
|
|
|
EndianS16_BtoN(SInt16 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianS16_NtoB()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( SInt16 )
|
|
|
|
|
EndianS16_NtoB(SInt16 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianS16_LtoN()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( SInt16 )
|
|
|
|
|
EndianS16_LtoN(SInt16 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianS16_NtoL()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( SInt16 )
|
|
|
|
|
EndianS16_NtoL(SInt16 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianS16_LtoB()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( SInt16 )
|
|
|
|
|
EndianS16_LtoB(SInt16 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianS16_BtoL()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( SInt16 )
|
|
|
|
|
EndianS16_BtoL(SInt16 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianU16_BtoN()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( UInt16 )
|
|
|
|
|
EndianU16_BtoN(UInt16 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianU16_NtoB()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( UInt16 )
|
|
|
|
|
EndianU16_NtoB(UInt16 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianU16_LtoN()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( UInt16 )
|
|
|
|
|
EndianU16_LtoN(UInt16 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianU16_NtoL()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( UInt16 )
|
|
|
|
|
EndianU16_NtoL(UInt16 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianU16_LtoB()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( UInt16 )
|
|
|
|
|
EndianU16_LtoB(UInt16 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianU16_BtoL()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( UInt16 )
|
|
|
|
|
EndianU16_BtoL(UInt16 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianS32_BtoN()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( SInt32 )
|
|
|
|
|
EndianS32_BtoN(SInt32 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianS32_NtoB()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( SInt32 )
|
|
|
|
|
EndianS32_NtoB(SInt32 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianS32_LtoN()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( SInt32 )
|
|
|
|
|
EndianS32_LtoN(SInt32 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianS32_NtoL()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( SInt32 )
|
|
|
|
|
EndianS32_NtoL(SInt32 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianS32_LtoB()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( SInt32 )
|
|
|
|
|
EndianS32_LtoB(SInt32 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianS32_BtoL()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( SInt32 )
|
|
|
|
|
EndianS32_BtoL(SInt32 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianU32_BtoN()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( UInt32 )
|
|
|
|
|
EndianU32_BtoN(UInt32 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianU32_NtoB()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( UInt32 )
|
|
|
|
|
EndianU32_NtoB(UInt32 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianU32_LtoN()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( UInt32 )
|
|
|
|
|
EndianU32_LtoN(UInt32 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianU32_NtoL()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( UInt32 )
|
|
|
|
|
EndianU32_NtoL(UInt32 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianU32_LtoB()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( UInt32 )
|
|
|
|
|
EndianU32_LtoB(UInt32 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianU32_BtoL()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( UInt32 )
|
|
|
|
|
EndianU32_BtoL(UInt32 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif /* CALL_NOT_IN_CARBON */
|
|
|
|
|
|
|
|
|
|
#if !TYPE_LONGLONG
|
|
|
|
|
/*
|
|
|
|
|
Note: If these Int64 functions ever were implemented in a library,
|
|
|
|
|
we would need two libraries, one for compilers that
|
|
|
|
|
support long long and one for other compilers.
|
|
|
|
|
*/
|
|
|
|
|
#if CALL_NOT_IN_CARBON
|
|
|
|
|
/*
|
|
|
|
|
* EndianS64_BtoN()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( SInt64 )
|
|
|
|
|
EndianS64_BtoN(SInt64 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianS64_NtoB()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( SInt64 )
|
|
|
|
|
EndianS64_NtoB(SInt64 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianS64_LtoN()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( SInt64 )
|
|
|
|
|
EndianS64_LtoN(SInt64 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianS64_NtoL()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( SInt64 )
|
|
|
|
|
EndianS64_NtoL(SInt64 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianS64_LtoB()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( SInt64 )
|
|
|
|
|
EndianS64_LtoB(SInt64 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianS64_BtoL()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( SInt64 )
|
|
|
|
|
EndianS64_BtoL(SInt64 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianU64_BtoN()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( UInt64 )
|
|
|
|
|
EndianU64_BtoN(UInt64 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianU64_NtoB()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( UInt64 )
|
|
|
|
|
EndianU64_NtoB(UInt64 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianU64_LtoN()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( UInt64 )
|
|
|
|
|
EndianU64_LtoN(UInt64 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianU64_NtoL()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( UInt64 )
|
|
|
|
|
EndianU64_NtoL(UInt64 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianU64_LtoB()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( UInt64 )
|
|
|
|
|
EndianU64_LtoB(UInt64 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* EndianU64_BtoL()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( UInt64 )
|
|
|
|
|
EndianU64_BtoL(UInt64 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif /* CALL_NOT_IN_CARBON */
|
|
|
|
|
|
|
|
|
|
#endif /* !TYPE_LONGLONG */
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
These types are used for structures that contain data that is
|
|
|
|
|
always in BigEndian format. This extra typing prevents little
|
|
|
|
|
endian code from directly changing the data, thus saving much
|
|
|
|
|
time in the debugger.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#if TARGET_RT_LITTLE_ENDIAN
|
|
|
|
|
struct BigEndianLong {
|
|
|
|
|
long bigEndianValue;
|
|
|
|
|
};
|
|
|
|
|
typedef struct BigEndianLong BigEndianLong;
|
|
|
|
|
struct BigEndianUnsignedLong {
|
|
|
|
|
unsigned long bigEndianValue;
|
|
|
|
|
};
|
|
|
|
|
typedef struct BigEndianUnsignedLong BigEndianUnsignedLong;
|
|
|
|
|
struct BigEndianShort {
|
|
|
|
|
short bigEndianValue;
|
|
|
|
|
};
|
|
|
|
|
typedef struct BigEndianShort BigEndianShort;
|
|
|
|
|
struct BigEndianUnsignedShort {
|
|
|
|
|
unsigned short bigEndianValue;
|
|
|
|
|
};
|
|
|
|
|
typedef struct BigEndianUnsignedShort BigEndianUnsignedShort;
|
|
|
|
|
struct BigEndianFixed {
|
|
|
|
|
Fixed bigEndianValue;
|
|
|
|
|
};
|
|
|
|
|
typedef struct BigEndianFixed BigEndianFixed;
|
|
|
|
|
struct BigEndianUnsignedFixed {
|
|
|
|
|
UnsignedFixed bigEndianValue;
|
|
|
|
|
};
|
|
|
|
|
typedef struct BigEndianUnsignedFixed BigEndianUnsignedFixed;
|
|
|
|
|
struct BigEndianOSType {
|
|
|
|
|
OSType bigEndianValue;
|
|
|
|
|
};
|
|
|
|
|
typedef struct BigEndianOSType BigEndianOSType;
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
|
|
typedef long BigEndianLong;
|
|
|
|
|
typedef unsigned long BigEndianUnsignedLong;
|
|
|
|
|
typedef short BigEndianShort;
|
|
|
|
|
typedef unsigned short BigEndianUnsignedShort;
|
|
|
|
|
typedef Fixed BigEndianFixed;
|
|
|
|
|
typedef UnsignedFixed BigEndianUnsignedFixed;
|
|
|
|
|
typedef OSType BigEndianOSType;
|
|
|
|
|
#endif /* TARGET_RT_LITTLE_ENDIAN */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
Macro away no-op functions
|
|
|
|
|
*/
|
|
|
|
|
#if TARGET_RT_BIG_ENDIAN
|
|
|
|
|
#define EndianS16_BtoN(value) (value)
|
|
|
|
|
#define EndianS16_NtoB(value) (value)
|
|
|
|
|
#define EndianU16_BtoN(value) (value)
|
|
|
|
|
#define EndianU16_NtoB(value) (value)
|
|
|
|
|
#define EndianS32_BtoN(value) (value)
|
|
|
|
|
#define EndianS32_NtoB(value) (value)
|
|
|
|
|
#define EndianU32_BtoN(value) (value)
|
|
|
|
|
#define EndianU32_NtoB(value) (value)
|
|
|
|
|
#define EndianS64_BtoN(value) (value)
|
|
|
|
|
#define EndianS64_NtoB(value) (value)
|
|
|
|
|
#define EndianU64_BtoN(value) (value)
|
|
|
|
|
#define EndianU64_NtoB(value) (value)
|
|
|
|
|
#else
|
|
|
|
|
#define EndianS16_LtoN(value) (value)
|
|
|
|
|
#define EndianS16_NtoL(value) (value)
|
|
|
|
|
#define EndianU16_LtoN(value) (value)
|
|
|
|
|
#define EndianU16_NtoL(value) (value)
|
|
|
|
|
#define EndianS32_LtoN(value) (value)
|
|
|
|
|
#define EndianS32_NtoL(value) (value)
|
|
|
|
|
#define EndianU32_LtoN(value) (value)
|
|
|
|
|
#define EndianU32_NtoL(value) (value)
|
|
|
|
|
#define EndianS64_LtoN(value) (value)
|
|
|
|
|
#define EndianS64_NtoL(value) (value)
|
|
|
|
|
#define EndianU64_LtoN(value) (value)
|
|
|
|
|
#define EndianU64_NtoL(value) (value)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
Map native to actual
|
|
|
|
|
*/
|
|
|
|
|
#if TARGET_RT_BIG_ENDIAN
|
|
|
|
|
#define EndianS16_LtoN(value) EndianS16_LtoB(value)
|
|
|
|
|
#define EndianS16_NtoL(value) EndianS16_BtoL(value)
|
|
|
|
|
#define EndianU16_LtoN(value) EndianU16_LtoB(value)
|
|
|
|
|
#define EndianU16_NtoL(value) EndianU16_BtoL(value)
|
|
|
|
|
#define EndianS32_LtoN(value) EndianS32_LtoB(value)
|
|
|
|
|
#define EndianS32_NtoL(value) EndianS32_BtoL(value)
|
|
|
|
|
#define EndianU32_LtoN(value) EndianU32_LtoB(value)
|
|
|
|
|
#define EndianU32_NtoL(value) EndianU32_BtoL(value)
|
|
|
|
|
#define EndianS64_LtoN(value) EndianS64_LtoB(value)
|
|
|
|
|
#define EndianS64_NtoL(value) EndianS64_BtoL(value)
|
|
|
|
|
#define EndianU64_LtoN(value) EndianU64_LtoB(value)
|
|
|
|
|
#define EndianU64_NtoL(value) EndianU64_BtoL(value)
|
|
|
|
|
#else
|
|
|
|
|
#define EndianS16_BtoN(value) EndianS16_BtoL(value)
|
|
|
|
|
#define EndianS16_NtoB(value) EndianS16_LtoB(value)
|
|
|
|
|
#define EndianU16_BtoN(value) EndianU16_BtoL(value)
|
|
|
|
|
#define EndianU16_NtoB(value) EndianU16_LtoB(value)
|
|
|
|
|
#define EndianS32_BtoN(value) EndianS32_BtoL(value)
|
|
|
|
|
#define EndianS32_NtoB(value) EndianS32_LtoB(value)
|
|
|
|
|
#define EndianU32_BtoN(value) EndianU32_BtoL(value)
|
|
|
|
|
#define EndianU32_NtoB(value) EndianU32_LtoB(value)
|
|
|
|
|
#define EndianS64_BtoN(value) EndianS64_BtoL(value)
|
|
|
|
|
#define EndianS64_NtoB(value) EndianS64_LtoB(value)
|
|
|
|
|
#define EndianU64_BtoN(value) EndianU64_BtoL(value)
|
|
|
|
|
#define EndianU64_NtoB(value) EndianU64_LtoB(value)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
Implement <EFBFBD>LtoB and <EFBFBD>BtoL
|
|
|
|
|
*/
|
|
|
|
|
#define EndianS16_LtoB(value) ((SInt16)Endian16_Swap(value))
|
|
|
|
|
#define EndianS16_BtoL(value) ((SInt16)Endian16_Swap(value))
|
|
|
|
|
#define EndianU16_LtoB(value) ((UInt16)Endian16_Swap(value))
|
|
|
|
|
#define EndianU16_BtoL(value) ((UInt16)Endian16_Swap(value))
|
|
|
|
|
#define EndianS32_LtoB(value) ((SInt32)Endian32_Swap(value))
|
|
|
|
|
#define EndianS32_BtoL(value) ((SInt32)Endian32_Swap(value))
|
|
|
|
|
#define EndianU32_LtoB(value) ((UInt32)Endian32_Swap(value))
|
|
|
|
|
#define EndianU32_BtoL(value) ((UInt32)Endian32_Swap(value))
|
|
|
|
|
#define EndianS64_LtoB(value) ((SInt64)Endian64_Swap((UInt64)value))
|
|
|
|
|
#define EndianS64_BtoL(value) ((SInt64)Endian64_Swap((UInt64)value))
|
|
|
|
|
#define EndianU64_LtoB(value) ((UInt64)Endian64_Swap(value))
|
|
|
|
|
#define EndianU64_BtoL(value) ((UInt64)Endian64_Swap(value))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
Implement low level *_Swap functions.
|
|
|
|
|
|
|
|
|
|
extern UInt16 Endian16_Swap(UInt16 value);
|
|
|
|
|
extern UInt32 Endian32_Swap(UInt32 value);
|
|
|
|
|
extern UInt64 Endian64_Swap(UInt64 value);
|
|
|
|
|
|
|
|
|
|
Note: Depending on the processor, you might want to implement
|
|
|
|
|
these as function calls instead of macros.
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
#if CALL_NOT_IN_CARBON
|
|
|
|
|
/*
|
|
|
|
|
* Endian16_Swap()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
#if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
|
|
|
|
|
#pragma parameter __D0 Endian16_Swap(__D0)
|
|
|
|
|
#endif
|
|
|
|
|
EXTERN_API( UInt16 )
|
|
|
|
|
Endian16_Swap(UInt16 value) ONEWORDINLINE(0xE158);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Endian32_Swap()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
#if TARGET_OS_MAC && TARGET_CPU_68K && !TARGET_RT_MAC_CFM
|
|
|
|
|
#pragma parameter __D0 Endian32_Swap(__D0)
|
|
|
|
|
#endif
|
|
|
|
|
EXTERN_API( UInt32 )
|
|
|
|
|
Endian32_Swap(UInt32 value) THREEWORDINLINE(0xE158, 0x4840, 0xE158);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif /* CALL_NOT_IN_CARBON */
|
|
|
|
|
|
|
|
|
|
/* override with macros */
|
|
|
|
|
#define Endian16_Swap(value) \
|
|
|
|
|
(((((UInt16)value)<<8) & 0xFF00) | \
|
|
|
|
|
((((UInt16)value)>>8) & 0x00FF))
|
|
|
|
|
|
|
|
|
|
#define Endian32_Swap(value) \
|
|
|
|
|
(((((UInt32)value)<<24) & 0xFF000000) | \
|
|
|
|
|
((((UInt32)value)<< 8) & 0x00FF0000) | \
|
|
|
|
|
((((UInt32)value)>> 8) & 0x0000FF00) | \
|
|
|
|
|
((((UInt32)value)>>24) & 0x000000FF))
|
|
|
|
|
|
|
|
|
|
#if TYPE_LONGLONG
|
|
|
|
|
#if TARGET_OS_WIN32
|
|
|
|
|
/* the inline macros crash MSDEV's optimizer on Windows. */
|
|
|
|
|
extern UInt64 Endian64_Swap(UInt64 value);
|
|
|
|
|
#elif defined(__MWERKS__) && (__MWERKS__ < 0x1800)
|
|
|
|
|
/* older Metrowerks compilers errored on LL suffix */
|
|
|
|
|
#define Endian64_Swap(value) \
|
|
|
|
|
(((((UInt64)value)<<56) & 0xFF00000000000000) | \
|
|
|
|
|
((((UInt64)value)<<40) & 0x00FF000000000000) | \
|
|
|
|
|
((((UInt64)value)<<24) & 0x0000FF0000000000) | \
|
|
|
|
|
((((UInt64)value)<< 8) & 0x000000FF00000000) | \
|
|
|
|
|
((((UInt64)value)>> 8) & 0x00000000FF000000) | \
|
|
|
|
|
((((UInt64)value)>>24) & 0x0000000000FF0000) | \
|
|
|
|
|
((((UInt64)value)>>40) & 0x000000000000FF00) | \
|
|
|
|
|
((((UInt64)value)>>56) & 0x00000000000000FF))
|
|
|
|
|
#else
|
|
|
|
|
#define Endian64_Swap(value) \
|
|
|
|
|
(((((UInt64)value)<<56) & 0xFF00000000000000ULL) | \
|
|
|
|
|
((((UInt64)value)<<40) & 0x00FF000000000000ULL) | \
|
|
|
|
|
((((UInt64)value)<<24) & 0x0000FF0000000000ULL) | \
|
|
|
|
|
((((UInt64)value)<< 8) & 0x000000FF00000000ULL) | \
|
|
|
|
|
((((UInt64)value)>> 8) & 0x00000000FF000000ULL) | \
|
|
|
|
|
((((UInt64)value)>>24) & 0x0000000000FF0000ULL) | \
|
|
|
|
|
((((UInt64)value)>>40) & 0x000000000000FF00ULL) | \
|
|
|
|
|
((((UInt64)value)>>56) & 0x00000000000000FFULL))
|
|
|
|
|
#endif
|
|
|
|
|
#else
|
|
|
|
|
/*
|
|
|
|
|
Note: When using compilers that don't support "long long",
|
|
|
|
|
Endian64_Swap must be implemented as glue.
|
|
|
|
|
*/
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
inline static UInt64 Endian64_Swap(UInt64 value)
|
|
|
|
|
{
|
|
|
|
|
UInt64 temp;
|
|
|
|
|
((UnsignedWide*)&temp)->lo = Endian32_Swap(((UnsignedWide*)&value)->hi);
|
|
|
|
|
((UnsignedWide*)&temp)->hi = Endian32_Swap(((UnsignedWide*)&value)->lo);
|
|
|
|
|
return temp;
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
#if CALL_NOT_IN_CARBON
|
|
|
|
|
/*
|
|
|
|
|
* Endian64_Swap()
|
|
|
|
|
*
|
|
|
|
|
* Availability:
|
|
|
|
|
* Non-Carbon CFM: not available
|
|
|
|
|
* CarbonLib: not available
|
|
|
|
|
* Mac OS X: not available
|
|
|
|
|
*/
|
|
|
|
|
EXTERN_API_C( UInt64 )
|
|
|
|
|
Endian64_Swap(UInt64 value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif /* CALL_NOT_IN_CARBON */
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
#endif /* TYPE_LONGLONG */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if PRAGMA_STRUCT_ALIGN
|
|
|
|
|
#pragma options align=reset
|
|
|
|
|
#elif PRAGMA_STRUCT_PACKPUSH
|
|
|
|
|
#pragma pack(pop)
|
|
|
|
|
#elif PRAGMA_STRUCT_PACK
|
|
|
|
|
#pragma pack()
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef PRAGMA_IMPORT_OFF
|
|
|
|
|
#pragma import off
|
|
|
|
|
#elif PRAGMA_IMPORT
|
|
|
|
|
#pragma import reset
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#endif /* __ENDIAN__ */
|
|
|
|
|
|