… | |
… | |
29 | #ifdef DMALLOC |
29 | #ifdef DMALLOC |
30 | #include <dmalloc.h> |
30 | #include <dmalloc.h> |
31 | #endif |
31 | #endif |
32 | |
32 | |
33 | static psiconv_float_t pow2(int n); |
33 | static psiconv_float_t pow2(int n); |
|
|
34 | static psiconv_string_t psiconv_read_string_aux(const psiconv_config config, |
|
|
35 | const psiconv_buffer buf,int lev, |
|
|
36 | psiconv_u32 off,int *length, int *status, |
|
|
37 | int kind); |
34 | |
38 | |
35 | /* Very inefficient, but good enough for now. By implementing it ourselves, |
39 | /* Very inefficient, but good enough for now. By implementing it ourselves, |
36 | we do not have to link with -lm */ |
40 | we do not have to link with -lm */ |
37 | psiconv_float_t pow2(int n) |
41 | psiconv_float_t pow2(int n) |
38 | { |
42 | { |
… | |
… | |
284 | psiconv_debug(config,lev+1,off,"Boolean value: %02x",temp); |
288 | psiconv_debug(config,lev+1,off,"Boolean value: %02x",temp); |
285 | *result = psiconv_bool_true; |
289 | *result = psiconv_bool_true; |
286 | return 0; |
290 | return 0; |
287 | } |
291 | } |
288 | |
292 | |
289 | psiconv_string_t psiconv_read_string(const psiconv_config config,const psiconv_buffer buf,int lev, |
293 | psiconv_string_t psiconv_read_string(const psiconv_config config, |
|
|
294 | const psiconv_buffer buf,int lev, |
290 | psiconv_u32 off,int *length, int *status) |
295 | psiconv_u32 off,int *length, int *status) |
|
|
296 | { |
|
|
297 | return psiconv_read_string_aux(config,buf,lev,off,length,status,0); |
|
|
298 | } |
|
|
299 | |
|
|
300 | psiconv_string_t psiconv_read_short_string(const psiconv_config config, |
|
|
301 | const psiconv_buffer buf,int lev, |
|
|
302 | psiconv_u32 off,int *length, int *status) |
|
|
303 | { |
|
|
304 | return psiconv_read_string_aux(config,buf,lev,off,length,status,1); |
|
|
305 | } |
|
|
306 | |
|
|
307 | psiconv_string_t psiconv_read_string_aux(const psiconv_config config, |
|
|
308 | const psiconv_buffer buf,int lev, |
|
|
309 | psiconv_u32 off,int *length, int *status, |
|
|
310 | int kind) |
291 | { |
311 | { |
292 | int stringlen,i,leng,len,localstatus; |
312 | int stringlen,i,leng,len,localstatus; |
293 | psiconv_string_t result; |
313 | psiconv_string_t result; |
294 | char *res_copy; |
314 | char *res_copy; |
295 | |
315 | |
296 | psiconv_progress(config,lev+1,off,"Going to read a string"); |
316 | psiconv_progress(config,lev+1,off,"Going to read a string"); |
297 | |
317 | |
|
|
318 | if (kind == 0) |
298 | stringlen = psiconv_read_S(config,buf,lev+2,off,&leng,&localstatus); |
319 | stringlen = psiconv_read_S(config,buf,lev+2,off,&leng,&localstatus); |
|
|
320 | else { |
|
|
321 | stringlen = psiconv_read_u8(config,buf,lev+2,off,&localstatus); |
|
|
322 | leng = 1; |
|
|
323 | } |
|
|
324 | |
299 | if (localstatus) |
325 | if (localstatus) |
300 | goto ERROR1; |
326 | goto ERROR1; |
301 | psiconv_debug(config,lev+2,off,"Length: %i",stringlen); |
327 | psiconv_debug(config,lev+2,off,"Length: %i",stringlen); |
302 | len = leng; |
328 | len = leng; |
303 | |
329 | |
… | |
… | |
336 | if (length) |
362 | if (length) |
337 | *length = 0; |
363 | *length = 0; |
338 | return NULL; |
364 | return NULL; |
339 | } |
365 | } |
340 | |
366 | |
341 | psiconv_string_t psiconv_read_short_string(const psiconv_config config, const psiconv_buffer buf, |
|
|
342 | int lev, |
|
|
343 | psiconv_u32 off,int *length, int *status) |
|
|
344 | { |
|
|
345 | int stringlen,i,len,localstatus; |
|
|
346 | psiconv_string_t result; |
|
|
347 | char *res_copy; |
|
|
348 | |
|
|
349 | psiconv_progress(config,lev+1,off,"Going to read a short string"); |
|
|
350 | |
|
|
351 | stringlen = psiconv_read_u8(config,buf,lev+2,off,&localstatus); |
|
|
352 | if (localstatus) |
|
|
353 | goto ERROR1; |
|
|
354 | psiconv_debug(config,lev+2,off,"Length: %i",stringlen); |
|
|
355 | len = 1; |
|
|
356 | |
|
|
357 | result = malloc(stringlen + 1); |
|
|
358 | if (!result) |
|
|
359 | goto ERROR1; |
|
|
360 | for (i = 0; (i < stringlen) && !localstatus; i++) |
|
|
361 | result[i] = psiconv_read_u8(config,buf,lev,off+i+len,&localstatus); |
|
|
362 | if (localstatus) |
|
|
363 | goto ERROR2; |
|
|
364 | result[stringlen] = 0; |
|
|
365 | len += stringlen; |
|
|
366 | |
|
|
367 | res_copy = psiconv_make_printable(result); |
|
|
368 | if (!res_copy) |
|
|
369 | goto ERROR2; |
|
|
370 | psiconv_debug(config,lev+2,off,"Contents: `%s'",res_copy); |
|
|
371 | free(res_copy); |
|
|
372 | |
|
|
373 | if (length) |
|
|
374 | *length = len; |
|
|
375 | |
|
|
376 | if (status) |
|
|
377 | *status = 0; |
|
|
378 | |
|
|
379 | psiconv_progress(config,lev+1,off+len-1,"End of short string (total length: %08x)", |
|
|
380 | len); |
|
|
381 | |
|
|
382 | return result; |
|
|
383 | |
|
|
384 | |
|
|
385 | ERROR2: |
|
|
386 | free(result); |
|
|
387 | ERROR1: |
|
|
388 | psiconv_warn(config,lev+1,off,"Reading of short string failed"); |
|
|
389 | if (status) |
|
|
390 | *status = localstatus; |
|
|
391 | if (length) |
|
|
392 | *length = 0; |
|
|
393 | return NULL; |
|
|
394 | } |
|
|
395 | |
|
|
396 | psiconv_float_t psiconv_read_float(const psiconv_config config,const psiconv_buffer buf, int lev, |
367 | psiconv_float_t psiconv_read_float(const psiconv_config config,const psiconv_buffer buf, int lev, |
397 | psiconv_u32 off, int *length, int *status) |
368 | psiconv_u32 off, int *length, int *status) |
398 | { |
369 | { |
399 | psiconv_float_t result,bitvalue; |
370 | psiconv_float_t result,bitvalue; |
400 | int res,bit; |
371 | int res,bit; |