/[public]/psiconv/trunk/lib/psiconv/parse_sheet.c
ViewVC logotype

Annotation of /psiconv/trunk/lib/psiconv/parse_sheet.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 120 - (hide annotations)
Sun Jul 1 12:01:59 2001 UTC (22 years, 9 months ago) by frodo
File MIME type: text/plain
File size: 32133 byte(s)
(Frodo) Fixed segfault

1 frodo 94 /*
2     parse_sheet.c - Part of psiconv, a PSION 5 file formats converter
3     Copyright (c) 2001 Frodo Looijaard <frodol@dds.nl>
4    
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9    
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13     GNU General Public License for more details.
14    
15     You should have received a copy of the GNU General Public License
16     along with this program; if not, write to the Free Software
17     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18     */
19    
20     #include "config.h"
21     #include "compat.h"
22    
23     #include <stdlib.h>
24    
25     #include "parse_routines.h"
26     #include "error.h"
27    
28 frodo 111 int psiconv_parse_sheet_numberformat(const psiconv_buffer buf, int lev,
29     psiconv_u32 off, int *length,
30     psiconv_sheet_numberformat *result)
31     {
32     int res=0;
33     int len=0;
34     psiconv_u8 temp;
35    
36     psiconv_progress(lev+1,off,"Going to read a sheet numberformat");
37     if (!(*result = malloc(sizeof(**result))))
38     goto ERROR1;
39    
40     psiconv_progress(lev+2,off+len,
41     "Going to read the initial byte (%02x expected)",0x02);
42     temp = psiconv_read_u8(buf,lev+2,off+len,&res);
43     if (res)
44     goto ERROR2;
45     if (temp != 0x02) {
46     psiconv_warn(lev+2,off+len,
47     "Sheet numberformat initial byte unknown value (ignored)");
48     psiconv_debug(lev+2,off+len,"Initial byte: %02x",temp);
49     }
50     len ++;
51    
52     psiconv_progress(lev+2,off+len, "Going to read the code byte");
53     temp = psiconv_read_u8(buf,lev+2,off+len,&res);
54     if (res)
55     goto ERROR2;
56     psiconv_debug(lev+2,off+len,"Code: %02x",temp);
57     if (temp == 0x00)
58     (*result)->code = psiconv_numberformat_general;
59     else if (temp == 0x02)
60     (*result)->code = psiconv_numberformat_fixeddecimal;
61     else if (temp == 0x04)
62     (*result)->code = psiconv_numberformat_scientific;
63     else if (temp == 0x06)
64     (*result)->code = psiconv_numberformat_currency;
65     else if (temp == 0x08)
66     (*result)->code = psiconv_numberformat_percent;
67     else if (temp == 0x0A)
68     (*result)->code = psiconv_numberformat_triads;
69     else if (temp == 0x0C)
70     (*result)->code = psiconv_numberformat_boolean;
71     else if (temp == 0x0E)
72     (*result)->code = psiconv_numberformat_text;
73     else if (temp == 0x10)
74     (*result)->code = psiconv_numberformat_date_ddmm;
75     else if (temp == 0x12)
76     (*result)->code = psiconv_numberformat_date_mmdd;
77     else if (temp == 0x14)
78     (*result)->code = psiconv_numberformat_date_ddmmyy;
79     else if (temp == 0x16)
80     (*result)->code = psiconv_numberformat_date_mmddyy;
81     else if (temp == 0x18)
82     (*result)->code = psiconv_numberformat_date_yymmdd;
83     else if (temp == 0x1A)
84     (*result)->code = psiconv_numberformat_date_ddmmm;
85     else if (temp == 0x1C)
86     (*result)->code = psiconv_numberformat_date_ddmmmyy;
87     else if (temp == 0x1E)
88     (*result)->code = psiconv_numberformat_date_ddmmmyyyy;
89     else if (temp == 0x20)
90     (*result)->code = psiconv_numberformat_date_mmm;
91     else if (temp == 0x22)
92     (*result)->code = psiconv_numberformat_date_monthname;
93     else if (temp == 0x24)
94     (*result)->code = psiconv_numberformat_date_mmmyy;
95     else if (temp == 0x26)
96     (*result)->code = psiconv_numberformat_date_monthnameyy;
97     else if (temp == 0x28)
98     (*result)->code = psiconv_numberformat_date_monthnameddyyyy;
99     else if (temp == 0x2A)
100     (*result)->code = psiconv_numberformat_datetime_ddmmyyyyhhii;
101     else if (temp == 0x2C)
102     (*result)->code = psiconv_numberformat_datetime_ddmmyyyyHHii;
103     else if (temp == 0x2E)
104     (*result)->code = psiconv_numberformat_datetime_mmddyyyyhhii;
105     else if (temp == 0x30)
106     (*result)->code = psiconv_numberformat_datetime_mmddyyyyHHii;
107     else if (temp == 0x32)
108     (*result)->code = psiconv_numberformat_datetime_yyyymmddhhii;
109     else if (temp == 0x34)
110     (*result)->code = psiconv_numberformat_datetime_yyyymmddHHii;
111     else if (temp == 0x36)
112     (*result)->code = psiconv_numberformat_time_hhii;
113     else if (temp == 0x38)
114     (*result)->code = psiconv_numberformat_time_hhiiss;
115     else if (temp == 0x3A)
116     (*result)->code = psiconv_numberformat_time_HHii;
117     else if (temp == 0x3C)
118     (*result)->code = psiconv_numberformat_time_HHiiss;
119     else {
120     psiconv_warn(lev+2,off+len,"Unknown number format (assumed general)");
121     (*result)->code = psiconv_numberformat_general;
122     }
123     len ++;
124    
125     psiconv_progress(lev+2,off+len, "Going to read the number of decimals");
126     (*result)->decimal = psiconv_read_u8(buf,lev+2,off+len,&res);
127     if (res)
128     goto ERROR2;
129     psiconv_debug(lev+2,off+len,"Decimals: %d",(*result)->decimal);
130     len ++;
131    
132     if (length)
133     *length = len;
134    
135     psiconv_progress(lev,off+len-1,
136     "End of sheet number format (total length: %08x)", len);
137     return 0;
138    
139     ERROR2:
140     free (*result);
141     ERROR1:
142     psiconv_warn(lev+1,off,"Reading of Sheet Number Format failed");
143     if (length)
144     *length = 0;
145     if (!res)
146     return -PSICONV_E_NOMEM;
147     else
148     return res;
149     }
150    
151 frodo 94 int psiconv_parse_sheet_status_section(const psiconv_buffer buf, int lev,
152     psiconv_u32 off, int *length,
153     psiconv_sheet_status_section *result)
154     {
155     int res=0;
156     int len=0;
157     psiconv_u32 temp;
158     int leng;
159    
160     psiconv_progress(lev+1,off,"Going to read the sheet status section");
161     if (!(*result = malloc(sizeof(**result))))
162     goto ERROR1;
163    
164     psiconv_progress(lev+2,off+len,
165     "Going to read the initial byte (%02x expected)",0x02);
166     temp = psiconv_read_u8(buf,lev+2,off+len,&res);
167     if (res)
168     goto ERROR2;
169     if (temp != 0x02) {
170     psiconv_warn(lev+2,off+len,
171     "Sheet status section initial byte unknown value (ignored)");
172     psiconv_debug(lev+2,off+len,"Initial byte: %02x",temp);
173     }
174     len ++;
175    
176     psiconv_progress(lev+2,off+len,
177     "Going to read the cursor row");
178     (*result)->cursor_row = psiconv_read_u32(buf,lev+2,off + len,&res);
179     if (res)
180     goto ERROR2;
181     psiconv_debug(lev+2,off+len,"Cursor row: %08x",
182     (*result)->cursor_row);
183     len += 0x04;
184    
185     psiconv_progress(lev+2,off+len,
186     "Going to read the cursor column");
187     (*result)->cursor_column = psiconv_read_u32(buf,lev+2,off + len,&res);
188     if (res)
189     goto ERROR2;
190     psiconv_debug(lev+2,off+len,"Cursor column: %08x",
191     (*result)->cursor_column);
192     len += 0x04;
193    
194     psiconv_progress(lev+2,off+len,"Going to read initially display graph");
195     if ((res = psiconv_parse_bool(buf,lev+2,off+len,&leng,
196     &(*result)->show_graph)))
197     goto ERROR2;
198     len += leng;
199    
200     psiconv_progress(lev+2,off+len,
201     "Going to read the toolbar status byte");
202     temp = psiconv_read_u8(buf,lev+2,off+len,&res);
203     if (res)
204     goto ERROR2;
205    
206     (*result)->show_side_sheet_toolbar = temp&0x01 ? psiconv_bool_true :
207     psiconv_bool_false;
208     psiconv_debug(lev+2,off+len,"Show side sheet toolbar: %02x",
209     (*result)->show_side_sheet_toolbar);
210     (*result)->show_top_sheet_toolbar = temp&0x02 ? psiconv_bool_true :
211     psiconv_bool_false;
212     psiconv_debug(lev+2,off+len,"Show top sheet toolbar: %02x",
213     (*result)->show_top_sheet_toolbar);
214     (*result)->show_side_graph_toolbar = temp&0x04 ? psiconv_bool_true :
215     psiconv_bool_false;
216     psiconv_debug(lev+2,off+len,"Show side graph toolbar: %02x",
217     (*result)->show_side_graph_toolbar);
218     (*result)->show_top_graph_toolbar = temp&0x08 ? psiconv_bool_true :
219     psiconv_bool_false;
220     psiconv_debug(lev+2,off+len,"Show top graph toolbar: %02x",
221     (*result)->show_top_graph_toolbar);
222     if (temp & 0xf0) {
223     psiconv_warn(lev+2,off+len,"Sheet status section toolbar byte "
224     "flags contains unknown flags (ignored)");
225     psiconv_debug(lev+2,off+len,"Unknown flags: %02x",temp & 0xf0);
226     }
227     len ++;
228    
229     psiconv_progress(lev+2,off+len,
230     "Going to read the scrollbar status byte");
231     temp = psiconv_read_u8(buf,lev+2,off+len,&res);
232     if (res)
233     goto ERROR2;
234     if ((temp & 0x03) == 0x03) {
235     psiconv_warn(lev+2,off+len,"Sheet status section scrollbar byte "
236     "flags contains unknown flags (ignored)");
237     psiconv_debug(lev+2,off+len,"Unknown flag: %02x",temp & 0x03);
238     }
239     (*result)->show_horizontal_scrollbar = (temp&0x03) == 1? psiconv_triple_off :
240     (temp&0x03) == 2? psiconv_triple_auto:
241     psiconv_triple_on;
242     psiconv_debug(lev+2,off+len,"Show horizontal scrollbar: %02x",
243     (*result)->show_horizontal_scrollbar);
244     if ((temp & 0x0c) == 0x0c) {
245     psiconv_warn(lev+2,off+len,"Sheet status section scrollbar byte "
246     "flags contains unknown flags (ignored)");
247     psiconv_debug(lev+2,off+len,"Unknown flag: %02x",temp & 0x0c);
248     }
249     (*result)->show_vertical_scrollbar = (temp&0x0c) ==0x04? psiconv_triple_off:
250     (temp&0x0c) ==0x08? psiconv_triple_auto:
251     psiconv_triple_on;
252     psiconv_debug(lev+2,off+len,"Show vertical scrollbar: %02x",
253     (*result)->show_vertical_scrollbar);
254     if (temp & 0xf0) {
255     psiconv_warn(lev+2,off+len,"Sheet status section scrollbar byte "
256     "flags contains unknown flags (ignored)");
257     psiconv_debug(lev+2,off+len,"Unknown flags: %02x",temp & 0xf0);
258     }
259     len ++;
260    
261     psiconv_progress(lev+2,off+len,
262     "Going to read an unknown byte (%02x expected)",0x00);
263     temp = psiconv_read_u8(buf,lev+2,off+len,&res);
264     if (res)
265     goto ERROR2;
266     if (temp != 0x00) {
267     psiconv_warn(lev+2,off+len,
268     "Sheet status section unknown byte unknown value (ignored)");
269     psiconv_debug(lev+2,off+len,"Initial byte: %02x",temp);
270     }
271     len ++;
272    
273     psiconv_progress(lev+2,off+len,"Going to read sheet display size");
274     (*result)->sheet_display_size = psiconv_read_u32(buf,lev+2,off + len,&res);
275     if (res)
276     goto ERROR2;
277     psiconv_debug(lev+2,off+len,"Sheet display size: %08x",
278     (*result)->sheet_display_size);
279     len += 0x04;
280    
281     psiconv_progress(lev+2,off+len,"Going to read graph display size");
282     (*result)->graph_display_size = psiconv_read_u32(buf,lev+2,off + len,&res);
283     if (res)
284     goto ERROR2;
285     psiconv_debug(lev+2,off+len,"Graph display size: %08x",
286     (*result)->graph_display_size);
287     len += 0x04;
288    
289     if (length)
290     *length = len;
291    
292     psiconv_progress(lev,off+len-1,
293     "End of sheet status section (total length: %08x)", len);
294     return 0;
295    
296     ERROR2:
297     free (*result);
298     ERROR1:
299 frodo 110 psiconv_warn(lev+1,off,"Reading of Sheet Status Section failed");
300 frodo 94 if (length)
301     *length = 0;
302     if (!res)
303     return -PSICONV_E_NOMEM;
304     else
305     return res;
306     }
307    
308 frodo 95 int psiconv_parse_sheet_workbook_section(const psiconv_buffer buf, int lev,
309     psiconv_u32 off, int *length,
310     psiconv_sheet_workbook_section *result)
311     {
312     int res=0;
313 frodo 110 psiconv_u32 temp,formulas_off,worksheets_off;
314 frodo 95 int len=0;
315    
316     psiconv_progress(lev+1,off,"Going to read the sheet workbook section");
317     if (!(*result = malloc(sizeof(**result))))
318     goto ERROR1;
319    
320     psiconv_progress(lev+2,off+len,
321     "Going to read the initial byte (%02x expected)",0x04);
322     temp = psiconv_read_u8(buf,lev+2,off+len,&res);
323     if (res)
324     goto ERROR2;
325     if (temp != 0x04) {
326     psiconv_warn(lev+2,off+len,
327     "Sheet workbook section initial byte unknown value (ignored)");
328     psiconv_debug(lev+2,off+len,"Initial byte: %02x",temp);
329     }
330     len ++;
331    
332     psiconv_progress(lev+2,off+len,
333     "Going to read the offset of the 1st ??? Section");
334     temp = psiconv_read_u32(buf,lev+2,off+len,&res);
335     if (res)
336     goto ERROR2;
337     psiconv_debug(lev+2,off+len,"Offset: %04x",temp);
338     len += 4;
339    
340     psiconv_progress(lev+2,off+len,
341 frodo 97 "Going to read the offset of the Formulas List");
342     formulas_off = psiconv_read_u32(buf,lev+2,off+len,&res);
343 frodo 95 if (res)
344     goto ERROR2;
345 frodo 97 psiconv_debug(lev+2,off+len,"Offset: %04x",formulas_off);
346 frodo 95 len += 4;
347    
348     psiconv_progress(lev+2,off+len,
349 frodo 111 "Going to read the offset of the Worksheet List");
350 frodo 110 worksheets_off = psiconv_read_u32(buf,lev+2,off+len,&res);
351 frodo 95 if (res)
352     goto ERROR2;
353 frodo 111 psiconv_debug(lev+2,off+len,"Offset: %04x",worksheets_off);
354 frodo 95 len += 4;
355    
356     psiconv_progress(lev+2,off+len,
357     "Going to read the offset of the 4th ??? Section");
358     temp = psiconv_read_u32(buf,lev+2,off+len,&res);
359     if (res)
360     goto ERROR2;
361     psiconv_debug(lev+2,off+len,"Offset: %04x",temp);
362     len += 4;
363    
364 frodo 97 psiconv_progress(lev+2,off+len,"Going to read the formulas list");
365 frodo 98 if ((res = psiconv_parse_sheet_formula_table(buf,lev+2,formulas_off,NULL,
366     &(*result)->formulas)))
367 frodo 97 goto ERROR2;
368    
369 frodo 111 psiconv_progress(lev+2,off+len,"Going to read the worksheet list");
370     if ((res = psiconv_parse_sheet_worksheet_list(buf,lev+2,worksheets_off,
371     NULL,&(*result)->worksheets)))
372 frodo 110 goto ERROR2;
373 frodo 97
374 frodo 110
375 frodo 95 if (length)
376     *length = len;
377    
378     psiconv_progress(lev,off+len-1,
379     "End of sheet workbook section (total length: %08x)", len);
380     return 0;
381    
382     ERROR2:
383     free (*result);
384     ERROR1:
385     psiconv_warn(lev+1,off,"Reading of Sheet Workbook Section failed");
386     if (length)
387     *length = 0;
388     if (!res)
389     return -PSICONV_E_NOMEM;
390     else
391     return res;
392     }
393 frodo 97
394 frodo 98 int psiconv_parse_sheet_formula_table(const psiconv_buffer buf, int lev,
395     psiconv_u32 off, int *length,
396     psiconv_formula_list *result)
397 frodo 97 {
398     int res=0;
399     int len=0;
400     psiconv_u32 temp;
401 frodo 98 psiconv_formula formula;
402 frodo 97 psiconv_u32 listlen,i;
403     int leng;
404    
405     psiconv_progress(lev+1,off,"Going to read the sheet formula table");
406 frodo 98 if (!(*result = psiconv_list_new(sizeof(struct psiconv_formula_s))))
407 frodo 97 goto ERROR1;
408    
409     psiconv_progress(lev+2,off+len,
410     "Going to read the initial byte (%02x expected)",0x02);
411     temp = psiconv_read_u8(buf,lev+2,off+len,&res);
412     if (res)
413     goto ERROR2;
414     if (temp != 0x02) {
415     psiconv_warn(lev+2,off+len,
416     "Sheet formula table initial byte unknown value (ignored)");
417     psiconv_debug(lev+2,off+len,"Initial byte: %02x",temp);
418     }
419     len ++;
420    
421     psiconv_progress(lev+2,off+len,
422     "Going to read the number of formulas");
423     listlen = psiconv_read_X(buf,lev+2,off+len,&leng,&res);
424     if (res)
425     goto ERROR2;
426     psiconv_debug(lev+2,off+len,"Number of formulas: %d",listlen);
427     len += leng;
428    
429     psiconv_progress(lev+2,off+len,"Going to read all formulas");
430     for (i = 0; i < listlen; i++) {
431     psiconv_progress(lev+3,off+len,"Going to read formula %d",i);
432 frodo 98 if ((res = psiconv_parse_formula(buf,lev+3,off+len,&leng,&formula)))
433 frodo 97 goto ERROR2;
434     if ((res = psiconv_list_add(*result,formula)))
435     goto ERROR3;
436     len += leng;
437     }
438    
439     if (length)
440     *length = len;
441    
442     psiconv_progress(lev,off+len-1,
443     "End of sheet formula table (total length: %08x)", len);
444     return 0;
445    
446     ERROR3:
447 frodo 98 psiconv_free_formula(formula);
448 frodo 97 ERROR2:
449     psiconv_list_free(*result);
450     ERROR1:
451     psiconv_warn(lev+1,off,"Reading of Sheet Formula Table failed");
452     if (length)
453     *length = 0;
454     if (!res)
455     return -PSICONV_E_NOMEM;
456     else
457     return res;
458     }
459 frodo 110
460     int psiconv_parse_sheet_cell(const psiconv_buffer buf, int lev,
461     psiconv_u32 off, int *length,
462     psiconv_sheet_cell *result)
463     {
464     int res=0;
465     int len=0;
466     psiconv_u32 temp;
467     psiconv_bool_t has_layout;
468     int leng;
469    
470     psiconv_progress(lev+1,off,"Going to read a sheet cell structure");
471     if (!(*result = malloc(sizeof(**result))))
472     goto ERROR1;
473    
474 frodo 111 (*result)->layout = NULL;
475     (*result)->type = psiconv_cell_blank;
476    
477 frodo 110 psiconv_progress(lev+2,off+len,"Going to read the cell position");
478     temp = psiconv_read_u8(buf,lev+2,off+len,&res);
479     if (res)
480     goto ERROR2;
481     len ++;
482     temp += psiconv_read_u8(buf,lev+2,off+len,&res) << 8;
483     if (res)
484     goto ERROR2;
485     len ++;
486     temp += psiconv_read_u8(buf,lev+2,off+len,&res) << 16;
487     if (res)
488     goto ERROR2;
489     len ++;
490     (*result)->column = (temp >> 2) & 0xFF;
491     (*result)->row = (temp >> 10) & 0x3FFF;
492     psiconv_debug(lev+2,off+len,"Cell position is col:%02x row:%04x",
493     (*result)->column,(*result)->row);
494 frodo 111 if (temp & 0x03) {
495     psiconv_warn(lev+2,off+len,"Unknown flags in cell position (ignored)");
496     psiconv_debug(lev+2,off+len,"Flags: %02x",temp & 0x03);
497     }
498 frodo 110
499     psiconv_progress(lev+2,off+len,"Going to read the cell type");
500     temp = psiconv_read_u8(buf,lev+2,off+len,&res);
501     if (res)
502     goto ERROR2;
503     len ++;
504     (*result)->type = (temp >> 5) & 0x07;
505     (*result)->calculated = (temp & 0x08)?psiconv_bool_true:psiconv_bool_false;
506     has_layout = (temp & 0x10)?psiconv_bool_true:psiconv_bool_false;
507    
508     psiconv_progress(lev+2,off+len,"Going to read the cell value");
509     if ((*result)->type == psiconv_cell_blank) {
510     psiconv_debug(lev+2,off+len,"Cell type is blank: no value given.");
511     } else if ((*result)->type == psiconv_cell_int) {
512     psiconv_progress(lev+2,off+len,"Going to read an integer");
513     (*result)->data.dat_int = psiconv_read_u32(buf,lev+2,off+len,&res);
514     if (res)
515     goto ERROR2;
516     len += 4;
517     psiconv_debug(lev+2,off+len,"Cell contents: %ld",(*result)->data.dat_int);
518    
519     } else if ((*result)->type == psiconv_cell_bool) {
520     psiconv_progress(lev+2,off+len,"Going to read a boolean");
521 frodo 111 if ((res = psiconv_parse_bool(buf,lev+2,off+len,&leng,
522     &(*result)->data.dat_bool)))
523 frodo 110 goto ERROR2;
524     psiconv_debug(lev+2,off+len,"Cell contents: %01x",temp);
525     (*result)->data.dat_bool = temp?psiconv_bool_true:psiconv_bool_false;
526 frodo 111 len += leng;
527 frodo 110 } else if ((*result)->type == psiconv_cell_error) {
528     psiconv_progress(lev+2,off+len,"Going to read the error code");
529 frodo 111 temp = psiconv_read_u16(buf,lev+2,off+len,&res);
530     if (res)
531     goto ERROR2;
532     if (temp == 0)
533     (*result)->data.dat_error = psiconv_sheet_error_none;
534     else if (temp == 1)
535     (*result)->data.dat_error = psiconv_sheet_error_null;
536     else if (temp == 2)
537     (*result)->data.dat_error = psiconv_sheet_error_divzero;
538     else if (temp == 3)
539     (*result)->data.dat_error = psiconv_sheet_error_value;
540     else if (temp == 4)
541     (*result)->data.dat_error = psiconv_sheet_error_reference;
542     else if (temp == 5)
543     (*result)->data.dat_error = psiconv_sheet_error_name;
544     else if (temp == 6)
545     (*result)->data.dat_error = psiconv_sheet_error_number;
546     else if (temp == 7)
547     (*result)->data.dat_error = psiconv_sheet_error_notavail;
548     else {
549     psiconv_warn(lev+2,off+len,"Unknown error code (default assumed)");
550     psiconv_debug(lev+2,off+len,"Error code: %04x",temp);
551     (*result)->data.dat_error = psiconv_sheet_error_none;
552     }
553 frodo 110 psiconv_debug(lev+2,off+len,"Cell contents: %04x",
554 frodo 111 (*result)->data.dat_error);
555     len += 2;
556 frodo 110 } else if ((*result)->type == psiconv_cell_float) {
557     psiconv_progress(lev+2,off+len,"Going to read a float");
558     (*result)->data.dat_float =
559     psiconv_read_float(buf,lev+2,off+len,&leng,&res);
560 frodo 111 if (res)
561     goto ERROR2;
562 frodo 110 psiconv_debug(lev+2,off+len,"Cell contents: %f",(*result)->data.dat_float);
563 frodo 111 len += leng;
564 frodo 110 } else if ((*result)->type == psiconv_cell_string) {
565     psiconv_progress(lev+2,off+len,"Going to read a string");
566     (*result)->data.dat_string =
567 frodo 111 psiconv_read_string(buf,lev+2,off+len,&leng,&res);
568     if (res)
569     goto ERROR2;
570 frodo 110 psiconv_debug(lev+2,off+len,"Cell contents: `%s'",
571     (*result)->data.dat_string);
572 frodo 111 len += leng;
573 frodo 110 } else {
574     psiconv_warn(lev+2,off+len,"Unknown Sheet Cell type: %02x",(*result)->type);
575 frodo 111 res = PSICONV_E_PARSE;
576     goto ERROR2;
577 frodo 110 }
578    
579     if (has_layout) {
580 frodo 111 if ((res = psiconv_parse_sheet_cell_layout(buf,lev+2,off+len,
581     &leng,&(*result)->layout)))
582 frodo 110 goto ERROR2;
583 frodo 111 len += leng;
584 frodo 110 }
585    
586     if ((*result)->calculated) {
587     psiconv_progress(lev+2,off+len,"Going to read the cell formula reference");
588     temp = psiconv_read_X(buf,lev+2,off+len,&leng,&res);
589     if (res)
590     goto ERROR2;
591     psiconv_debug(lev+2,off+len,"Cell formula reference: %d",temp);
592     len += leng;
593 frodo 111 (*result)->ref_formula = temp;
594 frodo 110 }
595    
596     if (length)
597     *length = len;
598    
599     psiconv_progress(lev,off+len-1,
600     "End of sheet cell structure (total length: %08x)", len);
601     return 0;
602    
603     ERROR2:
604     psiconv_free_sheet_cell(*result);
605     ERROR1:
606     psiconv_warn(lev+1,off,"Reading of Sheet Cell Structure failed");
607     if (length)
608     *length = 0;
609     if (!res)
610     return -PSICONV_E_NOMEM;
611     else
612     return res;
613     }
614    
615     int psiconv_parse_sheet_cell_list(const psiconv_buffer buf, int lev,
616     psiconv_u32 off, int *length,
617     psiconv_sheet_cell_list *result)
618     {
619     int res=0;
620     int len=0;
621     psiconv_u32 temp;
622     psiconv_sheet_cell cell;
623     psiconv_u32 listlen,i;
624     int leng;
625    
626 frodo 111 psiconv_progress(lev+1,off,"Going to read the sheet cell list");
627 frodo 110 if (!(*result = psiconv_list_new(sizeof(struct psiconv_sheet_cell_s))))
628     goto ERROR1;
629    
630     psiconv_progress(lev+2,off+len,
631     "Going to read the initial byte (%02x expected)",0x02);
632     temp = psiconv_read_u8(buf,lev+2,off+len,&res);
633     if (res)
634     goto ERROR2;
635     if (temp != 0x02) {
636     psiconv_warn(lev+2,off+len,
637     "Sheet cell list initial byte unknown value (ignored)");
638     psiconv_debug(lev+2,off+len,"Initial byte: %02x",temp);
639     }
640     len ++;
641    
642     psiconv_progress(lev+2,off+len,
643     "Going to read the initial byte (%02x expected)",0x00);
644     temp = psiconv_read_u8(buf,lev+2,off+len,&res);
645     if (res)
646     goto ERROR2;
647     if (temp != 0x00) {
648     psiconv_warn(lev+2,off+len,
649     "Sheet cell list initial byte unknown value (ignored)");
650     psiconv_debug(lev+2,off+len,"Initial byte: %02x",temp);
651     }
652     len ++;
653    
654     psiconv_progress(lev+2,off+len,
655     "Going to read the number of defined cells");
656     listlen = psiconv_read_X(buf,lev+2,off+len,&leng,&res);
657     if (res)
658     goto ERROR2;
659     psiconv_debug(lev+2,off+len,"Number of defined cells: %d",listlen);
660     len += leng;
661    
662     psiconv_progress(lev+2,off+len,"Going to read all cells");
663     for (i = 0; i < listlen; i++) {
664     psiconv_progress(lev+3,off+len,"Going to read cell %d",i);
665     if ((res = psiconv_parse_sheet_cell(buf,lev+3,off+len,&leng,&cell)))
666     goto ERROR2;
667     if ((res = psiconv_list_add(*result,cell)))
668     goto ERROR3;
669 frodo 120 free(cell);
670 frodo 110 len += leng;
671     }
672    
673     if (length)
674     *length = len;
675    
676     psiconv_progress(lev,off+len-1,
677     "End of sheet cell list (total length: %08x)", len);
678     return 0;
679    
680     ERROR3:
681     psiconv_free_sheet_cell(cell);
682     ERROR2:
683     psiconv_free_sheet_cell_list(*result);
684     ERROR1:
685     psiconv_warn(lev+1,off,"Reading of Sheet Cells List failed");
686     if (length)
687     *length = 0;
688     if (!res)
689     return -PSICONV_E_NOMEM;
690     else
691     return res;
692     }
693    
694    
695 frodo 111 int psiconv_parse_sheet_worksheet_list( const psiconv_buffer buf, int lev,
696     psiconv_u32 off, int *length,
697     psiconv_sheet_worksheet_list *result)
698 frodo 110 {
699 frodo 111 psiconv_sheet_worksheet worksheet;
700 frodo 110 int res=0;
701     int len=0;
702 frodo 111 psiconv_u8 temp;
703     psiconv_u32 offset;
704     int leng,i,nr;
705 frodo 110
706 frodo 111 psiconv_progress(lev+1,off,"Going to read the worksheet list");
707     if (!(*result = psiconv_list_new(sizeof(*worksheet))))
708     goto ERROR1;
709    
710 frodo 110 psiconv_progress(lev+2,off+len,
711     "Going to read the initial bytes (%02x expected)",0x02);
712     temp = psiconv_read_u8(buf,lev+2,off+len,&res);
713     if (res)
714 frodo 111 goto ERROR2;
715     if (temp != 0x02) {
716 frodo 110 psiconv_warn(lev+2,off+len,
717 frodo 111 "Sheet worksheet list initial byte unknown value (ignored)");
718 frodo 110 psiconv_debug(lev+2,off+len,"Initial byte: %02x",temp);
719     }
720     len ++;
721    
722 frodo 111 psiconv_progress(lev+2,off+len,"Going to read the list length");
723     nr = psiconv_read_X(buf,lev+2,off+len,&leng,&res);
724 frodo 110 if (res)
725 frodo 111 goto ERROR2;
726     psiconv_debug(lev+2,off+len,"Length: %02x",nr);
727     len += leng;
728 frodo 110
729 frodo 111 psiconv_progress(lev+2,off+len,"Going to read the list");
730     for (i=0 ; i < nr; i++) {
731     psiconv_progress(lev+3,off+len,"Going to read element %d",i);
732     psiconv_progress(lev+4,off+len,
733     "Going to read the initial byte (%02x expected)",0x00);
734     temp = psiconv_read_u8(buf,lev+4,off+len,&res);
735     if (res)
736     goto ERROR2;
737     if (temp != 0x00) {
738     psiconv_warn(lev+4,off+len,
739     "Sheet worksheet element initial byte unknown value (ignored)");
740     psiconv_debug(lev+4,off+len,"Initial byte: %02x",temp);
741     }
742     len ++;
743    
744     psiconv_progress(lev+4,off+len,"Going to read the worksheet offset");
745     offset = psiconv_read_u32(buf,lev+2,off+len,&res);
746     if (res)
747     goto ERROR2;
748     psiconv_debug(lev+4,off+len,"Offset: %08x",offset);
749     len += 4;
750    
751     if ((res = psiconv_parse_sheet_worksheet(buf,lev+4,offset,NULL,
752     &worksheet)))
753     goto ERROR2;
754     if ((res = psiconv_list_add(*result,worksheet)))
755     goto ERROR3;
756 frodo 120 free(worksheet);
757 frodo 110 }
758    
759 frodo 111 if (length)
760     *length = len;
761 frodo 110
762 frodo 111 psiconv_progress(lev,off+len-1,
763     "End of worksheet list (total length: %08x)", len);
764 frodo 110
765 frodo 111 return 0;
766    
767     ERROR3:
768     psiconv_free_sheet_worksheet(worksheet);
769     ERROR2:
770     psiconv_free_sheet_worksheet_list(*result);
771     ERROR1:
772     psiconv_warn(lev+1,off,"Reading of worksheet list failed");
773     if (length)
774     *length = 0;
775     if (!res)
776     return -PSICONV_E_NOMEM;
777     else
778     return res;
779     }
780    
781     int psiconv_parse_sheet_cell_layout(const psiconv_buffer buf, int lev,
782     psiconv_u32 off, int *length,
783     psiconv_sheet_cell_layout *result)
784    
785     {
786     int res=0;
787     int len=0;
788     int leng;
789     psiconv_u8 temp;
790    
791     psiconv_progress(lev+1,off,"Going to read a sheet cell layout");
792 frodo 110 if (!(*result = malloc(sizeof(**result))))
793     goto ERROR1;
794    
795 frodo 111 (*result)->character = NULL;
796     (*result)->paragraph = NULL;
797     (*result)->numberformat = NULL;
798    
799 frodo 110 psiconv_progress(lev+2,off+len,
800 frodo 111 "Going to read the first byte (%02x expected)",0x02);
801 frodo 110 temp = psiconv_read_u8(buf,lev+2,off+len,&res);
802     if (res)
803     goto ERROR2;
804     if (temp != 0x02) {
805     psiconv_warn(lev+2,off+len,
806     "Worksheet section initial byte unknown value (ignored)");
807     psiconv_debug(lev+2,off+len,"Initial byte: %02x",temp);
808     }
809     len ++;
810    
811     psiconv_progress(lev+2,off+len,"Going to read the default formats flag");
812     temp = psiconv_read_u8(buf,lev+2,off+len,&res);
813     if (res)
814     goto ERROR2;
815     len ++;
816    
817     if (temp & 0x01) {
818     if (!((*result)->paragraph = psiconv_basic_paragraph_layout()))
819     goto ERROR2;
820     psiconv_progress(lev+3,off+len,"Going to read the default paragraph codes");
821     if ((res = psiconv_parse_paragraph_layout_list(buf,lev+3,off+len,&leng,
822     (*result)->paragraph)))
823 frodo 111 goto ERROR2;
824 frodo 110 len += leng;
825     }
826    
827     if (temp & 0x02) {
828     psiconv_progress(lev+3,off+len,"Going to read the default character codes");
829     if (!((*result)->character = psiconv_basic_character_layout()))
830 frodo 111 goto ERROR2;
831 frodo 110 if ((res = psiconv_parse_character_layout_list(buf,lev+3,off+len,&leng,
832     (*result)->character)))
833 frodo 111 goto ERROR2;
834 frodo 110 len += leng;
835     }
836    
837     if (temp & 0x04) {
838 frodo 111 psiconv_progress(lev+3,off+len, "Going to read the default number format");
839     psiconv_parse_sheet_numberformat(buf,lev+3,off+len,&leng,
840     &(*result)->numberformat);
841     len += leng;
842 frodo 110 }
843 frodo 111
844     if (length)
845     *length = len;
846    
847     psiconv_progress(lev,off+len-1,
848     "End of sheet cell layout (total length: %08x)", len);
849    
850     return 0;
851    
852     ERROR2:
853     psiconv_free_sheet_cell_layout(*result);
854     ERROR1:
855     psiconv_warn(lev+1,off,"Reading of sheet cell layout failed");
856     if (length)
857     *length = 0;
858     if (!res)
859     return -PSICONV_E_NOMEM;
860     else
861     return res;
862     }
863 frodo 110
864 frodo 111
865     int psiconv_parse_sheet_worksheet(const psiconv_buffer buf, int lev,
866     psiconv_u32 off, int *length,
867     psiconv_sheet_worksheet *result)
868     {
869     int res=0;
870     psiconv_u32 temp,cells_off,grid_off;
871     int len=0;
872     int leng;
873    
874     psiconv_progress(lev+1,off,"Going to read the sheet worksheet section");
875     if (!(*result = malloc(sizeof(**result))))
876     goto ERROR1;
877    
878 frodo 110 psiconv_progress(lev+2,off+len,
879 frodo 111 "Going to read the initial bytes (%02x expected)",0x04);
880     temp = psiconv_read_u8(buf,lev+2,off+len,&res);
881     if (res)
882     goto ERROR2;
883     if (temp != 0x04) {
884     psiconv_warn(lev+2,off+len,
885     "Worksheet section initial byte unknown value (ignored)");
886     psiconv_debug(lev+2,off+len,"Initial byte: %02x",temp);
887     }
888     len ++;
889    
890     psiconv_progress(lev+2,off+len, "Going to read the flags byte");
891     temp = psiconv_read_u8(buf,lev+2,off+len,&res);
892     if (res)
893     goto ERROR2;
894     psiconv_debug(lev+2,off+len,"Flags byte: %02x",temp);
895     (*result)->show_zeros = (temp & 0x01)?psiconv_bool_true:psiconv_bool_false;
896     if (temp & 0xfe) {
897     psiconv_warn(lev+2,off+len,
898     "Worksheet section flags byte unknown bits (ignored)");
899     }
900     len ++;
901    
902     psiconv_progress(lev+2,off+len,"Going to read the default cell layout");
903     if ((res = psiconv_parse_sheet_cell_layout(buf,lev+2,off+len,&leng,
904     &(*result)->default_layout)))
905     goto ERROR2;
906     len += leng;
907    
908     psiconv_progress(lev+2,off+len,
909 frodo 110 "Going to read the offset of the 1st ??? Section");
910     temp = psiconv_read_u32(buf,lev+2,off+len,&res);
911     if (res)
912 frodo 111 goto ERROR3;
913 frodo 110 psiconv_debug(lev+2,off+len,"Offset: %04x",temp);
914     len += 4;
915    
916     psiconv_progress(lev+2,off+len,
917     "Going to read the offset of the 2nd ??? Section");
918     temp = psiconv_read_u32(buf,lev+2,off+len,&res);
919     if (res)
920 frodo 111 goto ERROR3;
921 frodo 110 psiconv_debug(lev+2,off+len,"Offset: %04x",temp);
922     len += 4;
923    
924     psiconv_progress(lev+2,off+len,
925     "Going to read the offset of the Cells List");
926     cells_off = psiconv_read_u32(buf,lev+2,off+len,&res);
927     if (res)
928 frodo 111 goto ERROR3;
929 frodo 110 psiconv_debug(lev+2,off+len,"Offset: %04x",cells_off);
930     len += 4;
931    
932     psiconv_progress(lev+2,off+len,
933     "Going to read the offset of the Grid Section");
934     grid_off = psiconv_read_u32(buf,lev+2,off+len,&res);
935     if (res)
936 frodo 111 goto ERROR3;
937 frodo 110 psiconv_debug(lev+2,off+len,"Offset: %04x",grid_off);
938     len += 4;
939    
940     psiconv_progress(lev+2,off+len,
941     "Going to read the offset of the 3rd ??? Section");
942     temp = psiconv_read_u32(buf,lev+2,off+len,&res);
943     if (res)
944 frodo 111 goto ERROR3;
945 frodo 110 psiconv_debug(lev+2,off+len,"Offset: %04x",temp);
946     len += 4;
947    
948     psiconv_progress(lev+2,off+len,"Going to read the cells list");
949     if ((res = psiconv_parse_sheet_cell_list(buf,lev+2,cells_off,NULL,
950     &(*result)->cells)))
951 frodo 111 goto ERROR3;
952 frodo 110
953    
954     /* TODO: parse grid section */
955    
956     if (length)
957     *length = len;
958    
959     psiconv_progress(lev,off+len-1,
960     "End of sheet worksheet section (total length: %08x)", len);
961     return 0;
962    
963 frodo 111 ERROR3:
964     psiconv_free_sheet_cell_layout((*result)->default_layout);
965 frodo 110 ERROR2:
966     free (*result);
967     ERROR1:
968     psiconv_warn(lev+1,off,"Reading of Sheet Worksheet Section failed");
969     if (length)
970     *length = 0;
971     if (!res)
972     return -PSICONV_E_NOMEM;
973     else
974     return res;
975     }
976    
977    

frodo@frodo.looijaard.name
ViewVC Help
Powered by ViewVC 1.1.26