--- psiconv/trunk/lib/psiconv/parse_simple.c 2003/11/26 20:56:17 171 +++ psiconv/trunk/lib/psiconv/parse_simple.c 2004/01/04 22:07:02 182 @@ -31,6 +31,10 @@ #endif static psiconv_float_t pow2(int n); +static psiconv_string_t psiconv_read_string_aux(const psiconv_config config, + const psiconv_buffer buf,int lev, + psiconv_u32 off,int *length, int *status, + int kind); /* Very inefficient, but good enough for now. By implementing it ourselves, we do not have to link with -lm */ @@ -286,16 +290,38 @@ return 0; } -psiconv_string_t psiconv_read_string(const psiconv_config config,const psiconv_buffer buf,int lev, +psiconv_string_t psiconv_read_string(const psiconv_config config, + const psiconv_buffer buf,int lev, psiconv_u32 off,int *length, int *status) { + return psiconv_read_string_aux(config,buf,lev,off,length,status,0); +} + +psiconv_string_t psiconv_read_short_string(const psiconv_config config, + const psiconv_buffer buf,int lev, + psiconv_u32 off,int *length, int *status) +{ + return psiconv_read_string_aux(config,buf,lev,off,length,status,1); +} + +psiconv_string_t psiconv_read_string_aux(const psiconv_config config, + const psiconv_buffer buf,int lev, + psiconv_u32 off,int *length, int *status, + int kind) +{ int stringlen,i,leng,len,localstatus; psiconv_string_t result; char *res_copy; psiconv_progress(config,lev+1,off,"Going to read a string"); - stringlen = psiconv_read_S(config,buf,lev+2,off,&leng,&localstatus); + if (kind == 0) + stringlen = psiconv_read_S(config,buf,lev+2,off,&leng,&localstatus); + else { + stringlen = psiconv_read_u8(config,buf,lev+2,off,&localstatus); + leng = 1; + } + if (localstatus) goto ERROR1; psiconv_debug(config,lev+2,off,"Length: %i",stringlen); @@ -334,61 +360,6 @@ if (status) *status = localstatus; if (length) - *length = 0; - return NULL; -} - -psiconv_string_t psiconv_read_short_string(const psiconv_config config, const psiconv_buffer buf, - int lev, - psiconv_u32 off,int *length, int *status) -{ - int stringlen,i,len,localstatus; - psiconv_string_t result; - char *res_copy; - - psiconv_progress(config,lev+1,off,"Going to read a short string"); - - stringlen = psiconv_read_u8(config,buf,lev+2,off,&localstatus); - if (localstatus) - goto ERROR1; - psiconv_debug(config,lev+2,off,"Length: %i",stringlen); - len = 1; - - result = malloc(stringlen + 1); - if (!result) - goto ERROR1; - for (i = 0; (i < stringlen) && !localstatus; i++) - result[i] = psiconv_read_u8(config,buf,lev,off+i+len,&localstatus); - if (localstatus) - goto ERROR2; - result[stringlen] = 0; - len += stringlen; - - res_copy = psiconv_make_printable(result); - if (!res_copy) - goto ERROR2; - psiconv_debug(config,lev+2,off,"Contents: `%s'",res_copy); - free(res_copy); - - if (length) - *length = len; - - if (status) - *status = 0; - - psiconv_progress(config,lev+1,off+len-1,"End of short string (total length: %08x)", - len); - - return result; - - -ERROR2: - free(result); -ERROR1: - psiconv_warn(config,lev+1,off,"Reading of short string failed"); - if (status) - *status = localstatus; - if (length) *length = 0; return NULL; }