add Brady's better write_sane_extended()
authorJosh Coalson <jcoalson@users.sourceforce.net>
Mon, 19 May 2003 04:23:30 +0000 (04:23 +0000)
committerJosh Coalson <jcoalson@users.sourceforce.net>
Mon, 19 May 2003 04:23:30 +0000 (04:23 +0000)
src/flac/decode.c
src/test_streams/main.c

index e4e4e17..372f7ee 100644 (file)
@@ -632,27 +632,31 @@ FLAC__bool write_big_endian_uint32(FILE *f, FLAC__uint32 val)
 }
 
 FLAC__bool write_sane_extended(FILE *f, unsigned val)
+       /* Write to 'f' a SANE extended representation of 'val'.  Return false if
+       * the write succeeds; return true otherwise.
+       *
+       * SANE extended is an 80-bit IEEE-754 representation with sign bit, 15 bits
+       * of exponent, and 64 bits of significand (mantissa).  Unlike most IEEE-754
+       * representations, it does not imply a 1 above the MSB of the significand.
+       *
+       * Preconditions:
+       *  val!=0U
+       */
 {
-       unsigned i, exponent;
+       unsigned int shift, exponent;
 
-       /* this reasonable limitation make the implementation simpler */
-       FLAC__ASSERT(val < 0x80000000);
+       FLAC__ASSERT(val!=0U); /* handling 0 would require a special case */
 
-       /* we'll use the denormalized form, with no implicit '1' (i bit == 0) */
-
-       for(i = val, exponent = 0; i; i >>= 1, exponent++)
+       for(shift= 0U; (val>>(31-shift))==0U; ++shift)
                ;
-       if(!write_big_endian_uint16(f, (FLAC__uint16)(exponent + 16383)))
-               return false;
+       val<<= shift;
+       exponent= 63U-(shift+32U); /* add 32 for unused second word */
 
-       for(i = 32; i; i--) {
-               if(val & 0x40000000)
-                       break;
-               val <<= 1;
-       }
+       if(!write_big_endian_uint16(f, (FLAC__uint16)(exponent+0x3FFF)))
+               return false;
        if(!write_big_endian_uint32(f, val))
                return false;
-       if(!write_big_endian_uint32(f, 0))
+       if(!write_big_endian_uint32(f, 0)) /* unused second word */
                return false;
 
        return true;
index 82384ad..71c8fee 100644 (file)
@@ -141,33 +141,36 @@ static FLAC__bool write_big_endian_int32(FILE *f, FLAC__int32 x)
 #endif
 
 static FLAC__bool write_sane_extended(FILE *f, unsigned val)
-{
-       unsigned i, exponent;
-
-       /* this reasonable limitation make the implementation simpler */
-       FLAC__ASSERT(val < 0x80000000);
-
-       /* we'll use the denormalized form, with no implicit '1' (i bit == 0) */
-
-       for(i = val, exponent = 0; i; i >>= 1, exponent++)
+       /* Write to 'f' a SANE extended representation of 'val'.  Return false if
+       * the write succeeds; return true otherwise.
+       *
+       * SANE extended is an 80-bit IEEE-754 representation with sign bit, 15 bits
+       * of exponent, and 64 bits of significand (mantissa).  Unlike most IEEE-754
+       * representations, it does not imply a 1 above the MSB of the significand.
+       *
+       * Preconditions:
+       *  val!=0U
+       */
+{
+       unsigned int shift, exponent;
+
+       FLAC__ASSERT(val!=0U); /* handling 0 would require a special case */
+
+       for(shift= 0U; (val>>(31-shift))==0U; ++shift)
                ;
-       if(!write_big_endian_uint16(f, (FLAC__uint16)(exponent + 16383)))
-               return false;
+       val<<= shift;
+       exponent= 63U-(shift+32U); /* add 32 for unused second word */
 
-       for(i = 32; i; i--) {
-               if(val & 0x40000000)
-                       break;
-               val <<= 1;
-       }
+       if(!write_big_endian_uint16(f, (FLAC__uint16)(exponent+0x3FFF)))
+               return false;
        if(!write_big_endian_uint32(f, val))
                return false;
-       if(!write_big_endian_uint32(f, 0))
+       if(!write_big_endian_uint32(f, 0)) /* unused second word */
                return false;
 
        return true;
 }
 
-
 /* a mono one-sample 16bps stream */
 static FLAC__bool generate_01()
 {