|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1993.
//
// File: Align.hxx
//
// Contents: Alignment routines (for MIPS)
//
// History: 14-Jun-93 KyleP Created
//
//--------------------------------------------------------------------------
#if !defined( __ALIGN_HXX__ )
#define __ALIGN_HXX__
//+-------------------------------------------------------------------------
//
// Function: AlignWCHAR, public
//
// Synopsis: Half-word aligns argument
//
// Arguments: [pb] -- Pointer to half-word align
// [cbAlign] -- # Bytes moved to satisfy alignment
//
// Returns: [pb] incremented forward as necessary for half-word alignment
//
// History: 14-Jun-93 KyleP Created
//
//--------------------------------------------------------------------------
inline unsigned short * AlignWCHAR( unsigned char * pb, unsigned * pcbAlign = 0 );
inline unsigned short * AlignUSHORT( unsigned char * pb, unsigned * pcbAlign = 0 );
inline unsigned short * AlignWCHAR( unsigned char * pb, unsigned * pcbAlign ) { return( AlignUSHORT( pb, pcbAlign ) ); }
inline unsigned short * AlignUSHORT( unsigned char * pb, unsigned * pcbAlign ) { if ( pcbAlign ) *pcbAlign = (unsigned)((sizeof(unsigned short) - ((LONG_PTR)pb & (sizeof(unsigned short) - 1))) % sizeof(unsigned short));
return( (unsigned short *)( ((LONG_PTR)pb + sizeof(unsigned short) - 1) & ~((LONG_PTR)sizeof(unsigned short) - 1 ) ) ); }
//+-------------------------------------------------------------------------
//
// Function: AlignULONG, public
//
// Synopsis: Word aligns argument
//
// Arguments: [pb] -- Pointer to word align
// [cbAlign] -- # Bytes moved to satisfy alignment
//
// Returns: [pb] incremented forward as necessary for word alignment
//
// History: 14-Jun-93 KyleP Created
//
//--------------------------------------------------------------------------
inline unsigned long * AlignULONG( unsigned char * pb, unsigned * pcbAlign = 0 );
inline unsigned long * AlignULONG( unsigned char * pb, unsigned * pcbAlign ) { if ( pcbAlign ) *pcbAlign = (unsigned)((sizeof(unsigned long) - ((LONG_PTR)pb & (sizeof(unsigned long) - 1))) % sizeof(unsigned long));
return( (unsigned long *)( ((LONG_PTR)pb + sizeof(unsigned long) - 1) & ~((LONG_PTR)sizeof(unsigned long) - 1 ) ) ); }
inline long * AlignLong( unsigned char * pb, unsigned * pcbAlign = 0 );
inline long * AlignLong( unsigned char * pb, unsigned * pcbAlign ) { if ( pcbAlign ) *pcbAlign = (unsigned)((sizeof(long) - ((LONG_PTR)pb & (sizeof(long) - 1))) % sizeof(long));
return( (long *)( ((LONG_PTR)pb + sizeof(long) - 1) & ~((LONG_PTR)sizeof(long) - 1 ) ) ); }
inline LONGLONG * AlignLONGLONG( unsigned char * pb, unsigned * pcbAlign = 0 );
inline LONGLONG * AlignLONGLONG( unsigned char * pb, unsigned * pcbAlign ) { if ( pcbAlign ) *pcbAlign = (unsigned)((sizeof(LONGLONG) - ((LONG_PTR)pb & (sizeof(LONGLONG) - 1))) % sizeof(LONGLONG));
return( (LONGLONG *)( ((LONG_PTR)pb + sizeof(LONGLONG) - 1) & ~((LONG_PTR)sizeof(LONGLONG) - 1 ) ) ); }
inline float * AlignFloat( unsigned char * pb, unsigned * pcbAlign = 0 );
inline float * AlignFloat( unsigned char * pb, unsigned * pcbAlign ) { if ( pcbAlign ) *pcbAlign = (unsigned)((sizeof(float) - ((LONG_PTR)pb & (sizeof(float) - 1))) % sizeof(float));
return( (float *)( ((LONG_PTR)pb + sizeof(float) - 1) & ~((LONG_PTR)sizeof(float) - 1 ) ) ); }
inline double * AlignDouble( unsigned char * pb, unsigned * pcbAlign = 0 );
inline double * AlignDouble( unsigned char * pb, unsigned * pcbAlign ) { if ( pcbAlign ) *pcbAlign = (unsigned)((sizeof(double) - ((LONG_PTR)pb & (sizeof(double) - 1))) % sizeof(double));
return( (double *)( ((LONG_PTR)pb + sizeof(double) - 1) & ~((LONG_PTR)sizeof(double) - 1 ) ) ); }
//+-------------------------------------------------------------------------
//
// Function: AlignGUID, public
//
// Synopsis: 8-byte aligns argument
//
// Arguments: [pb] -- Pointer to word align
// [cbAlign] -- # Bytes moved to satisfy alignment
//
// Returns: [pb] incremented forward as necessary for word alignment
//
// History: 29-Sep-93 KyleP Created
//
// Notes: This is somewhat error-prone code. 16-byte GUIDs are
// only 8-byte aligned, so we use sizeof(double) and not
// sizeof(GUID).
//
//--------------------------------------------------------------------------
inline unsigned char * AlignGUID( unsigned char * pb, unsigned * pcbAlign = 0 );
inline unsigned char * AlignGUID( unsigned char * pb, unsigned * pcbAlign ) { if ( pcbAlign ) *pcbAlign = (unsigned)((sizeof(double) - ((LONG_PTR)pb & (sizeof(double) - 1))) % sizeof(double));
return( (unsigned char *)( ((LONG_PTR)pb + sizeof(double) - 1) & ~((LONG_PTR)sizeof(double) - 1 ) ) ); }
//+-------------------------------------------------------------------------
//
// Function: StoreWCHAR, public
//
// Synopsis: Stores half word in byte-aligned memory
//
// Arguments: [pb] -- Buffer
// [hw] -- Half-word
//
// Returns: Number of bytes to increment [pb].
//
// History: 14-Jun-93 KyleP Created
//
//--------------------------------------------------------------------------
inline int StoreUSHORT( unsigned char * pb, unsigned short hw ) { *((UNALIGNED unsigned short *)pb) = hw;
return( sizeof( unsigned short ) ); }
inline int StoreWCHAR( unsigned char * pb, unsigned short hw ) { return( StoreUSHORT( pb, hw ) ); }
//+-------------------------------------------------------------------------
//
// Function: StoreULONG, public
//
// Synopsis: Stores word in byte-aligned memory
//
// Arguments: [pb] -- Buffer
// [w] -- Word
//
// Returns: Number of bytes to increment [pb].
//
// History: 14-Jun-93 KyleP Created
//
//--------------------------------------------------------------------------
inline int StoreULONG( unsigned char * pb, unsigned long w ) { *((UNALIGNED unsigned long *)pb) = w;
return( sizeof( unsigned long ) ); }
inline int StoreUINT( unsigned char * pb, unsigned int w ) { *((UNALIGNED unsigned int *)pb) = w;
return( sizeof( int ) ); }
//+-------------------------------------------------------------------------
//
// Function: LoadWCHAR, public
//
// Synopsis: Loads half word from byte-aligned memory
//
// Arguments: [pb] -- Buffer
// [hw] -- Half-word
//
// Returns: Number of bytes to increment [pb].
//
// History: 14-Jun-93 KyleP Created
//
//--------------------------------------------------------------------------
inline int LoadUSHORT( unsigned char const * const pb, unsigned short & hw ) { hw = *((UNALIGNED unsigned short const *)pb);
return( sizeof( unsigned short ) ); }
inline int LoadWCHAR( unsigned char const * const pb, unsigned short & hw ) { return( LoadUSHORT( pb, hw ) ); }
//+-------------------------------------------------------------------------
//
// Function: LoadULONG, public
//
// Synopsis: Loads word from byte-aligned memory
//
// Arguments: [pb] -- Buffer
// [w] -- Word
//
// Returns: Number of bytes to increment [pb].
//
// History: 14-Jun-93 KyleP Created
//
//--------------------------------------------------------------------------
inline int LoadULONG( unsigned char const * const pb, unsigned long & w ) { w = *((UNALIGNED unsigned long const *)pb);
return( sizeof( unsigned long ) ); }
inline int LoadUINT( unsigned char const * const pb, unsigned int & w ) { w = *((UNALIGNED unsigned int const *)pb);
return( sizeof( int ) ); }
#endif // __ALIGN_HXX__
|