/[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 71 - (hide annotations)
Fri Dec 22 22:31:50 2000 UTC (23 years, 3 months ago) by frodo
File MIME type: text/plain
File size: 22662 byte(s)
(Frodo) First generate routines! Reshuffled a few things to make it all work out

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

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