--- psiconv/trunk/lib/psiconv/parse_simple.c 2001/03/04 22:10:45 110 +++ psiconv/trunk/lib/psiconv/parse_simple.c 2002/01/29 18:38:38 142 @@ -26,6 +26,22 @@ #include "parse_routines.h" #include "error.h" +#ifdef DMALLOC +#include +#endif + +/* Very inefficient, but good enough for now. By implementing it ourselves, + we do not have to link with -lm */ +psiconv_float_t pow2(int n) +{ + psiconv_float_t res=1.0; + int i; + + for (i = 0; i < (n<0?-n:n); i++) + res *= 2.0; + + return n<0?1/res:res; +} psiconv_u8 psiconv_read_u8(const psiconv_buffer buf,int lev,psiconv_u32 off, int *status) { @@ -78,6 +94,21 @@ return *ptr0 + (*ptr1 << 8) + (*ptr2 << 16) + (*ptr3 << 24); } +psiconv_s32 psiconv_read_sint(const psiconv_buffer buf,int lev,psiconv_u32 off, + int *length,int *status) +{ + int localstatus; + psiconv_u32 temp; + + temp=psiconv_read_u32(buf,lev,off,&localstatus); + if (status) + *status = localstatus; + if (length) + *length = localstatus?0:4; + + return localstatus?0:(temp & 0x7fffffff)*(temp&0x80000000?-1:1); +} + psiconv_S_t psiconv_read_S(const psiconv_buffer buf, int lev, psiconv_u32 off, int *length,int *status) { @@ -95,7 +126,7 @@ goto ERROR; len = 1; psiconv_debug(lev+2,off,"Indicator (1 byte): %02x",res); - } else if ((temp & 0x07) == 0x03) { + } else if ((temp & 0x07) == 0x05) { res = psiconv_read_u16(buf,lev+2,off,&localstatus) >> 3; if (localstatus) goto ERROR; @@ -386,7 +417,7 @@ if (temp & 0x8000) result = -result; temp = (temp & 0x7ff0) >> 4; - result *= pow(2.0,((int) temp)-0x3ff); + result *= pow2(((int) temp)-0x3ff); psiconv_debug(lev+1,off,"Float value: %f",result); if (length) *length = 8; @@ -401,3 +432,4 @@ *status = res; return 0.0; } +