From af9c773da3dab0d6574ff4a57902d3ef94f7c3a4 Mon Sep 17 00:00:00 2001 From: Josh Coalson Date: Mon, 19 May 2003 04:23:30 +0000 Subject: [PATCH] add Brady's better write_sane_extended() --- src/flac/decode.c | 32 ++++++++++++++++++-------------- src/test_streams/main.c | 39 +++++++++++++++++++++------------------ 2 files changed, 39 insertions(+), 32 deletions(-) diff --git a/src/flac/decode.c b/src/flac/decode.c index e4e4e17..372f7ee 100644 --- a/src/flac/decode.c +++ b/src/flac/decode.c @@ -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; diff --git a/src/test_streams/main.c b/src/test_streams/main.c index 82384ad..71c8fee 100644 --- a/src/test_streams/main.c +++ b/src/test_streams/main.c @@ -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() { -- 2.7.4