/[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 233 - (hide annotations)
Thu Feb 26 16:27:43 2004 UTC (20 years, 1 month ago) by frodo
File MIME type: text/plain
File size: 30838 byte(s)
(Frodo) And even more error work.

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

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