/[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 42 - (hide annotations)
Fri Dec 3 23:13:55 1999 UTC (24 years, 4 months ago) by frodo
File MIME type: text/plain
File size: 18294 byte(s)
(Frodo) Renamed jumptable_mbm_section to jumptable_section

Typecast buglet removed from data.c

1 frodo 2 /*
2     parse_driver.c - Part of psiconv, a PSION 5 file formats converter
3     Copyright (c) 1999 Frodo Looijaard <frodol@dds.nl>
4    
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9    
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13     GNU General Public License for more details.
14    
15     You should have received a copy of the GNU General Public License
16     along with this program; if not, write to the Free Software
17     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18     */
19    
20     #include "config.h"
21     #include <stdlib.h>
22    
23     #include "parse.h"
24     #include "parse_routines.h"
25     #include "data.h"
26    
27 frodo 18 psiconv_file_type_t psiconv_file_type(psiconv_buffer buf,int *length,
28     psiconv_header_section *result)
29 frodo 2 {
30     psiconv_header_section header;
31     psiconv_file_type_t res;
32 frodo 18 int leng;
33 frodo 2
34 frodo 18 psiconv_parse_header_section(buf,0,0,&leng,&header);
35 frodo 2 res = header->file;
36 frodo 18 if (result)
37     *result = header;
38     else
39     psiconv_free_header_section(header);
40     if (length)
41     *length = leng;
42 frodo 2 return res;
43     }
44    
45     int psiconv_parse(const psiconv_buffer buf,psiconv_file *result)
46     {
47     int res=0;
48     int lev=0;
49     int off=0;
50 frodo 18 int leng;
51 frodo 2
52     (*result) = malloc(sizeof(**result));
53    
54 frodo 18 (*result)->type = psiconv_file_type(buf,&leng,NULL);
55 frodo 2 if ((*result)->type == psiconv_unknown_file) {
56     psiconv_warn(lev+1,off,"Unknown file type: can't parse!");
57     (*result)->file = NULL;
58     res = -1;
59     } else if ((*result)->type == psiconv_word_file)
60 frodo 18 res = psiconv_parse_word_file(buf,lev+2,leng,
61 frodo 2 (psiconv_word_f *)(&((*result)->file)));
62     else if ((*result)->type == psiconv_texted_file)
63 frodo 18 res = psiconv_parse_texted_file(buf,lev+2,leng,
64 frodo 2 (psiconv_texted_f *)(&((*result)->file)));
65 frodo 12 else if ((*result)->type == psiconv_mbm_file)
66 frodo 18 res = psiconv_parse_mbm_file(buf,lev+2,leng,
67 frodo 12 (psiconv_mbm_f *)(&((*result)->file)));
68 frodo 24 else if ((*result)->type == psiconv_sketch_file)
69     res = psiconv_parse_sketch_file(buf,lev+2,leng,
70     (psiconv_sketch_f *)(&((*result)->file)));
71 frodo 41 else if ((*result)->type == psiconv_clipart_file)
72     res = psiconv_parse_clipart_file(buf,lev+2,leng,
73     (psiconv_clipart_f *)(&((*result)->file)));
74 frodo 2 else {
75     psiconv_warn(lev+1,off,"Can't parse this file yet!");
76     (*result)->file = NULL;
77     }
78     res = -1;
79    
80     return res;
81     }
82    
83 frodo 41 int psiconv_parse_clipart_file(const psiconv_buffer buf,int lev,
84     psiconv_u32 off, psiconv_clipart_f *result)
85     {
86 frodo 42 int res=0;
87 frodo 41 (*result) = malloc(sizeof(**result));
88     return 0;
89     }
90    
91 frodo 12 int psiconv_parse_mbm_file(const psiconv_buffer buf,int lev, psiconv_u32 off,
92     psiconv_mbm_f *result)
93     {
94     int res=0;
95     int i;
96 frodo 42 psiconv_jumptable_section table;
97 frodo 12 psiconv_paint_data_section paint;
98     psiconv_u32 *entry;
99 frodo 18 psiconv_u32 sto;
100 frodo 12
101     psiconv_progress(lev+1,off,"Going to read a mbm file");
102     *result = malloc(sizeof(**result));
103    
104 frodo 18 psiconv_progress(lev+2,off,"Going to read the offset of the MBM jumptable");
105     sto = psiconv_read_u32(buf,lev+2,off);
106     psiconv_debug(lev+2,off,"Offset: %08x",sto);
107 frodo 12
108     psiconv_progress(lev+2,off,"Going to read the MBM jumptable");
109 frodo 42 res |= psiconv_parse_jumptable_section(buf,lev+2,sto, NULL,&table);
110 frodo 12
111 frodo 13 psiconv_progress(lev+2,off,"Going to read the picture sections");
112 frodo 12 (*result)->sections = psiconv_list_new(sizeof(*paint));
113     for (i = 0; i < psiconv_list_length(table); i ++) {
114     entry = psiconv_list_get(table,i);
115 frodo 13 psiconv_progress(lev+3,off,"Going to read picture section %i",i);
116     psiconv_parse_paint_data_section(buf,lev+3,*entry,NULL,&paint);
117     psiconv_list_add((*result)->sections,paint);
118 frodo 12 }
119    
120 frodo 42 psiconv_free_jumptable_section(table);
121 frodo 12 psiconv_progress(lev+1,off,"End of mbm file");
122     return res;
123     }
124    
125 frodo 24 int psiconv_parse_sketch_file(const psiconv_buffer buf,int lev,
126     psiconv_u32 off,
127     psiconv_sketch_f *result)
128     {
129     psiconv_section_table_section table;
130     psiconv_application_id_section appl_id;
131     psiconv_u32 applid_sec = 0;
132     psiconv_u32 sketch_sec = 0;
133     psiconv_u32 sto;
134     psiconv_section_table_entry entry;
135     int i;
136     int res=0;
137     char *temp_str;
138    
139     psiconv_progress(lev+1,off,"Going to read a sketch file");
140     *result = malloc(sizeof(**result));
141    
142     psiconv_progress(lev+2,off,
143     "Going to read the offset of the section table section");
144     sto = psiconv_read_u32(buf,lev+2,off);
145     psiconv_debug(lev+2,off,"Offset: %08x",sto);
146    
147     psiconv_progress(lev+2,sto, "Going to read the section table section");
148     res |= psiconv_parse_section_table_section(buf,lev+2,sto, NULL,&table);
149    
150     for (i = 0; i < psiconv_list_length(table); i ++) {
151     psiconv_progress(lev+2,sto, "Going to read entry %d",i);
152     entry = psiconv_list_get(table,i);
153     if (entry->id == PSICONV_ID_APPL_ID_SECTION) {
154     applid_sec = entry->offset;
155     psiconv_debug(lev+3,sto,
156     "Found the Application ID section at %08x",applid_sec);
157     } else if (entry->id == PSICONV_ID_SKETCH_SECTION) {
158     sketch_sec = entry->offset;
159     psiconv_debug(lev+3,sto,
160     "Found the Sketch section at %08x",sketch_sec);
161     } else {
162     psiconv_warn(lev+3,sto,
163     "Found unknown section in the Section Table");
164     psiconv_debug(lev+3,sto,
165     "Section ID %08x, offset %08x",entry->id,entry->offset);
166     res = -1;
167     }
168     }
169    
170     psiconv_progress(lev+2,sto, "Looking for the Application ID section");
171     if (! applid_sec) {
172     psiconv_warn(lev+2,sto,
173     "Application ID section not found in the section table");
174     res = -1;
175     } else {
176     psiconv_debug(lev+2,sto,
177     "Application ID section at offset %08x",applid_sec);
178     res |= psiconv_parse_application_id_section(buf,lev+2,applid_sec,NULL,
179     &appl_id);
180     }
181     if ((appl_id->id != PSICONV_ID_SKETCH) ||
182     strcmp(appl_id->name,"Paint.app")) {
183     psiconv_warn(lev+2,applid_sec,
184     "Application ID section contains unexpected data");
185     psiconv_debug(lev+2,applid_sec,"ID: %08x expected, %08x found",
186     PSICONV_ID_SKETCH,appl_id->id);
187     temp_str = psiconv_make_printable(appl_id->name);
188     psiconv_debug(lev+2,applid_sec,"Name: `%s' expected, `%s' found",
189     "Paint.app",temp_str);
190     free(temp_str);
191     }
192    
193     psiconv_progress(lev+2,sto, "Looking for the Sketch section");
194     if (! sketch_sec) {
195     psiconv_warn(lev+2,sto,
196     "Sketch section not found in the section table");
197     res = -1;
198     } else {
199     psiconv_debug(lev+2,sto,
200     "Sketch section at offset %08x",applid_sec);
201     res |= psiconv_parse_sketch_section(buf,lev+2,sketch_sec,NULL,0,
202     &(*result)->sketch_sec);
203     }
204    
205     psiconv_free_application_id_section(appl_id);
206     psiconv_free_section_table_section(table);
207    
208     psiconv_progress(lev+1,off,"End of word file");
209     return res;
210     }
211    
212    
213    
214 frodo 18 int psiconv_parse_texted_file(const psiconv_buffer buf,int lev,
215     psiconv_u32 off,
216 frodo 2 psiconv_texted_f *result)
217     {
218     int res=0;
219     psiconv_section_table_section table;
220     psiconv_application_id_section appl_id;
221     char *temp_str;
222     psiconv_character_layout base_char;
223     psiconv_paragraph_layout base_para;
224     psiconv_u32 page_sec = 0;
225     psiconv_u32 texted_sec = 0;
226     psiconv_u32 applid_sec = 0;
227 frodo 18 psiconv_u32 sto;
228 frodo 2 psiconv_section_table_entry entry;
229     int i;
230    
231     psiconv_progress(lev+1,off,"Going to read a texted file");
232     *result = malloc(sizeof(**result));
233    
234 frodo 24 psiconv_progress(lev+2,off,
235     "Going to read the offset of the section table section");
236 frodo 18 sto = psiconv_read_u32(buf,lev+2,off);
237     psiconv_debug(lev+2,off,"Offset: %08x",sto);
238 frodo 2
239 frodo 18 psiconv_progress(lev+2,sto, "Going to read the section table section");
240     res |= psiconv_parse_section_table_section(buf,lev+2,sto, NULL,&table);
241 frodo 2
242     for (i = 0; i < psiconv_list_length(table); i ++) {
243 frodo 18 psiconv_progress(lev+2,sto, "Going to read entry %d",i);
244 frodo 2 entry = psiconv_list_get(table,i);
245     if (entry->id == PSICONV_ID_APPL_ID_SECTION) {
246     applid_sec = entry->offset;
247 frodo 18 psiconv_debug(lev+3,sto,
248 frodo 2 "Found the Application ID section at %08x",applid_sec);
249     } else if (entry->id == PSICONV_ID_PAGE_LAYOUT_SECTION) {
250     page_sec = entry->offset;
251 frodo 18 psiconv_debug(lev+3,sto,
252 frodo 2 "Found the Page Layout section at %08x",page_sec);
253     } else if (entry->id == PSICONV_ID_TEXTED) {
254     texted_sec = entry->offset;
255 frodo 18 psiconv_debug(lev+3,sto,
256 frodo 2 "Found the TextEd section at %08x",texted_sec);
257     } else {
258 frodo 18 psiconv_warn(lev+3,sto,
259 frodo 2 "Found unknown section in the Section Table");
260 frodo 18 psiconv_debug(lev+3,sto,
261 frodo 2 "Section ID %08x, offset %08x",entry->id,entry->offset);
262     res = -1;
263     }
264     }
265    
266 frodo 18 psiconv_progress(lev+2,sto, "Looking for the Application ID section");
267 frodo 2 if (! applid_sec) {
268 frodo 18 psiconv_warn(lev+2,sto,
269 frodo 2 "Application ID section not found in the section table");
270     res = -1;
271     } else {
272 frodo 18 psiconv_debug(lev+2,sto,
273 frodo 2 "Application ID section at offset %08x",applid_sec);
274     res |= psiconv_parse_application_id_section(buf,lev+2,applid_sec,NULL,
275     &appl_id);
276     }
277     if ((appl_id->id != PSICONV_ID_TEXTED) ||
278     strcmp(appl_id->name,"TextEd.app")) {
279     psiconv_warn(lev+2,applid_sec,
280     "Application ID section contains unexpected data");
281     psiconv_debug(lev+2,applid_sec,"ID: %08x expected, %08x found",
282     PSICONV_ID_TEXTED,appl_id->id);
283     temp_str = psiconv_make_printable(appl_id->name);
284     psiconv_debug(lev+2,applid_sec,"Name: `%s' expected, `%s' found",
285 frodo 24 "TextEd.app",temp_str);
286 frodo 2 free(temp_str);
287     }
288    
289 frodo 18 psiconv_progress(lev+2,sto,
290 frodo 2 "Looking for the Page layout section");
291     if (! page_sec) {
292 frodo 18 psiconv_warn(lev+2,sto,
293 frodo 2 "Page layout section not found in the section table");
294     (*result)->page_sec = NULL;
295     res = -1;
296     } else {
297 frodo 18 psiconv_debug(lev+2,sto,
298 frodo 2 "Page layout section at offset %08x",page_sec);
299     res |= psiconv_parse_page_layout_section(buf,lev+2,page_sec,NULL,
300     &(*result)->page_sec);
301     }
302    
303     base_char = psiconv_basic_character_layout();
304     base_para = psiconv_basic_paragraph_layout();
305    
306 frodo 18 psiconv_progress(lev+2,sto,
307 frodo 2 "Looking for the TextEd section");
308     if (! texted_sec) {
309 frodo 18 psiconv_warn(lev+2,sto,
310 frodo 2 "TextEd section not found in the section table");
311     (*result)->texted_sec = NULL;
312     res = -1;
313     } else {
314 frodo 18 psiconv_debug(lev+2,sto, "TextEd section at offset %08x",texted_sec);
315 frodo 2 res |= psiconv_parse_texted_section(buf,lev+2,texted_sec,NULL,
316     &(*result)->texted_sec,
317     base_char,base_para);
318     }
319     psiconv_free_character_layout(base_char);
320     psiconv_free_paragraph_layout(base_para);
321    
322     psiconv_free_application_id_section(appl_id);
323     psiconv_free_section_table_section(table);
324    
325     psiconv_progress(lev+1,off,"End of word file");
326     return res;
327     }
328    
329     int psiconv_parse_word_file(const psiconv_buffer buf,int lev, psiconv_u32 off,
330     psiconv_word_f *result)
331     {
332     int res=0;
333     psiconv_section_table_section table;
334     psiconv_application_id_section appl_id;
335     char *temp_str;
336     psiconv_u32 pwd_sec = 0;
337     psiconv_u32 status_sec = 0;
338     psiconv_u32 styles_sec = 0;
339     psiconv_u32 page_sec = 0;
340     psiconv_u32 text_sec = 0;
341     psiconv_u32 layout_sec = 0;
342     psiconv_u32 applid_sec = 0;
343     psiconv_section_table_entry entry;
344 frodo 18 psiconv_u32 sto;
345 frodo 2 int i;
346    
347     psiconv_progress(lev+1,off,"Going to read a word file");
348     *result = malloc(sizeof(**result));
349    
350 frodo 24 psiconv_progress(lev+2,off,
351     "Going to read the offset of the section table section");
352 frodo 18 sto = psiconv_read_u32(buf,lev+2,off);
353     psiconv_debug(lev+2,off,"Offset: %08x",sto);
354 frodo 2
355 frodo 18 psiconv_progress(lev+2,sto,
356 frodo 2 "Going to read the section table section");
357 frodo 18 res |= psiconv_parse_section_table_section(buf,lev+2,sto, NULL,&table);
358 frodo 2
359     for (i = 0; i < psiconv_list_length(table); i ++) {
360 frodo 18 psiconv_progress(lev+2,sto, "Going to read entry %d",i);
361 frodo 2 entry = psiconv_list_get(table,i);
362     if (entry->id == PSICONV_ID_APPL_ID_SECTION) {
363     applid_sec = entry->offset;
364 frodo 18 psiconv_debug(lev+3,sto,
365 frodo 2 "Found the Application ID section at %08x",applid_sec);
366     } else if (entry->id == PSICONV_ID_PAGE_LAYOUT_SECTION) {
367     page_sec = entry->offset;
368 frodo 18 psiconv_debug(lev+3,sto,
369 frodo 2 "Found the Page Layout section at %08x",page_sec);
370     } else if (entry->id == PSICONV_ID_TEXT_SECTION) {
371     text_sec = entry->offset;
372 frodo 18 psiconv_debug(lev+3,sto, "Found the Text section at %08x",text_sec);
373 frodo 2 } else if (entry->id == PSICONV_ID_PASSWORD_SECTION) {
374     pwd_sec = entry->offset;
375 frodo 18 psiconv_debug(lev+3,sto,
376 frodo 2 "Found the Password section at %08x",pwd_sec);
377 frodo 18 psiconv_warn(lev+3,sto,
378 frodo 2 "Password section found - can't read encrypted data");
379     res = -1;
380     } else if (entry->id == PSICONV_ID_WORD_STATUS_SECTION) {
381     status_sec = entry->offset;
382 frodo 18 psiconv_debug(lev+3,sto,
383 frodo 2 "Found the Word Status section at %08x",status_sec);
384     } else if (entry->id == PSICONV_ID_WORD_STYLES_SECTION) {
385     styles_sec = entry->offset;
386 frodo 18 psiconv_debug(lev+3,sto,
387 frodo 2 "Found the Word Styles section at %08x",styles_sec);
388     } else if (entry->id == PSICONV_ID_LAYOUT_SECTION) {
389     layout_sec = entry->offset;
390 frodo 18 psiconv_debug(lev+3,sto,
391 frodo 2 "Found the Layout section at %08x",layout_sec);
392     } else {
393 frodo 18 psiconv_warn(lev+3,sto,
394 frodo 2 "Found unknown section in the Section Table");
395 frodo 18 psiconv_debug(lev+3,sto,
396 frodo 2 "Section ID %08x, offset %08x",entry->id,entry->offset);
397     res = -1;
398     }
399     }
400    
401    
402 frodo 18 psiconv_progress(lev+2,sto,
403 frodo 2 "Looking for the Status section");
404     if (!status_sec) {
405 frodo 18 psiconv_warn(lev+2,sto, "Status section not found in the section table");
406 frodo 2 res = -1;
407     } else {
408 frodo 18 psiconv_debug(lev+2,sto, "Status section at offset %08x",status_sec);
409 frodo 2 res |= psiconv_parse_word_status_section(buf,lev+2,status_sec,NULL,
410     &((*result)->status_sec));
411     }
412    
413 frodo 18 psiconv_progress(lev+2,sto, "Looking for the Application ID section");
414 frodo 2 if (! applid_sec) {
415 frodo 18 psiconv_warn(lev+2,sto,
416 frodo 2 "Application ID section not found in the section table");
417     res = -1;
418     } else {
419 frodo 18 psiconv_debug(lev+2,sto,
420 frodo 2 "Application ID section at offset %08x",applid_sec);
421     res |= psiconv_parse_application_id_section(buf,lev+2,applid_sec,NULL,
422     &appl_id);
423     }
424     if ((appl_id->id != PSICONV_ID_WORD) ||
425     strcmp(appl_id->name,"Word.app")) {
426     psiconv_warn(lev+2,applid_sec,
427     "Application ID section contains unexpected data");
428     psiconv_debug(lev+2,applid_sec,"ID: %08x expected, %08x found",
429     PSICONV_ID_WORD,appl_id->id);
430     temp_str = psiconv_make_printable(appl_id->name);
431     psiconv_debug(lev+2,applid_sec,"Name: `%s' expected, `%s' found",
432 frodo 24 "Word.app",temp_str);
433 frodo 2 free(temp_str);
434     }
435    
436 frodo 18 psiconv_progress(lev+2,sto,
437 frodo 2 "Looking for the Page layout section");
438     if (! page_sec) {
439 frodo 18 psiconv_warn(lev+2,sto,
440 frodo 2 "Page layout section not found in the section table");
441     (*result)->page_sec = NULL;
442     res = -1;
443     } else {
444 frodo 18 psiconv_debug(lev+2,sto,
445 frodo 2 "Page layout section at offset %08x",page_sec);
446     res |= psiconv_parse_page_layout_section(buf,lev+2,page_sec,NULL,
447     &(*result)->page_sec);
448     }
449    
450 frodo 18 psiconv_progress(lev+2,sto,
451 frodo 2 "Looking for the Word Style section");
452     if (!styles_sec) {
453 frodo 18 psiconv_warn(lev+2,sto,
454 frodo 2 "Word styles section not found in the section table");
455     (*result)->styles_sec = NULL;
456     res = -1;
457     } else {
458 frodo 18 psiconv_debug(lev+2,sto,
459 frodo 2 "Word styles section at offset %08x",styles_sec);
460     res |= psiconv_parse_word_styles_section(buf,lev+2,styles_sec,NULL,
461     &(*result)->styles_sec);
462     }
463    
464 frodo 18 psiconv_progress(lev+2,sto,
465 frodo 2 "Looking for the Text section");
466     if (!text_sec) {
467 frodo 18 psiconv_warn(lev+2,sto, "Text section not found in the section table");
468 frodo 2 (*result)->paragraphs = NULL;
469     res = -1;
470     } else {
471 frodo 18 psiconv_debug(lev+2,sto,
472 frodo 2 "Text section at offset %08x",text_sec);
473     res |= psiconv_parse_text_section(buf,lev+2,text_sec,NULL,
474     &(*result)->paragraphs);
475     }
476    
477     if (((*result)->paragraphs) && ((*result)->styles_sec)) {
478 frodo 18 psiconv_progress(lev+2,sto,
479 frodo 2 "Looking for the Layout section");
480     if (!layout_sec) {
481 frodo 18 psiconv_debug(lev+2,sto,
482 frodo 2 "Layout section not found in the section table");
483     res = -1;
484     } else {
485 frodo 18 psiconv_debug(lev+2,sto,
486 frodo 2 "Layout section at offset %08x",layout_sec);
487     res |= psiconv_parse_styled_layout_section(buf,lev+2,layout_sec,NULL,
488     (*result)->paragraphs,
489     (*result)->styles_sec);
490     }
491     } else
492 frodo 18 psiconv_debug(lev+2,sto,
493 frodo 2 "Skipping search for Layout section, as either the "
494     "text or the word styles section was not found");
495    
496     psiconv_free_application_id_section(appl_id);
497     psiconv_free_section_table_section(table);
498    
499     psiconv_progress(lev+1,off,"End of word file");
500     return res;
501     }

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