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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 142 - (hide annotations)
Tue Jan 29 18:38:38 2002 UTC (22 years, 3 months ago) by frodo
File MIME type: text/plain
File size: 28673 byte(s)
(Frodo) DMALLOC support

1 frodo 2 /*
2     parse_driver.c - Part of psiconv, a PSION 5 file formats converter
3 frodo 63 Copyright (c) 1999, 2000 Frodo Looijaard <frodol@dds.nl>
4 frodo 2
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 frodo 71 #include "compat.h"
22    
23 frodo 2 #include <stdlib.h>
24    
25     #include "parse.h"
26     #include "parse_routines.h"
27    
28 frodo 142 #ifdef DMALLOC
29     #include <dmalloc.h>
30     #endif
31    
32    
33 frodo 18 psiconv_file_type_t psiconv_file_type(psiconv_buffer buf,int *length,
34     psiconv_header_section *result)
35 frodo 2 {
36     psiconv_header_section header;
37     psiconv_file_type_t res;
38 frodo 18 int leng;
39 frodo 2
40 frodo 64 if ((psiconv_parse_header_section(buf,0,0,&leng,&header)))
41     return psiconv_unknown_file;
42 frodo 2 res = header->file;
43 frodo 18 if (result)
44     *result = header;
45     else
46     psiconv_free_header_section(header);
47     if (length)
48     *length = leng;
49 frodo 2 return res;
50     }
51    
52     int psiconv_parse(const psiconv_buffer buf,psiconv_file *result)
53     {
54     int res=0;
55     int lev=0;
56     int off=0;
57 frodo 18 int leng;
58 frodo 2
59 frodo 64 if (!((*result) = malloc(sizeof(**result))))
60     goto ERROR1;
61 frodo 2
62 frodo 18 (*result)->type = psiconv_file_type(buf,&leng,NULL);
63 frodo 2 if ((*result)->type == psiconv_unknown_file) {
64     psiconv_warn(lev+1,off,"Unknown file type: can't parse!");
65     (*result)->file = NULL;
66     } else if ((*result)->type == psiconv_word_file)
67 frodo 18 res = psiconv_parse_word_file(buf,lev+2,leng,
68 frodo 2 (psiconv_word_f *)(&((*result)->file)));
69     else if ((*result)->type == psiconv_texted_file)
70 frodo 18 res = psiconv_parse_texted_file(buf,lev+2,leng,
71 frodo 2 (psiconv_texted_f *)(&((*result)->file)));
72 frodo 12 else if ((*result)->type == psiconv_mbm_file)
73 frodo 18 res = psiconv_parse_mbm_file(buf,lev+2,leng,
74 frodo 12 (psiconv_mbm_f *)(&((*result)->file)));
75 frodo 24 else if ((*result)->type == psiconv_sketch_file)
76     res = psiconv_parse_sketch_file(buf,lev+2,leng,
77     (psiconv_sketch_f *)(&((*result)->file)));
78 frodo 41 else if ((*result)->type == psiconv_clipart_file)
79     res = psiconv_parse_clipart_file(buf,lev+2,leng,
80     (psiconv_clipart_f *)(&((*result)->file)));
81 frodo 94 else if ((*result)->type == psiconv_sheet_file)
82     res = psiconv_parse_sheet_file(buf,lev+2,leng,
83     (psiconv_sheet_f *)(&((*result)->file)));
84 frodo 2 else {
85     psiconv_warn(lev+1,off,"Can't parse this file yet!");
86     (*result)->file = NULL;
87     }
88 frodo 64 if (res)
89     goto ERROR2;
90     return 0;
91 frodo 2
92 frodo 64 ERROR2:
93     free(*result);
94     ERROR1:
95     psiconv_warn(lev+1,off,"Reading of Psion File failed");
96     if (res == 0)
97     return -PSICONV_E_NOMEM;
98     else
99     return res;
100 frodo 2 }
101    
102 frodo 41 int psiconv_parse_clipart_file(const psiconv_buffer buf,int lev,
103     psiconv_u32 off, psiconv_clipart_f *result)
104     {
105 frodo 42 int res=0;
106 frodo 43 int i;
107     psiconv_jumptable_section table;
108     psiconv_clipart_section clipart;
109     psiconv_u32 *entry;
110    
111     psiconv_progress(lev+1,off,"Going to read a clipart file");
112 frodo 64 if (!((*result) = malloc(sizeof(**result))))
113     goto ERROR1;
114 frodo 43
115     psiconv_progress(lev+2,off,"Going to read the MBM jumptable");
116 frodo 64 if ((res = psiconv_parse_jumptable_section(buf,lev+2,off, NULL,&table)))
117     goto ERROR2;
118 frodo 43
119     psiconv_progress(lev+2,off,"Going to read the clipart sections");
120 frodo 64 if (!((*result)->sections = psiconv_list_new(sizeof(*clipart))))
121     goto ERROR3;
122 frodo 43 for (i = 0; i < psiconv_list_length(table); i ++) {
123 frodo 64 if (!(entry = psiconv_list_get(table,i)))
124     goto ERROR4;
125 frodo 43 psiconv_progress(lev+3,off,"Going to read clipart section %i",i);
126 frodo 66 if ((res = psiconv_parse_clipart_section(buf,lev+3,*entry,NULL,&clipart)))
127 frodo 64 goto ERROR4;
128 frodo 66 if ((res = psiconv_list_add((*result)->sections,clipart)))
129 frodo 64 goto ERROR5;
130 frodo 43 }
131    
132     psiconv_free_jumptable_section(table);
133     psiconv_progress(lev+1,off,"End of clipart file");
134     return res;
135 frodo 64 ERROR5:
136     psiconv_free_clipart_section(clipart);
137     ERROR4:
138     for (i = 0; i < psiconv_list_length((*result)->sections); i++) {
139     if (!(clipart = psiconv_list_get((*result)->sections,i))) {
140     psiconv_warn(lev+1,off,"Massive memory corruption");
141     goto ERROR3;
142     }
143     psiconv_free_clipart_section(clipart);
144     }
145     psiconv_list_free((*result)->sections);
146     ERROR3:
147     psiconv_free_jumptable_section(table);
148     ERROR2:
149     free(*result);
150     ERROR1:
151     psiconv_warn(lev+1,off,"Reading of Clipart File failed");
152     if (res == 0)
153     return -PSICONV_E_NOMEM;
154     else
155     return res;
156 frodo 41 }
157    
158 frodo 12 int psiconv_parse_mbm_file(const psiconv_buffer buf,int lev, psiconv_u32 off,
159     psiconv_mbm_f *result)
160     {
161     int res=0;
162     int i;
163 frodo 42 psiconv_jumptable_section table;
164 frodo 12 psiconv_paint_data_section paint;
165     psiconv_u32 *entry;
166 frodo 18 psiconv_u32 sto;
167 frodo 12
168     psiconv_progress(lev+1,off,"Going to read a mbm file");
169 frodo 64 if (!(*result = malloc(sizeof(**result))))
170     goto ERROR1;
171 frodo 12
172 frodo 18 psiconv_progress(lev+2,off,"Going to read the offset of the MBM jumptable");
173 frodo 64 sto = psiconv_read_u32(buf,lev+2,off,&res);
174     if (res)
175     goto ERROR2;
176 frodo 18 psiconv_debug(lev+2,off,"Offset: %08x",sto);
177 frodo 12
178     psiconv_progress(lev+2,off,"Going to read the MBM jumptable");
179 frodo 64 if ((res = psiconv_parse_jumptable_section(buf,lev+2,sto, NULL,&table)))
180     goto ERROR2;
181 frodo 12
182 frodo 13 psiconv_progress(lev+2,off,"Going to read the picture sections");
183 frodo 64 if (!((*result)->sections = psiconv_list_new(sizeof(*paint))))
184     goto ERROR3;
185 frodo 12 for (i = 0; i < psiconv_list_length(table); i ++) {
186 frodo 64 if (!(entry = psiconv_list_get(table,i)))
187     goto ERROR4;
188 frodo 13 psiconv_progress(lev+3,off,"Going to read picture section %i",i);
189 frodo 64 if ((res = psiconv_parse_paint_data_section(buf,lev+3,*entry,NULL,
190     0,&paint)))
191     goto ERROR4;
192     if ((res = psiconv_list_add((*result)->sections,paint)))
193     goto ERROR5;
194 frodo 12 }
195    
196 frodo 42 psiconv_free_jumptable_section(table);
197 frodo 12 psiconv_progress(lev+1,off,"End of mbm file");
198 frodo 64 return 0;
199     ERROR5:
200     psiconv_free_paint_data_section(paint);
201     ERROR4:
202     for (i = 0; i < psiconv_list_length((*result)->sections); i++) {
203     if (!(paint = psiconv_list_get((*result)->sections,i))) {
204     psiconv_warn(lev+1,off,"Massive memory corruption");
205     goto ERROR3;
206     }
207     psiconv_free_paint_data_section(paint);
208     }
209     psiconv_list_free((*result)->sections);
210     ERROR3:
211     psiconv_free_jumptable_section(table);
212     ERROR2:
213     free(*result);
214     ERROR1:
215     psiconv_warn(lev+1,off,"Reading of MBM File failed");
216     if (res == 0)
217     return -PSICONV_E_NOMEM;
218     else
219     return res;
220 frodo 12 }
221    
222 frodo 24 int psiconv_parse_sketch_file(const psiconv_buffer buf,int lev,
223     psiconv_u32 off,
224     psiconv_sketch_f *result)
225     {
226     psiconv_section_table_section table;
227     psiconv_application_id_section appl_id;
228     psiconv_u32 applid_sec = 0;
229     psiconv_u32 sketch_sec = 0;
230     psiconv_u32 sto;
231     psiconv_section_table_entry entry;
232     int i;
233     int res=0;
234     char *temp_str;
235    
236     psiconv_progress(lev+1,off,"Going to read a sketch file");
237 frodo 64 if (!(*result = malloc(sizeof(**result))))
238     goto ERROR1;
239 frodo 24
240     psiconv_progress(lev+2,off,
241     "Going to read the offset of the section table section");
242 frodo 64 sto = psiconv_read_u32(buf,lev+2,off,&res);
243     if (res)
244     goto ERROR2;
245 frodo 24 psiconv_debug(lev+2,off,"Offset: %08x",sto);
246    
247     psiconv_progress(lev+2,sto, "Going to read the section table section");
248 frodo 64 if ((res = psiconv_parse_section_table_section(buf,lev+2,sto, NULL,&table)))
249     goto ERROR2;
250 frodo 24
251     for (i = 0; i < psiconv_list_length(table); i ++) {
252     psiconv_progress(lev+2,sto, "Going to read entry %d",i);
253 frodo 64 if (!(entry = psiconv_list_get(table,i)))
254     goto ERROR3;
255 frodo 24 if (entry->id == PSICONV_ID_APPL_ID_SECTION) {
256     applid_sec = entry->offset;
257     psiconv_debug(lev+3,sto,
258     "Found the Application ID section at %08x",applid_sec);
259     } else if (entry->id == PSICONV_ID_SKETCH_SECTION) {
260     sketch_sec = entry->offset;
261     psiconv_debug(lev+3,sto,
262     "Found the Sketch section at %08x",sketch_sec);
263     } else {
264     psiconv_warn(lev+3,sto,
265 frodo 64 "Found unknown section in the Section Table (ignoring)");
266 frodo 24 psiconv_debug(lev+3,sto,
267     "Section ID %08x, offset %08x",entry->id,entry->offset);
268     }
269     }
270    
271     psiconv_progress(lev+2,sto, "Looking for the Application ID section");
272     if (! applid_sec) {
273 frodo 64 psiconv_warn(lev+2,sto,
274     "Application ID section not found in the section table");
275     res = -PSICONV_E_PARSE;
276     goto ERROR3;
277 frodo 24 } else {
278     psiconv_debug(lev+2,sto,
279     "Application ID section at offset %08x",applid_sec);
280 frodo 64 if ((res = psiconv_parse_application_id_section(buf,lev+2,applid_sec,NULL,
281     &appl_id)))
282     goto ERROR3;
283 frodo 24 }
284     if ((appl_id->id != PSICONV_ID_SKETCH) ||
285     strcmp(appl_id->name,"Paint.app")) {
286     psiconv_warn(lev+2,applid_sec,
287     "Application ID section contains unexpected data");
288     psiconv_debug(lev+2,applid_sec,"ID: %08x expected, %08x found",
289     PSICONV_ID_SKETCH,appl_id->id);
290 frodo 64 if (!(temp_str = psiconv_make_printable(appl_id->name)))
291     goto ERROR4;
292 frodo 24 psiconv_debug(lev+2,applid_sec,"Name: `%s' expected, `%s' found",
293     "Paint.app",temp_str);
294     free(temp_str);
295 frodo 64 res = -PSICONV_E_PARSE;
296     goto ERROR4;
297 frodo 24 }
298    
299     psiconv_progress(lev+2,sto, "Looking for the Sketch section");
300     if (! sketch_sec) {
301     psiconv_warn(lev+2,sto,
302     "Sketch section not found in the section table");
303     } else {
304     psiconv_debug(lev+2,sto,
305     "Sketch section at offset %08x",applid_sec);
306 frodo 64 if ((res = psiconv_parse_sketch_section(buf,lev+2,sketch_sec,NULL,0,
307     &(*result)->sketch_sec)))
308     goto ERROR4;
309 frodo 24 }
310    
311     psiconv_free_application_id_section(appl_id);
312     psiconv_free_section_table_section(table);
313    
314     psiconv_progress(lev+1,off,"End of word file");
315     return res;
316 frodo 64
317     ERROR4:
318     psiconv_free_application_id_section(appl_id);
319     ERROR3:
320     free(table);
321     ERROR2:
322     free(*result);
323     ERROR1:
324     psiconv_warn(lev+1,off,"Reading of Scketch File failed");
325     if (res == 0)
326     return -PSICONV_E_NOMEM;
327     else
328     return res;
329 frodo 24 }
330    
331    
332 frodo 18 int psiconv_parse_texted_file(const psiconv_buffer buf,int lev,
333     psiconv_u32 off,
334 frodo 2 psiconv_texted_f *result)
335     {
336     int res=0;
337     psiconv_section_table_section table;
338     psiconv_application_id_section appl_id;
339     char *temp_str;
340     psiconv_character_layout base_char;
341     psiconv_paragraph_layout base_para;
342     psiconv_u32 page_sec = 0;
343     psiconv_u32 texted_sec = 0;
344     psiconv_u32 applid_sec = 0;
345 frodo 18 psiconv_u32 sto;
346 frodo 2 psiconv_section_table_entry entry;
347     int i;
348    
349     psiconv_progress(lev+1,off,"Going to read a texted file");
350 frodo 64 if (!(*result = malloc(sizeof(**result))))
351     goto ERROR1;
352 frodo 2
353 frodo 24 psiconv_progress(lev+2,off,
354     "Going to read the offset of the section table section");
355 frodo 64 sto = psiconv_read_u32(buf,lev+2,off,&res);
356     if (res)
357     goto ERROR2;
358 frodo 18 psiconv_debug(lev+2,off,"Offset: %08x",sto);
359 frodo 2
360 frodo 18 psiconv_progress(lev+2,sto, "Going to read the section table section");
361 frodo 64 if ((res = psiconv_parse_section_table_section(buf,lev+2,sto, NULL,&table)))
362     goto ERROR2;
363 frodo 2
364     for (i = 0; i < psiconv_list_length(table); i ++) {
365 frodo 18 psiconv_progress(lev+2,sto, "Going to read entry %d",i);
366 frodo 64 if (!(entry = psiconv_list_get(table,i)))
367     goto ERROR3;
368 frodo 2 if (entry->id == PSICONV_ID_APPL_ID_SECTION) {
369     applid_sec = entry->offset;
370 frodo 18 psiconv_debug(lev+3,sto,
371 frodo 2 "Found the Application ID section at %08x",applid_sec);
372     } else if (entry->id == PSICONV_ID_PAGE_LAYOUT_SECTION) {
373     page_sec = entry->offset;
374 frodo 18 psiconv_debug(lev+3,sto,
375 frodo 2 "Found the Page Layout section at %08x",page_sec);
376     } else if (entry->id == PSICONV_ID_TEXTED) {
377     texted_sec = entry->offset;
378 frodo 18 psiconv_debug(lev+3,sto,
379 frodo 2 "Found the TextEd section at %08x",texted_sec);
380     } else {
381 frodo 18 psiconv_warn(lev+3,sto,
382 frodo 64 "Found unknown section in the Section Table (ignoring)");
383 frodo 18 psiconv_debug(lev+3,sto,
384 frodo 2 "Section ID %08x, offset %08x",entry->id,entry->offset);
385     }
386     }
387    
388 frodo 18 psiconv_progress(lev+2,sto, "Looking for the Application ID section");
389 frodo 2 if (! applid_sec) {
390 frodo 18 psiconv_warn(lev+2,sto,
391 frodo 2 "Application ID section not found in the section table");
392 frodo 64 res = -PSICONV_E_PARSE;
393     goto ERROR3;
394 frodo 2 } else {
395 frodo 18 psiconv_debug(lev+2,sto,
396 frodo 2 "Application ID section at offset %08x",applid_sec);
397 frodo 64 if ((res = psiconv_parse_application_id_section(buf,lev+2,applid_sec,NULL,
398     &appl_id)))
399     goto ERROR3;
400 frodo 2 }
401     if ((appl_id->id != PSICONV_ID_TEXTED) ||
402     strcmp(appl_id->name,"TextEd.app")) {
403     psiconv_warn(lev+2,applid_sec,
404     "Application ID section contains unexpected data");
405     psiconv_debug(lev+2,applid_sec,"ID: %08x expected, %08x found",
406     PSICONV_ID_TEXTED,appl_id->id);
407 frodo 64 if (!(temp_str = psiconv_make_printable(appl_id->name)))
408     goto ERROR4;
409 frodo 2 psiconv_debug(lev+2,applid_sec,"Name: `%s' expected, `%s' found",
410 frodo 24 "TextEd.app",temp_str);
411 frodo 2 free(temp_str);
412 frodo 64 res = -PSICONV_E_PARSE;
413     goto ERROR4;
414 frodo 2 }
415    
416 frodo 18 psiconv_progress(lev+2,sto,
417 frodo 2 "Looking for the Page layout section");
418     if (! page_sec) {
419 frodo 18 psiconv_warn(lev+2,sto,
420 frodo 2 "Page layout section not found in the section table");
421 frodo 64 res = -PSICONV_E_PARSE;
422     goto ERROR4;
423 frodo 2 } else {
424 frodo 18 psiconv_debug(lev+2,sto,
425 frodo 2 "Page layout section at offset %08x",page_sec);
426 frodo 64 if ((res = psiconv_parse_page_layout_section(buf,lev+2,page_sec,NULL,
427     &(*result)->page_sec)))
428     goto ERROR4;
429 frodo 2 }
430    
431 frodo 64 if (!(base_char = psiconv_basic_character_layout()))
432     goto ERROR5;
433     if (!(base_para = psiconv_basic_paragraph_layout()))
434     goto ERROR6;
435 frodo 2
436 frodo 18 psiconv_progress(lev+2,sto,
437 frodo 2 "Looking for the TextEd section");
438     if (! texted_sec) {
439 frodo 18 psiconv_warn(lev+2,sto,
440 frodo 2 "TextEd section not found in the section table");
441 frodo 64 res = -PSICONV_E_PARSE;
442     goto ERROR7;
443 frodo 2 } else {
444 frodo 18 psiconv_debug(lev+2,sto, "TextEd section at offset %08x",texted_sec);
445 frodo 64 if ((res = psiconv_parse_texted_section(buf,lev+2,texted_sec,NULL,
446 frodo 2 &(*result)->texted_sec,
447 frodo 64 base_char,base_para)))
448     goto ERROR7;
449 frodo 2 }
450     psiconv_free_character_layout(base_char);
451     psiconv_free_paragraph_layout(base_para);
452    
453     psiconv_free_application_id_section(appl_id);
454     psiconv_free_section_table_section(table);
455    
456 frodo 64 psiconv_progress(lev+1,off,"End of TextEd file");
457     return 0;
458    
459     ERROR7:
460     psiconv_free_paragraph_layout(base_para);
461     ERROR6:
462     psiconv_free_character_layout(base_char);
463     ERROR5:
464     psiconv_free_page_layout_section((*result)->page_sec);
465     ERROR4:
466     psiconv_free_application_id_section(appl_id);
467     ERROR3:
468     psiconv_free_section_table_section(table);
469     ERROR2:
470     free(*result);
471     ERROR1:
472     psiconv_warn(lev+1,off,"Reading of TextEd File failed");
473     if (res == 0)
474     return -PSICONV_E_NOMEM;
475     else
476     return res;
477 frodo 2 }
478    
479     int psiconv_parse_word_file(const psiconv_buffer buf,int lev, psiconv_u32 off,
480     psiconv_word_f *result)
481     {
482     int res=0;
483     psiconv_section_table_section table;
484     psiconv_application_id_section appl_id;
485     char *temp_str;
486     psiconv_u32 pwd_sec = 0;
487     psiconv_u32 status_sec = 0;
488     psiconv_u32 styles_sec = 0;
489     psiconv_u32 page_sec = 0;
490     psiconv_u32 text_sec = 0;
491     psiconv_u32 layout_sec = 0;
492     psiconv_u32 applid_sec = 0;
493     psiconv_section_table_entry entry;
494 frodo 18 psiconv_u32 sto;
495 frodo 2 int i;
496    
497     psiconv_progress(lev+1,off,"Going to read a word file");
498 frodo 64 if (!(*result = malloc(sizeof(**result))))
499     goto ERROR1;
500 frodo 2
501 frodo 24 psiconv_progress(lev+2,off,
502     "Going to read the offset of the section table section");
503 frodo 64 sto = psiconv_read_u32(buf,lev+2,off,&res);
504     if (res)
505     goto ERROR2;
506 frodo 18 psiconv_debug(lev+2,off,"Offset: %08x",sto);
507 frodo 2
508 frodo 18 psiconv_progress(lev+2,sto,
509 frodo 2 "Going to read the section table section");
510 frodo 64 if ((res = psiconv_parse_section_table_section(buf,lev+2,sto, NULL,&table)))
511     goto ERROR2;
512 frodo 2
513     for (i = 0; i < psiconv_list_length(table); i ++) {
514 frodo 18 psiconv_progress(lev+2,sto, "Going to read entry %d",i);
515 frodo 64 if (!(entry = psiconv_list_get(table,i)))
516     goto ERROR3;
517 frodo 2 if (entry->id == PSICONV_ID_APPL_ID_SECTION) {
518     applid_sec = entry->offset;
519 frodo 18 psiconv_debug(lev+3,sto,
520 frodo 2 "Found the Application ID section at %08x",applid_sec);
521     } else if (entry->id == PSICONV_ID_PAGE_LAYOUT_SECTION) {
522     page_sec = entry->offset;
523 frodo 18 psiconv_debug(lev+3,sto,
524 frodo 2 "Found the Page Layout section at %08x",page_sec);
525     } else if (entry->id == PSICONV_ID_TEXT_SECTION) {
526     text_sec = entry->offset;
527 frodo 18 psiconv_debug(lev+3,sto, "Found the Text section at %08x",text_sec);
528 frodo 2 } else if (entry->id == PSICONV_ID_PASSWORD_SECTION) {
529     pwd_sec = entry->offset;
530 frodo 18 psiconv_debug(lev+3,sto,
531 frodo 2 "Found the Password section at %08x",pwd_sec);
532 frodo 18 psiconv_warn(lev+3,sto,
533 frodo 2 "Password section found - can't read encrypted data");
534 frodo 64 res = -PSICONV_E_PARSE;
535     goto ERROR3;
536 frodo 2 } else if (entry->id == PSICONV_ID_WORD_STATUS_SECTION) {
537     status_sec = entry->offset;
538 frodo 18 psiconv_debug(lev+3,sto,
539 frodo 2 "Found the Word Status section at %08x",status_sec);
540     } else if (entry->id == PSICONV_ID_WORD_STYLES_SECTION) {
541     styles_sec = entry->offset;
542 frodo 18 psiconv_debug(lev+3,sto,
543 frodo 2 "Found the Word Styles section at %08x",styles_sec);
544     } else if (entry->id == PSICONV_ID_LAYOUT_SECTION) {
545     layout_sec = entry->offset;
546 frodo 18 psiconv_debug(lev+3,sto,
547 frodo 2 "Found the Layout section at %08x",layout_sec);
548     } else {
549 frodo 18 psiconv_warn(lev+3,sto,
550 frodo 64 "Found unknown section in the Section Table (ignoring)");
551 frodo 18 psiconv_debug(lev+3,sto,
552 frodo 2 "Section ID %08x, offset %08x",entry->id,entry->offset);
553     }
554     }
555    
556    
557 frodo 18 psiconv_progress(lev+2,sto,
558 frodo 2 "Looking for the Status section");
559     if (!status_sec) {
560 frodo 18 psiconv_warn(lev+2,sto, "Status section not found in the section table");
561 frodo 64 res = -PSICONV_E_PARSE;
562     goto ERROR3;
563 frodo 2 } else {
564 frodo 18 psiconv_debug(lev+2,sto, "Status section at offset %08x",status_sec);
565 frodo 64 if ((res = psiconv_parse_word_status_section(buf,lev+2,status_sec,NULL,
566     &((*result)->status_sec))))
567     goto ERROR3;
568 frodo 2 }
569    
570 frodo 18 psiconv_progress(lev+2,sto, "Looking for the Application ID section");
571 frodo 2 if (! applid_sec) {
572 frodo 18 psiconv_warn(lev+2,sto,
573 frodo 2 "Application ID section not found in the section table");
574 frodo 64 res = -PSICONV_E_PARSE;
575     goto ERROR4;
576 frodo 2 } else {
577 frodo 18 psiconv_debug(lev+2,sto,
578 frodo 2 "Application ID section at offset %08x",applid_sec);
579 frodo 64 if ((res = psiconv_parse_application_id_section(buf,lev+2,applid_sec,NULL,
580     &appl_id)))
581     goto ERROR4;
582 frodo 2 }
583     if ((appl_id->id != PSICONV_ID_WORD) ||
584     strcmp(appl_id->name,"Word.app")) {
585     psiconv_warn(lev+2,applid_sec,
586     "Application ID section contains unexpected data");
587     psiconv_debug(lev+2,applid_sec,"ID: %08x expected, %08x found",
588     PSICONV_ID_WORD,appl_id->id);
589 frodo 64 if (!(temp_str = psiconv_make_printable(appl_id->name)))
590     goto ERROR5;
591 frodo 2 psiconv_debug(lev+2,applid_sec,"Name: `%s' expected, `%s' found",
592 frodo 24 "Word.app",temp_str);
593 frodo 2 free(temp_str);
594 frodo 64 res = -PSICONV_E_PARSE;
595     goto ERROR5;
596 frodo 2 }
597    
598 frodo 18 psiconv_progress(lev+2,sto,
599 frodo 2 "Looking for the Page layout section");
600     if (! page_sec) {
601 frodo 18 psiconv_warn(lev+2,sto,
602 frodo 2 "Page layout section not found in the section table");
603 frodo 64 res = -PSICONV_E_PARSE;
604     goto ERROR5;
605 frodo 2 } else {
606 frodo 18 psiconv_debug(lev+2,sto,
607 frodo 2 "Page layout section at offset %08x",page_sec);
608 frodo 64 if ((res = psiconv_parse_page_layout_section(buf,lev+2,page_sec,NULL,
609     &(*result)->page_sec)))
610     goto ERROR5;
611 frodo 2 }
612    
613 frodo 18 psiconv_progress(lev+2,sto,
614 frodo 2 "Looking for the Word Style section");
615     if (!styles_sec) {
616 frodo 18 psiconv_warn(lev+2,sto,
617 frodo 2 "Word styles section not found in the section table");
618 frodo 64 res = -PSICONV_E_PARSE;
619     goto ERROR6;
620 frodo 2 } else {
621 frodo 18 psiconv_debug(lev+2,sto,
622 frodo 2 "Word styles section at offset %08x",styles_sec);
623 frodo 64 if ((res = psiconv_parse_word_styles_section(buf,lev+2,styles_sec,NULL,
624     &(*result)->styles_sec)))
625     goto ERROR6;
626 frodo 2 }
627    
628 frodo 18 psiconv_progress(lev+2,sto,
629 frodo 2 "Looking for the Text section");
630     if (!text_sec) {
631 frodo 18 psiconv_warn(lev+2,sto, "Text section not found in the section table");
632 frodo 64 res = -PSICONV_E_PARSE;
633     goto ERROR7;
634 frodo 2 } else {
635 frodo 18 psiconv_debug(lev+2,sto,
636 frodo 2 "Text section at offset %08x",text_sec);
637 frodo 64 if ((res = psiconv_parse_text_section(buf,lev+2,text_sec,NULL,
638     &(*result)->paragraphs)))
639     goto ERROR7;
640 frodo 2 }
641    
642 frodo 64 psiconv_progress(lev+2,sto, "Looking for the Layout section");
643     if (!layout_sec) {
644     psiconv_debug(lev+2,sto, "No layout section today");
645     } else {
646 frodo 18 psiconv_debug(lev+2,sto,
647 frodo 64 "Layout section at offset %08x",layout_sec);
648     if ((res = psiconv_parse_styled_layout_section(buf,lev+2,layout_sec,NULL,
649     (*result)->paragraphs,
650     (*result)->styles_sec)))
651     goto ERROR8;
652     }
653 frodo 2
654     psiconv_free_application_id_section(appl_id);
655     psiconv_free_section_table_section(table);
656    
657     psiconv_progress(lev+1,off,"End of word file");
658 frodo 70 return 0;
659 frodo 64
660    
661     ERROR8:
662     psiconv_free_text_and_layout((*result)->paragraphs);
663     ERROR7:
664     psiconv_free_word_styles_section((*result)->styles_sec);
665     ERROR6:
666     psiconv_free_page_layout_section((*result)->page_sec);
667     ERROR5:
668     psiconv_free_application_id_section(appl_id);
669     ERROR4:
670     psiconv_free_word_status_section((*result)->status_sec);
671     ERROR3:
672     psiconv_free_section_table_section(table);
673     ERROR2:
674     free(*result);
675     ERROR1:
676     psiconv_warn(lev+1,off,"Reading of Word File failed");
677     if (res == 0)
678     return -PSICONV_E_NOMEM;
679     else
680     return res;
681 frodo 2 }
682 frodo 94
683     int psiconv_parse_sheet_file(const psiconv_buffer buf,int lev, psiconv_u32 off,
684     psiconv_sheet_f *result)
685     {
686     int res=0;
687     psiconv_section_table_section table;
688     psiconv_application_id_section appl_id;
689     char *temp_str;
690     psiconv_u32 pwd_sec = 0;
691     psiconv_u32 status_sec = 0;
692     psiconv_u32 page_sec = 0;
693     psiconv_u32 applid_sec = 0;
694 frodo 95 psiconv_u32 workbook_sec = 0;
695 frodo 94 psiconv_section_table_entry entry;
696     psiconv_u32 sto;
697     int i;
698    
699     psiconv_progress(lev+1,off,"Going to read a sheet file");
700     if (!(*result = malloc(sizeof(**result))))
701     goto ERROR1;
702    
703     psiconv_progress(lev+2,off,
704     "Going to read the offset of the section table section");
705     sto = psiconv_read_u32(buf,lev+2,off,&res);
706     if (res)
707     goto ERROR2;
708     psiconv_debug(lev+2,off,"Offset: %08x",sto);
709    
710     psiconv_progress(lev+2,sto,
711     "Going to read the section table section");
712     if ((res = psiconv_parse_section_table_section(buf,lev+2,sto, NULL,&table)))
713     goto ERROR2;
714    
715     for (i = 0; i < psiconv_list_length(table); i ++) {
716     psiconv_progress(lev+2,sto, "Going to read entry %d",i);
717     if (!(entry = psiconv_list_get(table,i)))
718     goto ERROR3;
719     if (entry->id == PSICONV_ID_APPL_ID_SECTION) {
720     applid_sec = entry->offset;
721     psiconv_debug(lev+3,sto,
722     "Found the Application ID section at %08x",applid_sec);
723     } else if (entry->id == PSICONV_ID_PAGE_LAYOUT_SECTION) {
724     page_sec = entry->offset;
725     psiconv_debug(lev+3,sto,
726     "Found the Page Layout section at %08x",page_sec);
727     } else if (entry->id == PSICONV_ID_PASSWORD_SECTION) {
728     pwd_sec = entry->offset;
729     psiconv_debug(lev+3,sto,
730     "Found the Password section at %08x",pwd_sec);
731     psiconv_warn(lev+3,sto,
732     "Password section found - can't read encrypted data");
733     res = -PSICONV_E_PARSE;
734     goto ERROR3;
735 frodo 95 } else if (entry->id == PSICONV_ID_SHEET_WORKBOOK_SECTION) {
736     workbook_sec = entry->offset;
737     psiconv_debug(lev+3,sto,
738     "Found the Sheet Workbook section at %08x",workbook_sec);
739 frodo 94 } else if (entry->id == PSICONV_ID_SHEET_STATUS_SECTION) {
740     status_sec = entry->offset;
741     psiconv_debug(lev+3,sto,
742     "Found the Sheet Status section at %08x",status_sec);
743     } else {
744     psiconv_warn(lev+3,sto,
745     "Found unknown section in the Section Table (ignoring)");
746     psiconv_debug(lev+3,sto,
747     "Section ID %08x, offset %08x",entry->id,entry->offset);
748     }
749     }
750    
751    
752     psiconv_progress(lev+2,sto,
753     "Looking for the Status section");
754     if (!status_sec) {
755     psiconv_warn(lev+2,sto, "Status section not found in the section table");
756     res = -PSICONV_E_PARSE;
757     goto ERROR3;
758     } else {
759     psiconv_debug(lev+2,sto, "Status section at offset %08x",status_sec);
760     if ((res = psiconv_parse_sheet_status_section(buf,lev+2,status_sec,NULL,
761     &((*result)->status_sec))))
762     goto ERROR3;
763     }
764    
765     psiconv_progress(lev+2,sto, "Looking for the Application ID section");
766     if (! applid_sec) {
767     psiconv_warn(lev+2,sto,
768     "Application ID section not found in the section table");
769     res = -PSICONV_E_PARSE;
770     goto ERROR4;
771     } else {
772     psiconv_debug(lev+2,sto,
773     "Application ID section at offset %08x",applid_sec);
774     if ((res = psiconv_parse_application_id_section(buf,lev+2,applid_sec,NULL,
775     &appl_id)))
776     goto ERROR4;
777     }
778     if ((appl_id->id != PSICONV_ID_SHEET) ||
779     strcmp(appl_id->name,"Sheet.app")) {
780     psiconv_warn(lev+2,applid_sec,
781     "Application ID section contains unexpected data");
782     psiconv_debug(lev+2,applid_sec,"ID: %08x expected, %08x found",
783     PSICONV_ID_SHEET,appl_id->id);
784     if (!(temp_str = psiconv_make_printable(appl_id->name)))
785     goto ERROR5;
786     psiconv_debug(lev+2,applid_sec,"Name: `%s' expected, `%s' found",
787 frodo 95 "Sheet.app",temp_str);
788 frodo 94 free(temp_str);
789     res = -PSICONV_E_PARSE;
790     goto ERROR5;
791     }
792    
793     psiconv_progress(lev+2,sto,
794     "Looking for the Page layout section");
795     if (! page_sec) {
796     psiconv_warn(lev+2,sto,
797     "Page layout section not found in the section table");
798     res = -PSICONV_E_PARSE;
799     goto ERROR5;
800     } else {
801     psiconv_debug(lev+2,sto,
802     "Page layout section at offset %08x",page_sec);
803     if ((res = psiconv_parse_page_layout_section(buf,lev+2,page_sec,NULL,
804     &(*result)->page_sec)))
805     goto ERROR5;
806     }
807    
808 frodo 95 psiconv_progress(lev+2,sto,
809     "Looking for the Sheet Workbook section");
810     if (! workbook_sec) {
811     psiconv_warn(lev+2,sto,
812     "Sheet workbook section not found in the section table");
813     res = -PSICONV_E_PARSE;
814     goto ERROR6;
815     } else {
816     psiconv_debug(lev+2,sto,
817     "Sheet workbook section at offset %08x",page_sec);
818     if ((res = psiconv_parse_sheet_workbook_section(buf,lev+2,workbook_sec,NULL,
819     &(*result)->workbook_sec)))
820     goto ERROR6;
821     }
822    
823 frodo 94 psiconv_free_application_id_section(appl_id);
824     psiconv_free_section_table_section(table);
825    
826     psiconv_progress(lev+1,off,"End of Sheet file");
827     return 0;
828    
829 frodo 95 ERROR6:
830     psiconv_free_page_layout_section((*result)->page_sec);
831 frodo 94 ERROR5:
832     psiconv_free_application_id_section(appl_id);
833     ERROR4:
834     psiconv_free_sheet_status_section((*result)->status_sec);
835     ERROR3:
836     psiconv_free_section_table_section(table);
837     ERROR2:
838     free(*result);
839     ERROR1:
840     psiconv_warn(lev+1,off,"Reading of Sheet File failed");
841     if (res == 0)
842     return -PSICONV_E_NOMEM;
843     else
844     return res;
845     }

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