/[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 41 - (hide annotations)
Fri Dec 3 00:59:12 1999 UTC (24 years, 4 months ago) by frodo
File MIME type: text/plain
File size: 18293 byte(s)
(Frodo) Some base work for ClipArt files

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     (*result) = malloc(sizeof(**result));
87     return 0;
88     }
89    
90 frodo 12 int psiconv_parse_mbm_file(const psiconv_buffer buf,int lev, psiconv_u32 off,
91     psiconv_mbm_f *result)
92     {
93     int res=0;
94     int i;
95     psiconv_mbm_jumptable_section table;
96     psiconv_paint_data_section paint;
97     psiconv_u32 *entry;
98 frodo 18 psiconv_u32 sto;
99 frodo 12
100     psiconv_progress(lev+1,off,"Going to read a mbm file");
101     *result = malloc(sizeof(**result));
102    
103 frodo 18 psiconv_progress(lev+2,off,"Going to read the offset of the MBM jumptable");
104     sto = psiconv_read_u32(buf,lev+2,off);
105     psiconv_debug(lev+2,off,"Offset: %08x",sto);
106 frodo 12
107     psiconv_progress(lev+2,off,"Going to read the MBM jumptable");
108 frodo 18 res |= psiconv_parse_mbm_jumptable_section(buf,lev+2,sto, NULL,&table);
109 frodo 12
110 frodo 13 psiconv_progress(lev+2,off,"Going to read the picture sections");
111 frodo 12 (*result)->sections = psiconv_list_new(sizeof(*paint));
112     for (i = 0; i < psiconv_list_length(table); i ++) {
113     entry = psiconv_list_get(table,i);
114 frodo 13 psiconv_progress(lev+3,off,"Going to read picture section %i",i);
115     psiconv_parse_paint_data_section(buf,lev+3,*entry,NULL,&paint);
116     psiconv_list_add((*result)->sections,paint);
117 frodo 12 }
118    
119     psiconv_free_mbm_jumptable_section(table);
120     psiconv_progress(lev+1,off,"End of mbm file");
121     return res;
122     }
123    
124 frodo 24 int psiconv_parse_sketch_file(const psiconv_buffer buf,int lev,
125     psiconv_u32 off,
126     psiconv_sketch_f *result)
127     {
128     psiconv_section_table_section table;
129     psiconv_application_id_section appl_id;
130     psiconv_u32 applid_sec = 0;
131     psiconv_u32 sketch_sec = 0;
132     psiconv_u32 sto;
133     psiconv_section_table_entry entry;
134     int i;
135     int res=0;
136     char *temp_str;
137    
138     psiconv_progress(lev+1,off,"Going to read a sketch file");
139     *result = malloc(sizeof(**result));
140    
141     psiconv_progress(lev+2,off,
142     "Going to read the offset of the section table section");
143     sto = psiconv_read_u32(buf,lev+2,off);
144     psiconv_debug(lev+2,off,"Offset: %08x",sto);
145    
146     psiconv_progress(lev+2,sto, "Going to read the section table section");
147     res |= psiconv_parse_section_table_section(buf,lev+2,sto, NULL,&table);
148    
149     for (i = 0; i < psiconv_list_length(table); i ++) {
150     psiconv_progress(lev+2,sto, "Going to read entry %d",i);
151     entry = psiconv_list_get(table,i);
152     if (entry->id == PSICONV_ID_APPL_ID_SECTION) {
153     applid_sec = entry->offset;
154     psiconv_debug(lev+3,sto,
155     "Found the Application ID section at %08x",applid_sec);
156     } else if (entry->id == PSICONV_ID_SKETCH_SECTION) {
157     sketch_sec = entry->offset;
158     psiconv_debug(lev+3,sto,
159     "Found the Sketch section at %08x",sketch_sec);
160     } else {
161     psiconv_warn(lev+3,sto,
162     "Found unknown section in the Section Table");
163     psiconv_debug(lev+3,sto,
164     "Section ID %08x, offset %08x",entry->id,entry->offset);
165     res = -1;
166     }
167     }
168    
169     psiconv_progress(lev+2,sto, "Looking for the Application ID section");
170     if (! applid_sec) {
171     psiconv_warn(lev+2,sto,
172     "Application ID section not found in the section table");
173     res = -1;
174     } else {
175     psiconv_debug(lev+2,sto,
176     "Application ID section at offset %08x",applid_sec);
177     res |= psiconv_parse_application_id_section(buf,lev+2,applid_sec,NULL,
178     &appl_id);
179     }
180     if ((appl_id->id != PSICONV_ID_SKETCH) ||
181     strcmp(appl_id->name,"Paint.app")) {
182     psiconv_warn(lev+2,applid_sec,
183     "Application ID section contains unexpected data");
184     psiconv_debug(lev+2,applid_sec,"ID: %08x expected, %08x found",
185     PSICONV_ID_SKETCH,appl_id->id);
186     temp_str = psiconv_make_printable(appl_id->name);
187     psiconv_debug(lev+2,applid_sec,"Name: `%s' expected, `%s' found",
188     "Paint.app",temp_str);
189     free(temp_str);
190     }
191    
192     psiconv_progress(lev+2,sto, "Looking for the Sketch section");
193     if (! sketch_sec) {
194     psiconv_warn(lev+2,sto,
195     "Sketch section not found in the section table");
196     res = -1;
197     } else {
198     psiconv_debug(lev+2,sto,
199     "Sketch section at offset %08x",applid_sec);
200     res |= psiconv_parse_sketch_section(buf,lev+2,sketch_sec,NULL,0,
201     &(*result)->sketch_sec);
202     }
203    
204     psiconv_free_application_id_section(appl_id);
205     psiconv_free_section_table_section(table);
206    
207     psiconv_progress(lev+1,off,"End of word file");
208     return res;
209     }
210    
211    
212    
213 frodo 18 int psiconv_parse_texted_file(const psiconv_buffer buf,int lev,
214     psiconv_u32 off,
215 frodo 2 psiconv_texted_f *result)
216     {
217     int res=0;
218     psiconv_section_table_section table;
219     psiconv_application_id_section appl_id;
220     char *temp_str;
221     psiconv_character_layout base_char;
222     psiconv_paragraph_layout base_para;
223     psiconv_u32 page_sec = 0;
224     psiconv_u32 texted_sec = 0;
225     psiconv_u32 applid_sec = 0;
226 frodo 18 psiconv_u32 sto;
227 frodo 2 psiconv_section_table_entry entry;
228     int i;
229    
230     psiconv_progress(lev+1,off,"Going to read a texted file");
231     *result = malloc(sizeof(**result));
232    
233 frodo 24 psiconv_progress(lev+2,off,
234     "Going to read the offset of the section table section");
235 frodo 18 sto = psiconv_read_u32(buf,lev+2,off);
236     psiconv_debug(lev+2,off,"Offset: %08x",sto);
237 frodo 2
238 frodo 18 psiconv_progress(lev+2,sto, "Going to read the section table section");
239     res |= psiconv_parse_section_table_section(buf,lev+2,sto, NULL,&table);
240 frodo 2
241     for (i = 0; i < psiconv_list_length(table); i ++) {
242 frodo 18 psiconv_progress(lev+2,sto, "Going to read entry %d",i);
243 frodo 2 entry = psiconv_list_get(table,i);
244     if (entry->id == PSICONV_ID_APPL_ID_SECTION) {
245     applid_sec = entry->offset;
246 frodo 18 psiconv_debug(lev+3,sto,
247 frodo 2 "Found the Application ID section at %08x",applid_sec);
248     } else if (entry->id == PSICONV_ID_PAGE_LAYOUT_SECTION) {
249     page_sec = entry->offset;
250 frodo 18 psiconv_debug(lev+3,sto,
251 frodo 2 "Found the Page Layout section at %08x",page_sec);
252     } else if (entry->id == PSICONV_ID_TEXTED) {
253     texted_sec = entry->offset;
254 frodo 18 psiconv_debug(lev+3,sto,
255 frodo 2 "Found the TextEd section at %08x",texted_sec);
256     } else {
257 frodo 18 psiconv_warn(lev+3,sto,
258 frodo 2 "Found unknown section in the Section Table");
259 frodo 18 psiconv_debug(lev+3,sto,
260 frodo 2 "Section ID %08x, offset %08x",entry->id,entry->offset);
261     res = -1;
262     }
263     }
264    
265 frodo 18 psiconv_progress(lev+2,sto, "Looking for the Application ID section");
266 frodo 2 if (! applid_sec) {
267 frodo 18 psiconv_warn(lev+2,sto,
268 frodo 2 "Application ID section not found in the section table");
269     res = -1;
270     } else {
271 frodo 18 psiconv_debug(lev+2,sto,
272 frodo 2 "Application ID section at offset %08x",applid_sec);
273     res |= psiconv_parse_application_id_section(buf,lev+2,applid_sec,NULL,
274     &appl_id);
275     }
276     if ((appl_id->id != PSICONV_ID_TEXTED) ||
277     strcmp(appl_id->name,"TextEd.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_TEXTED,appl_id->id);
282     temp_str = psiconv_make_printable(appl_id->name);
283     psiconv_debug(lev+2,applid_sec,"Name: `%s' expected, `%s' found",
284 frodo 24 "TextEd.app",temp_str);
285 frodo 2 free(temp_str);
286     }
287    
288 frodo 18 psiconv_progress(lev+2,sto,
289 frodo 2 "Looking for the Page layout section");
290     if (! page_sec) {
291 frodo 18 psiconv_warn(lev+2,sto,
292 frodo 2 "Page layout section not found in the section table");
293     (*result)->page_sec = NULL;
294     res = -1;
295     } else {
296 frodo 18 psiconv_debug(lev+2,sto,
297 frodo 2 "Page layout section at offset %08x",page_sec);
298     res |= psiconv_parse_page_layout_section(buf,lev+2,page_sec,NULL,
299     &(*result)->page_sec);
300     }
301    
302     base_char = psiconv_basic_character_layout();
303     base_para = psiconv_basic_paragraph_layout();
304    
305 frodo 18 psiconv_progress(lev+2,sto,
306 frodo 2 "Looking for the TextEd section");
307     if (! texted_sec) {
308 frodo 18 psiconv_warn(lev+2,sto,
309 frodo 2 "TextEd section not found in the section table");
310     (*result)->texted_sec = NULL;
311     res = -1;
312     } else {
313 frodo 18 psiconv_debug(lev+2,sto, "TextEd section at offset %08x",texted_sec);
314 frodo 2 res |= psiconv_parse_texted_section(buf,lev+2,texted_sec,NULL,
315     &(*result)->texted_sec,
316     base_char,base_para);
317     }
318     psiconv_free_character_layout(base_char);
319     psiconv_free_paragraph_layout(base_para);
320    
321     psiconv_free_application_id_section(appl_id);
322     psiconv_free_section_table_section(table);
323    
324     psiconv_progress(lev+1,off,"End of word file");
325     return res;
326     }
327    
328     int psiconv_parse_word_file(const psiconv_buffer buf,int lev, psiconv_u32 off,
329     psiconv_word_f *result)
330     {
331     int res=0;
332     psiconv_section_table_section table;
333     psiconv_application_id_section appl_id;
334     char *temp_str;
335     psiconv_u32 pwd_sec = 0;
336     psiconv_u32 status_sec = 0;
337     psiconv_u32 styles_sec = 0;
338     psiconv_u32 page_sec = 0;
339     psiconv_u32 text_sec = 0;
340     psiconv_u32 layout_sec = 0;
341     psiconv_u32 applid_sec = 0;
342     psiconv_section_table_entry entry;
343 frodo 18 psiconv_u32 sto;
344 frodo 2 int i;
345    
346     psiconv_progress(lev+1,off,"Going to read a word file");
347     *result = malloc(sizeof(**result));
348    
349 frodo 24 psiconv_progress(lev+2,off,
350     "Going to read the offset of the section table section");
351 frodo 18 sto = psiconv_read_u32(buf,lev+2,off);
352     psiconv_debug(lev+2,off,"Offset: %08x",sto);
353 frodo 2
354 frodo 18 psiconv_progress(lev+2,sto,
355 frodo 2 "Going to read the section table section");
356 frodo 18 res |= psiconv_parse_section_table_section(buf,lev+2,sto, NULL,&table);
357 frodo 2
358     for (i = 0; i < psiconv_list_length(table); i ++) {
359 frodo 18 psiconv_progress(lev+2,sto, "Going to read entry %d",i);
360 frodo 2 entry = psiconv_list_get(table,i);
361     if (entry->id == PSICONV_ID_APPL_ID_SECTION) {
362     applid_sec = entry->offset;
363 frodo 18 psiconv_debug(lev+3,sto,
364 frodo 2 "Found the Application ID section at %08x",applid_sec);
365     } else if (entry->id == PSICONV_ID_PAGE_LAYOUT_SECTION) {
366     page_sec = entry->offset;
367 frodo 18 psiconv_debug(lev+3,sto,
368 frodo 2 "Found the Page Layout section at %08x",page_sec);
369     } else if (entry->id == PSICONV_ID_TEXT_SECTION) {
370     text_sec = entry->offset;
371 frodo 18 psiconv_debug(lev+3,sto, "Found the Text section at %08x",text_sec);
372 frodo 2 } else if (entry->id == PSICONV_ID_PASSWORD_SECTION) {
373     pwd_sec = entry->offset;
374 frodo 18 psiconv_debug(lev+3,sto,
375 frodo 2 "Found the Password section at %08x",pwd_sec);
376 frodo 18 psiconv_warn(lev+3,sto,
377 frodo 2 "Password section found - can't read encrypted data");
378     res = -1;
379     } else if (entry->id == PSICONV_ID_WORD_STATUS_SECTION) {
380     status_sec = entry->offset;
381 frodo 18 psiconv_debug(lev+3,sto,
382 frodo 2 "Found the Word Status section at %08x",status_sec);
383     } else if (entry->id == PSICONV_ID_WORD_STYLES_SECTION) {
384     styles_sec = entry->offset;
385 frodo 18 psiconv_debug(lev+3,sto,
386 frodo 2 "Found the Word Styles section at %08x",styles_sec);
387     } else if (entry->id == PSICONV_ID_LAYOUT_SECTION) {
388     layout_sec = entry->offset;
389 frodo 18 psiconv_debug(lev+3,sto,
390 frodo 2 "Found the Layout section at %08x",layout_sec);
391     } else {
392 frodo 18 psiconv_warn(lev+3,sto,
393 frodo 2 "Found unknown section in the Section Table");
394 frodo 18 psiconv_debug(lev+3,sto,
395 frodo 2 "Section ID %08x, offset %08x",entry->id,entry->offset);
396     res = -1;
397     }
398     }
399    
400    
401 frodo 18 psiconv_progress(lev+2,sto,
402 frodo 2 "Looking for the Status section");
403     if (!status_sec) {
404 frodo 18 psiconv_warn(lev+2,sto, "Status section not found in the section table");
405 frodo 2 res = -1;
406     } else {
407 frodo 18 psiconv_debug(lev+2,sto, "Status section at offset %08x",status_sec);
408 frodo 2 res |= psiconv_parse_word_status_section(buf,lev+2,status_sec,NULL,
409     &((*result)->status_sec));
410     }
411    
412 frodo 18 psiconv_progress(lev+2,sto, "Looking for the Application ID section");
413 frodo 2 if (! applid_sec) {
414 frodo 18 psiconv_warn(lev+2,sto,
415 frodo 2 "Application ID section not found in the section table");
416     res = -1;
417     } else {
418 frodo 18 psiconv_debug(lev+2,sto,
419 frodo 2 "Application ID section at offset %08x",applid_sec);
420     res |= psiconv_parse_application_id_section(buf,lev+2,applid_sec,NULL,
421     &appl_id);
422     }
423     if ((appl_id->id != PSICONV_ID_WORD) ||
424     strcmp(appl_id->name,"Word.app")) {
425     psiconv_warn(lev+2,applid_sec,
426     "Application ID section contains unexpected data");
427     psiconv_debug(lev+2,applid_sec,"ID: %08x expected, %08x found",
428     PSICONV_ID_WORD,appl_id->id);
429     temp_str = psiconv_make_printable(appl_id->name);
430     psiconv_debug(lev+2,applid_sec,"Name: `%s' expected, `%s' found",
431 frodo 24 "Word.app",temp_str);
432 frodo 2 free(temp_str);
433     }
434    
435 frodo 18 psiconv_progress(lev+2,sto,
436 frodo 2 "Looking for the Page layout section");
437     if (! page_sec) {
438 frodo 18 psiconv_warn(lev+2,sto,
439 frodo 2 "Page layout section not found in the section table");
440     (*result)->page_sec = NULL;
441     res = -1;
442     } else {
443 frodo 18 psiconv_debug(lev+2,sto,
444 frodo 2 "Page layout section at offset %08x",page_sec);
445     res |= psiconv_parse_page_layout_section(buf,lev+2,page_sec,NULL,
446     &(*result)->page_sec);
447     }
448    
449 frodo 18 psiconv_progress(lev+2,sto,
450 frodo 2 "Looking for the Word Style section");
451     if (!styles_sec) {
452 frodo 18 psiconv_warn(lev+2,sto,
453 frodo 2 "Word styles section not found in the section table");
454     (*result)->styles_sec = NULL;
455     res = -1;
456     } else {
457 frodo 18 psiconv_debug(lev+2,sto,
458 frodo 2 "Word styles section at offset %08x",styles_sec);
459     res |= psiconv_parse_word_styles_section(buf,lev+2,styles_sec,NULL,
460     &(*result)->styles_sec);
461     }
462    
463 frodo 18 psiconv_progress(lev+2,sto,
464 frodo 2 "Looking for the Text section");
465     if (!text_sec) {
466 frodo 18 psiconv_warn(lev+2,sto, "Text section not found in the section table");
467 frodo 2 (*result)->paragraphs = NULL;
468     res = -1;
469     } else {
470 frodo 18 psiconv_debug(lev+2,sto,
471 frodo 2 "Text section at offset %08x",text_sec);
472     res |= psiconv_parse_text_section(buf,lev+2,text_sec,NULL,
473     &(*result)->paragraphs);
474     }
475    
476     if (((*result)->paragraphs) && ((*result)->styles_sec)) {
477 frodo 18 psiconv_progress(lev+2,sto,
478 frodo 2 "Looking for the Layout section");
479     if (!layout_sec) {
480 frodo 18 psiconv_debug(lev+2,sto,
481 frodo 2 "Layout section not found in the section table");
482     res = -1;
483     } else {
484 frodo 18 psiconv_debug(lev+2,sto,
485 frodo 2 "Layout section at offset %08x",layout_sec);
486     res |= psiconv_parse_styled_layout_section(buf,lev+2,layout_sec,NULL,
487     (*result)->paragraphs,
488     (*result)->styles_sec);
489     }
490     } else
491 frodo 18 psiconv_debug(lev+2,sto,
492 frodo 2 "Skipping search for Layout section, as either the "
493     "text or the word styles section was not found");
494    
495     psiconv_free_application_id_section(appl_id);
496     psiconv_free_section_table_section(table);
497    
498     psiconv_progress(lev+1,off,"End of word file");
499     return res;
500     }

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