/[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 168 - (hide annotations)
Tue Nov 25 17:57:05 2003 UTC (20 years, 4 months ago) by frodo
File MIME type: text/plain
File size: 30324 byte(s)
(Frodo) config stuff and image generation stuff

* All parse and generate functions have a new config parameter
* New files configuration.[ch] in the psiconv lib
* Some image generation stuff (not ready, but won't do any harm)

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

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