From 4bc2b976a0981156967708a35cb6a68edfd2f5fb Mon Sep 17 00:00:00 2001 From: molivier Date: Thu, 11 Mar 2004 08:08:04 +0000 Subject: [PATCH] Changed the way DP detects and handles the CPU endianess. All the tests are done at compile time now. Tested on Win32 (MSVC6 and MinGW32), Linux and NetBSD; should also work on the other BSDs. git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@4007 d7cf8633-e32d-0410-b094-e92efae38249 --- common.c | 54 ------------------------------------------------------ common.h | 40 +++++++++++++++++++++++++--------------- snd_oss.c | 17 +++++------------ 3 files changed, 30 insertions(+), 81 deletions(-) diff --git a/common.c b/common.c index 03f4b450..4ba50c90 100644 --- a/common.c +++ b/common.c @@ -54,15 +54,6 @@ char com_modname[MAX_OSPATH]; ============================================================================ */ -#if !defined(ENDIAN_LITTLE) && !defined(ENDIAN_BIG) -short (*BigShort) (short l); -short (*LittleShort) (short l); -int (*BigLong) (int l); -int (*LittleLong) (int l); -float (*BigFloat) (float l); -float (*LittleFloat) (float l); -#endif - short ShortSwap (short l) { qbyte b1,b2; @@ -73,13 +64,6 @@ short ShortSwap (short l) return (b1<<8) + b2; } -#if !defined(ENDIAN_LITTLE) && !defined(ENDIAN_BIG) -short ShortNoSwap (short l) -{ - return l; -} -#endif - int LongSwap (int l) { qbyte b1,b2,b3,b4; @@ -92,13 +76,6 @@ int LongSwap (int l) return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4; } -#if !defined(ENDIAN_LITTLE) && !defined(ENDIAN_BIG) -int LongNoSwap (int l) -{ - return l; -} -#endif - float FloatSwap (float f) { union @@ -116,13 +93,6 @@ float FloatSwap (float f) return dat2.f; } -#if !defined(ENDIAN_LITTLE) && !defined(ENDIAN_BIG) -float FloatNoSwap (float f) -{ - return f; -} -#endif - // Extract integers from buffers @@ -868,30 +838,6 @@ COM_Init */ void COM_Init (void) { -#if !defined(ENDIAN_LITTLE) && !defined(ENDIAN_BIG) - qbyte swaptest[2] = {1,0}; - -// set the byte swapping variables in a portable manner - if ( *(short *)swaptest == 1) - { - BigShort = ShortSwap; - LittleShort = ShortNoSwap; - BigLong = LongSwap; - LittleLong = LongNoSwap; - BigFloat = FloatSwap; - LittleFloat = FloatNoSwap; - } - else - { - BigShort = ShortNoSwap; - LittleShort = ShortSwap; - BigLong = LongNoSwap; - LittleLong = LongSwap; - BigFloat = FloatNoSwap; - LittleFloat = FloatSwap; - } -#endif - Cvar_RegisterVariable (®istered); Cvar_RegisterVariable (&cmdline); diff --git a/common.h b/common.h index 5c030caf..d9e93145 100644 --- a/common.h +++ b/common.h @@ -52,20 +52,38 @@ void SZ_HexDumpToConsole(const sizebuf_t *buf); void Com_HexDumpToConsole(const qbyte *data, int size); + //============================================================================ -#if !defined(ENDIAN_LITTLE) && !defined(ENDIAN_BIG) -#if defined(__i386__) || defined(__ia64__) || defined(WIN32) || (defined(__alpha__) || defined(__alpha)) || defined(__arm__) || (defined(__mips__) && defined(__MIPSEL__)) || defined(__LITTLE_ENDIAN__) -#define ENDIAN_LITTLE -#else -#define ENDIAN_BIG +// Endianess handling +//============================================================================ + +// We use BSD-style defines: BYTE_ORDER is defined to either BIG_ENDIAN or LITTLE_ENDIAN + +// Initializations +#if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) || !defined(BIG_ENDIAN) || (BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN) +# undef BYTE_ORDER +# undef LITTLE_ENDIAN +# undef BIG_ENDIAN +# define LITTLE_ENDIAN 1234 +# define BIG_ENDIAN 4321 #endif + +// If we still don't know the CPU endianess at this point, we try to guess +#ifndef BYTE_ORDER +# if defined(WIN32) +# define BYTE_ORDER LITTLE_ENDIAN +# else +# warning "Unable to determine the CPU endianess. Defaulting to little endian" +# define BYTE_ORDER LITTLE_ENDIAN +# endif #endif + short ShortSwap (short l); int LongSwap (int l); float FloatSwap (float f); -#ifdef ENDIAN_LITTLE +#if BYTE_ORDER == LITTLE_ENDIAN // little endian #define BigShort(l) ShortSwap(l) #define LittleShort(l) (l) @@ -73,7 +91,7 @@ float FloatSwap (float f); #define LittleLong(l) (l) #define BigFloat(l) FloatSwap(l) #define LittleFloat(l) (l) -#elif defined(ENDIAN_BIG) +#else // big endian #define BigShort(l) (l) #define LittleShort(l) ShortSwap(l) @@ -81,14 +99,6 @@ float FloatSwap (float f); #define LittleLong(l) LongSwap(l) #define BigFloat(l) (l) #define LittleFloat(l) FloatSwap(l) -#else -// figure it out at runtime -extern short (*BigShort) (short l); -extern short (*LittleShort) (short l); -extern int (*BigLong) (int l); -extern int (*LittleLong) (int l); -extern float (*BigFloat) (float l); -extern float (*LittleFloat) (float l); #endif unsigned int BuffBigLong (const qbyte *buffer); diff --git a/snd_oss.c b/snd_oss.c index 4aa51039..e5fddc2f 100644 --- a/snd_oss.c +++ b/snd_oss.c @@ -44,19 +44,12 @@ qboolean SNDDMA_Init(void) struct audio_buf_info info; int caps; int format16bit; - // LordHavoc: a quick patch to support big endian cpu, I hope - union - { - unsigned char c[2]; - unsigned short s; - } - endiantest; - endiantest.s = 1; - if (endiantest.c[1]) - format16bit = AFMT_S16_BE; - else - format16bit = AFMT_S16_LE; +#if BYTE_ORDER == BIG_ENDIAN + format16bit = AFMT_S16_BE; +#else + format16bit = AFMT_S16_LE; +#endif snd_inited = 0; // open /dev/dsp, confirm capability to mmap, and get size of dma buffer -- 2.39.2