/[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 18 - (hide annotations)
Wed Oct 27 13:09:40 1999 UTC (24 years, 5 months ago) by frodo
File MIME type: text/plain
File size: 14485 byte(s)
(Frodo) Several changes in header parsing

The definition of header section is changed to exclude the long with the
offset of the Section Table Section. This allows easier integration of
Data-like file formats.

psiconv_parse_{texted,word,mbm}_file now do not parse the header section.
This will allow easier integration for objects-within-objects. They start
at the long with the offset of the Section Table Section.

psiconv_file_type now returns the read header section, and its length.

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 2 else {
69     psiconv_warn(lev+1,off,"Can't parse this file yet!");
70     (*result)->file = NULL;
71     }
72     res = -1;
73    
74     return res;
75     }
76    
77 frodo 12 int psiconv_parse_mbm_file(const psiconv_buffer buf,int lev, psiconv_u32 off,
78     psiconv_mbm_f *result)
79     {
80     int res=0;
81     int i;
82     psiconv_mbm_jumptable_section table;
83     psiconv_paint_data_section paint;
84     psiconv_u32 *entry;
85 frodo 18 psiconv_u32 sto;
86 frodo 12
87     psiconv_progress(lev+1,off,"Going to read a mbm file");
88     *result = malloc(sizeof(**result));
89    
90 frodo 18 psiconv_progress(lev+2,off,"Going to read the offset of the MBM jumptable");
91     sto = psiconv_read_u32(buf,lev+2,off);
92     psiconv_debug(lev+2,off,"Offset: %08x",sto);
93 frodo 12
94     psiconv_progress(lev+2,off,"Going to read the MBM jumptable");
95 frodo 18 res |= psiconv_parse_mbm_jumptable_section(buf,lev+2,sto, NULL,&table);
96 frodo 12
97 frodo 13 psiconv_progress(lev+2,off,"Going to read the picture sections");
98 frodo 12 (*result)->sections = psiconv_list_new(sizeof(*paint));
99     for (i = 0; i < psiconv_list_length(table); i ++) {
100     entry = psiconv_list_get(table,i);
101 frodo 13 psiconv_progress(lev+3,off,"Going to read picture section %i",i);
102     psiconv_parse_paint_data_section(buf,lev+3,*entry,NULL,&paint);
103     psiconv_list_add((*result)->sections,paint);
104 frodo 12 }
105    
106     psiconv_free_mbm_jumptable_section(table);
107     psiconv_progress(lev+1,off,"End of mbm file");
108     return res;
109     }
110    
111 frodo 18 int psiconv_parse_texted_file(const psiconv_buffer buf,int lev,
112     psiconv_u32 off,
113 frodo 2 psiconv_texted_f *result)
114     {
115     int res=0;
116     psiconv_section_table_section table;
117     psiconv_application_id_section appl_id;
118     char *temp_str;
119     psiconv_character_layout base_char;
120     psiconv_paragraph_layout base_para;
121     psiconv_u32 page_sec = 0;
122     psiconv_u32 texted_sec = 0;
123     psiconv_u32 applid_sec = 0;
124 frodo 18 psiconv_u32 sto;
125 frodo 2 psiconv_section_table_entry entry;
126     int i;
127    
128     psiconv_progress(lev+1,off,"Going to read a texted file");
129     *result = malloc(sizeof(**result));
130    
131 frodo 18 psiconv_progress(lev+2,off,"Going to read the offset of the MBM jumptable");
132     sto = psiconv_read_u32(buf,lev+2,off);
133     psiconv_debug(lev+2,off,"Offset: %08x",sto);
134 frodo 2
135 frodo 18 psiconv_progress(lev+2,sto, "Going to read the section table section");
136     res |= psiconv_parse_section_table_section(buf,lev+2,sto, NULL,&table);
137 frodo 2
138     for (i = 0; i < psiconv_list_length(table); i ++) {
139 frodo 18 psiconv_progress(lev+2,sto, "Going to read entry %d",i);
140 frodo 2 entry = psiconv_list_get(table,i);
141     if (entry->id == PSICONV_ID_APPL_ID_SECTION) {
142     applid_sec = entry->offset;
143 frodo 18 psiconv_debug(lev+3,sto,
144 frodo 2 "Found the Application ID section at %08x",applid_sec);
145     } else if (entry->id == PSICONV_ID_PAGE_LAYOUT_SECTION) {
146     page_sec = entry->offset;
147 frodo 18 psiconv_debug(lev+3,sto,
148 frodo 2 "Found the Page Layout section at %08x",page_sec);
149     } else if (entry->id == PSICONV_ID_TEXTED) {
150     texted_sec = entry->offset;
151 frodo 18 psiconv_debug(lev+3,sto,
152 frodo 2 "Found the TextEd section at %08x",texted_sec);
153     } else {
154 frodo 18 psiconv_warn(lev+3,sto,
155 frodo 2 "Found unknown section in the Section Table");
156 frodo 18 psiconv_debug(lev+3,sto,
157 frodo 2 "Section ID %08x, offset %08x",entry->id,entry->offset);
158     res = -1;
159     }
160     }
161    
162 frodo 18 psiconv_progress(lev+2,sto, "Looking for the Application ID section");
163 frodo 2 if (! applid_sec) {
164 frodo 18 psiconv_warn(lev+2,sto,
165 frodo 2 "Application ID section not found in the section table");
166     res = -1;
167     } else {
168 frodo 18 psiconv_debug(lev+2,sto,
169 frodo 2 "Application ID section at offset %08x",applid_sec);
170     res |= psiconv_parse_application_id_section(buf,lev+2,applid_sec,NULL,
171     &appl_id);
172     }
173     if ((appl_id->id != PSICONV_ID_TEXTED) ||
174     strcmp(appl_id->name,"TextEd.app")) {
175     psiconv_warn(lev+2,applid_sec,
176     "Application ID section contains unexpected data");
177     psiconv_debug(lev+2,applid_sec,"ID: %08x expected, %08x found",
178     PSICONV_ID_TEXTED,appl_id->id);
179     temp_str = psiconv_make_printable(appl_id->name);
180     psiconv_debug(lev+2,applid_sec,"Name: `%s' expected, `%s' found",
181     PSICONV_ID_TEXTED,temp_str);
182     free(temp_str);
183     }
184    
185 frodo 18 psiconv_progress(lev+2,sto,
186 frodo 2 "Looking for the Page layout section");
187     if (! page_sec) {
188 frodo 18 psiconv_warn(lev+2,sto,
189 frodo 2 "Page layout section not found in the section table");
190     (*result)->page_sec = NULL;
191     res = -1;
192     } else {
193 frodo 18 psiconv_debug(lev+2,sto,
194 frodo 2 "Page layout section at offset %08x",page_sec);
195     res |= psiconv_parse_page_layout_section(buf,lev+2,page_sec,NULL,
196     &(*result)->page_sec);
197     }
198    
199     base_char = psiconv_basic_character_layout();
200     base_para = psiconv_basic_paragraph_layout();
201    
202 frodo 18 psiconv_progress(lev+2,sto,
203 frodo 2 "Looking for the TextEd section");
204     if (! texted_sec) {
205 frodo 18 psiconv_warn(lev+2,sto,
206 frodo 2 "TextEd section not found in the section table");
207     (*result)->texted_sec = NULL;
208     res = -1;
209     } else {
210 frodo 18 psiconv_debug(lev+2,sto, "TextEd section at offset %08x",texted_sec);
211 frodo 2 res |= psiconv_parse_texted_section(buf,lev+2,texted_sec,NULL,
212     &(*result)->texted_sec,
213     base_char,base_para);
214     }
215     psiconv_free_character_layout(base_char);
216     psiconv_free_paragraph_layout(base_para);
217    
218     psiconv_free_application_id_section(appl_id);
219     psiconv_free_section_table_section(table);
220    
221     psiconv_progress(lev+1,off,"End of word file");
222     return res;
223     }
224    
225     int psiconv_parse_word_file(const psiconv_buffer buf,int lev, psiconv_u32 off,
226     psiconv_word_f *result)
227     {
228     int res=0;
229     psiconv_section_table_section table;
230     psiconv_application_id_section appl_id;
231     char *temp_str;
232     psiconv_u32 pwd_sec = 0;
233     psiconv_u32 status_sec = 0;
234     psiconv_u32 styles_sec = 0;
235     psiconv_u32 page_sec = 0;
236     psiconv_u32 text_sec = 0;
237     psiconv_u32 layout_sec = 0;
238     psiconv_u32 applid_sec = 0;
239     psiconv_section_table_entry entry;
240 frodo 18 psiconv_u32 sto;
241 frodo 2 int i;
242    
243     psiconv_progress(lev+1,off,"Going to read a word file");
244     *result = malloc(sizeof(**result));
245    
246 frodo 18 psiconv_progress(lev+2,off,"Going to read the offset of the MBM jumptable");
247     sto = psiconv_read_u32(buf,lev+2,off);
248     psiconv_debug(lev+2,off,"Offset: %08x",sto);
249 frodo 2
250 frodo 18 psiconv_progress(lev+2,sto,
251 frodo 2 "Going to read the section table section");
252 frodo 18 res |= psiconv_parse_section_table_section(buf,lev+2,sto, NULL,&table);
253 frodo 2
254     for (i = 0; i < psiconv_list_length(table); i ++) {
255 frodo 18 psiconv_progress(lev+2,sto, "Going to read entry %d",i);
256 frodo 2 entry = psiconv_list_get(table,i);
257     if (entry->id == PSICONV_ID_APPL_ID_SECTION) {
258     applid_sec = entry->offset;
259 frodo 18 psiconv_debug(lev+3,sto,
260 frodo 2 "Found the Application ID section at %08x",applid_sec);
261     } else if (entry->id == PSICONV_ID_PAGE_LAYOUT_SECTION) {
262     page_sec = entry->offset;
263 frodo 18 psiconv_debug(lev+3,sto,
264 frodo 2 "Found the Page Layout section at %08x",page_sec);
265     } else if (entry->id == PSICONV_ID_TEXT_SECTION) {
266     text_sec = entry->offset;
267 frodo 18 psiconv_debug(lev+3,sto, "Found the Text section at %08x",text_sec);
268 frodo 2 } else if (entry->id == PSICONV_ID_PASSWORD_SECTION) {
269     pwd_sec = entry->offset;
270 frodo 18 psiconv_debug(lev+3,sto,
271 frodo 2 "Found the Password section at %08x",pwd_sec);
272 frodo 18 psiconv_warn(lev+3,sto,
273 frodo 2 "Password section found - can't read encrypted data");
274     res = -1;
275     } else if (entry->id == PSICONV_ID_WORD_STATUS_SECTION) {
276     status_sec = entry->offset;
277 frodo 18 psiconv_debug(lev+3,sto,
278 frodo 2 "Found the Word Status section at %08x",status_sec);
279     } else if (entry->id == PSICONV_ID_WORD_STYLES_SECTION) {
280     styles_sec = entry->offset;
281 frodo 18 psiconv_debug(lev+3,sto,
282 frodo 2 "Found the Word Styles section at %08x",styles_sec);
283     } else if (entry->id == PSICONV_ID_LAYOUT_SECTION) {
284     layout_sec = entry->offset;
285 frodo 18 psiconv_debug(lev+3,sto,
286 frodo 2 "Found the Layout section at %08x",layout_sec);
287     } else {
288 frodo 18 psiconv_warn(lev+3,sto,
289 frodo 2 "Found unknown section in the Section Table");
290 frodo 18 psiconv_debug(lev+3,sto,
291 frodo 2 "Section ID %08x, offset %08x",entry->id,entry->offset);
292     res = -1;
293     }
294     }
295    
296    
297 frodo 18 psiconv_progress(lev+2,sto,
298 frodo 2 "Looking for the Status section");
299     if (!status_sec) {
300 frodo 18 psiconv_warn(lev+2,sto, "Status section not found in the section table");
301 frodo 2 res = -1;
302     } else {
303 frodo 18 psiconv_debug(lev+2,sto, "Status section at offset %08x",status_sec);
304 frodo 2 res |= psiconv_parse_word_status_section(buf,lev+2,status_sec,NULL,
305     &((*result)->status_sec));
306     }
307    
308 frodo 18 psiconv_progress(lev+2,sto, "Looking for the Application ID section");
309 frodo 2 if (! applid_sec) {
310 frodo 18 psiconv_warn(lev+2,sto,
311 frodo 2 "Application ID section not found in the section table");
312     res = -1;
313     } else {
314 frodo 18 psiconv_debug(lev+2,sto,
315 frodo 2 "Application ID section at offset %08x",applid_sec);
316     res |= psiconv_parse_application_id_section(buf,lev+2,applid_sec,NULL,
317     &appl_id);
318     }
319     if ((appl_id->id != PSICONV_ID_WORD) ||
320     strcmp(appl_id->name,"Word.app")) {
321     psiconv_warn(lev+2,applid_sec,
322     "Application ID section contains unexpected data");
323     psiconv_debug(lev+2,applid_sec,"ID: %08x expected, %08x found",
324     PSICONV_ID_WORD,appl_id->id);
325     temp_str = psiconv_make_printable(appl_id->name);
326     psiconv_debug(lev+2,applid_sec,"Name: `%s' expected, `%s' found",
327     PSICONV_ID_WORD,temp_str);
328     free(temp_str);
329     }
330    
331 frodo 18 psiconv_progress(lev+2,sto,
332 frodo 2 "Looking for the Page layout section");
333     if (! page_sec) {
334 frodo 18 psiconv_warn(lev+2,sto,
335 frodo 2 "Page layout section not found in the section table");
336     (*result)->page_sec = NULL;
337     res = -1;
338     } else {
339 frodo 18 psiconv_debug(lev+2,sto,
340 frodo 2 "Page layout section at offset %08x",page_sec);
341     res |= psiconv_parse_page_layout_section(buf,lev+2,page_sec,NULL,
342     &(*result)->page_sec);
343     }
344    
345 frodo 18 psiconv_progress(lev+2,sto,
346 frodo 2 "Looking for the Word Style section");
347     if (!styles_sec) {
348 frodo 18 psiconv_warn(lev+2,sto,
349 frodo 2 "Word styles section not found in the section table");
350     (*result)->styles_sec = NULL;
351     res = -1;
352     } else {
353 frodo 18 psiconv_debug(lev+2,sto,
354 frodo 2 "Word styles section at offset %08x",styles_sec);
355     res |= psiconv_parse_word_styles_section(buf,lev+2,styles_sec,NULL,
356     &(*result)->styles_sec);
357     }
358    
359 frodo 18 psiconv_progress(lev+2,sto,
360 frodo 2 "Looking for the Text section");
361     if (!text_sec) {
362 frodo 18 psiconv_warn(lev+2,sto, "Text section not found in the section table");
363 frodo 2 (*result)->paragraphs = NULL;
364     res = -1;
365     } else {
366 frodo 18 psiconv_debug(lev+2,sto,
367 frodo 2 "Text section at offset %08x",text_sec);
368     res |= psiconv_parse_text_section(buf,lev+2,text_sec,NULL,
369     &(*result)->paragraphs);
370     }
371    
372     if (((*result)->paragraphs) && ((*result)->styles_sec)) {
373 frodo 18 psiconv_progress(lev+2,sto,
374 frodo 2 "Looking for the Layout section");
375     if (!layout_sec) {
376 frodo 18 psiconv_debug(lev+2,sto,
377 frodo 2 "Layout section not found in the section table");
378     res = -1;
379     } else {
380 frodo 18 psiconv_debug(lev+2,sto,
381 frodo 2 "Layout section at offset %08x",layout_sec);
382     res |= psiconv_parse_styled_layout_section(buf,lev+2,layout_sec,NULL,
383     (*result)->paragraphs,
384     (*result)->styles_sec);
385     }
386     } else
387 frodo 18 psiconv_debug(lev+2,sto,
388 frodo 2 "Skipping search for Layout section, as either the "
389     "text or the word styles section was not found");
390    
391     psiconv_free_application_id_section(appl_id);
392     psiconv_free_section_table_section(table);
393    
394     psiconv_progress(lev+1,off,"End of word file");
395     return res;
396     }

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