Changed the way DP detects and handles the CPU endianess. All the tests are done...
authormolivier <molivier@d7cf8633-e32d-0410-b094-e92efae38249>
Thu, 11 Mar 2004 08:08:04 +0000 (08:08 +0000)
committermolivier <molivier@d7cf8633-e32d-0410-b094-e92efae38249>
Thu, 11 Mar 2004 08:08:04 +0000 (08:08 +0000)
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@4007 d7cf8633-e32d-0410-b094-e92efae38249

common.c
common.h
snd_oss.c

index 03f4b45..4ba50c9 100644 (file)
--- 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 (&registered);
        Cvar_RegisterVariable (&cmdline);
 
index 5c030ca..d9e9314 100644 (file)
--- 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);
index 4aa5103..e5fddc2 100644 (file)
--- 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