minor fixes to comply with C99's new pointer aliasing rules
authorJosh Coalson <jcoalson@users.sourceforce.net>
Thu, 7 Oct 2004 00:22:03 +0000 (00:22 +0000)
committerJosh Coalson <jcoalson@users.sourceforce.net>
Thu, 7 Oct 2004 00:22:03 +0000 (00:22 +0000)
src/libFLAC/memory.c
src/share/replaygain_synthesis/replaygain_synthesis.c

index 9b3dc6a..294dd1e 100644 (file)
@@ -55,14 +55,18 @@ void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address)
 
 FLAC__bool FLAC__memory_alloc_aligned_int32_array(unsigned elements, FLAC__int32 **unaligned_pointer, FLAC__int32 **aligned_pointer)
 {
-       FLAC__int32 *pa, *pu; /* aligned pointer, unaligned pointer */
+       FLAC__int32 *pu; /* unaligned pointer */
+       union { /* union needed to comply with C99 pointer aliasing rules */
+               FLAC__int32 *pa; /* aligned pointer */
+               void        *pv; /* aligned pointer alias */
+       } u;
 
        FLAC__ASSERT(elements > 0);
        FLAC__ASSERT(0 != unaligned_pointer);
        FLAC__ASSERT(0 != aligned_pointer);
        FLAC__ASSERT(unaligned_pointer != aligned_pointer);
 
-       pu = (FLAC__int32*)FLAC__memory_alloc_aligned(sizeof(FLAC__int32) * elements, (void**)&pa);
+       pu = (FLAC__int32*)FLAC__memory_alloc_aligned(sizeof(FLAC__int32) * elements, &u.pv);
        if(0 == pu) {
                return false;
        }
@@ -70,21 +74,25 @@ FLAC__bool FLAC__memory_alloc_aligned_int32_array(unsigned elements, FLAC__int32
                if(*unaligned_pointer != 0)
                        free(*unaligned_pointer);
                *unaligned_pointer = pu;
-               *aligned_pointer = pa;
+               *aligned_pointer = u.pa;
                return true;
        }
 }
 
 FLAC__bool FLAC__memory_alloc_aligned_uint32_array(unsigned elements, FLAC__uint32 **unaligned_pointer, FLAC__uint32 **aligned_pointer)
 {
-       FLAC__uint32 *pa, *pu; /* aligned pointer, unaligned pointer */
+       FLAC__uint32 *pu; /* unaligned pointer */
+       union { /* union needed to comply with C99 pointer aliasing rules */
+               FLAC__uint32 *pa; /* aligned pointer */
+               void         *pv; /* aligned pointer alias */
+       } u;
 
        FLAC__ASSERT(elements > 0);
        FLAC__ASSERT(0 != unaligned_pointer);
        FLAC__ASSERT(0 != aligned_pointer);
        FLAC__ASSERT(unaligned_pointer != aligned_pointer);
 
-       pu = (FLAC__uint32*)FLAC__memory_alloc_aligned(sizeof(FLAC__uint32) * elements, (void**)&pa);
+       pu = (FLAC__uint32*)FLAC__memory_alloc_aligned(sizeof(FLAC__uint32) * elements, &u.pv);
        if(0 == pu) {
                return false;
        }
@@ -92,21 +100,25 @@ FLAC__bool FLAC__memory_alloc_aligned_uint32_array(unsigned elements, FLAC__uint
                if(*unaligned_pointer != 0)
                        free(*unaligned_pointer);
                *unaligned_pointer = pu;
-               *aligned_pointer = pa;
+               *aligned_pointer = u.pa;
                return true;
        }
 }
 
 FLAC__bool FLAC__memory_alloc_aligned_uint64_array(unsigned elements, FLAC__uint64 **unaligned_pointer, FLAC__uint64 **aligned_pointer)
 {
-       FLAC__uint64 *pa, *pu; /* aligned pointer, unaligned pointer */
+       FLAC__uint64 *pu; /* unaligned pointer */
+       union { /* union needed to comply with C99 pointer aliasing rules */
+               FLAC__uint64 *pa; /* aligned pointer */
+               void         *pv; /* aligned pointer alias */
+       } u;
 
        FLAC__ASSERT(elements > 0);
        FLAC__ASSERT(0 != unaligned_pointer);
        FLAC__ASSERT(0 != aligned_pointer);
        FLAC__ASSERT(unaligned_pointer != aligned_pointer);
 
-       pu = (FLAC__uint64*)FLAC__memory_alloc_aligned(sizeof(FLAC__uint64) * elements, (void**)&pa);
+       pu = (FLAC__uint64*)FLAC__memory_alloc_aligned(sizeof(FLAC__uint64) * elements, &u.pv);
        if(0 == pu) {
                return false;
        }
@@ -114,21 +126,25 @@ FLAC__bool FLAC__memory_alloc_aligned_uint64_array(unsigned elements, FLAC__uint
                if(*unaligned_pointer != 0)
                        free(*unaligned_pointer);
                *unaligned_pointer = pu;
-               *aligned_pointer = pa;
+               *aligned_pointer = u.pa;
                return true;
        }
 }
 
 FLAC__bool FLAC__memory_alloc_aligned_unsigned_array(unsigned elements, unsigned **unaligned_pointer, unsigned **aligned_pointer)
 {
-       unsigned *pa, *pu; /* aligned pointer, unaligned pointer */
+       unsigned *pu; /* unaligned pointer */
+       union { /* union needed to comply with C99 pointer aliasing rules */
+               unsigned *pa; /* aligned pointer */
+               void     *pv; /* aligned pointer alias */
+       } u;
 
        FLAC__ASSERT(elements > 0);
        FLAC__ASSERT(0 != unaligned_pointer);
        FLAC__ASSERT(0 != aligned_pointer);
        FLAC__ASSERT(unaligned_pointer != aligned_pointer);
 
-       pu = (unsigned*)FLAC__memory_alloc_aligned(sizeof(unsigned) * elements, (void**)&pa);
+       pu = (unsigned*)FLAC__memory_alloc_aligned(sizeof(unsigned) * elements, &u.pv);
        if(0 == pu) {
                return false;
        }
@@ -136,21 +152,25 @@ FLAC__bool FLAC__memory_alloc_aligned_unsigned_array(unsigned elements, unsigned
                if(*unaligned_pointer != 0)
                        free(*unaligned_pointer);
                *unaligned_pointer = pu;
-               *aligned_pointer = pa;
+               *aligned_pointer = u.pa;
                return true;
        }
 }
 
 FLAC__bool FLAC__memory_alloc_aligned_real_array(unsigned elements, FLAC__real **unaligned_pointer, FLAC__real **aligned_pointer)
 {
-       FLAC__real *pa, *pu; /* aligned pointer, unaligned pointer */
+       FLAC__real *pu; /* unaligned pointer */
+       union { /* union needed to comply with C99 pointer aliasing rules */
+               FLAC__real *pa; /* aligned pointer */
+               void       *pv; /* aligned pointer alias */
+       } u;
 
        FLAC__ASSERT(elements > 0);
        FLAC__ASSERT(0 != unaligned_pointer);
        FLAC__ASSERT(0 != aligned_pointer);
        FLAC__ASSERT(unaligned_pointer != aligned_pointer);
 
-       pu = (FLAC__real*)FLAC__memory_alloc_aligned(sizeof(FLAC__real) * elements, (void**)&pa);
+       pu = (FLAC__real*)FLAC__memory_alloc_aligned(sizeof(FLAC__real) * elements, &u.pv);
        if(0 == pu) {
                return false;
        }
@@ -158,7 +178,7 @@ FLAC__bool FLAC__memory_alloc_aligned_real_array(unsigned elements, FLAC__real *
                if(*unaligned_pointer != 0)
                        free(*unaligned_pointer);
                *unaligned_pointer = pu;
-               *aligned_pointer = pa;
+               *aligned_pointer = u.pa;
                return true;
        }
 }
index 30cf11e..c53907b 100644 (file)
@@ -236,10 +236,14 @@ void FLAC__replaygain_synthesis__init_dither_context(DitherContext *d, int bits,
 
 static FLAC__INLINE FLAC__int64 dither_output_(DitherContext *d, FLAC__bool do_dithering, int shapingtype, int i, double Sum, int k)
 {
-       double doubletmp, Sum2;
+       union {
+               double d;
+               FLAC__int64 i;
+       } doubletmp;
+       double Sum2;
        FLAC__int64 val;
 
-#define ROUND64(x)   ( doubletmp = (x) + d->Add + (FLAC__int64)FLAC__I64L(0x001FFFFD80000000), *(FLAC__int64*)(&doubletmp) - (FLAC__int64)FLAC__I64L(0x433FFFFD80000000) )
+#define ROUND64(x)   ( doubletmp.d = (x) + d->Add + (FLAC__int64)FLAC__I64L(0x001FFFFD80000000), doubletmp.i - (FLAC__int64)FLAC__I64L(0x433FFFFD80000000) )
 
        if(do_dithering) {
                if(shapingtype == 0) {