/[public]/psiconv/trunk/lib/psiconv/parse_texted.c
ViewVC logotype

Annotation of /psiconv/trunk/lib/psiconv/parse_texted.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 142 - (hide annotations)
Tue Jan 29 18:38:38 2002 UTC (22 years, 3 months ago) by frodo
File MIME type: text/plain
File size: 4595 byte(s)
(Frodo) DMALLOC support

1 frodo 2 /*
2     parse_texted.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    
25     #include "parse_routines.h"
26 frodo 71 #include "error.h"
27 frodo 2
28 frodo 142 #ifdef DMALLOC
29     #include <dmalloc.h>
30     #endif
31    
32 frodo 2 int psiconv_parse_texted_section(const psiconv_buffer buf,int lev,
33     psiconv_u32 off, int *length,
34     psiconv_texted_section *result,
35     psiconv_character_layout base_char,
36     psiconv_paragraph_layout base_para)
37     {
38     int res = 0;
39     int len = 0;
40     psiconv_u32 layout_sec = 0;
41     psiconv_u32 unknown_sec = 0;
42     psiconv_u32 replacement_sec = 0;
43     psiconv_u32 temp;
44     int leng;
45    
46     psiconv_progress(lev+1,off,"Going to read a texted section");
47 frodo 64 if (!((*result) = malloc(sizeof(**result))))
48     goto ERROR1;
49 frodo 2
50     psiconv_progress(lev+2,off+len,"Going to read section id");
51 frodo 64 temp = psiconv_read_u32(buf,lev+2,off+len,&res);
52     if (res)
53     goto ERROR2;
54 frodo 2 if (temp != PSICONV_ID_TEXTED_BODY) {
55     psiconv_warn(lev+2,off+len,
56     "Page header section body id not found");
57     psiconv_debug(lev+2,off+len,
58     "Page body id: read %08x, expected %08x",temp,
59     PSICONV_ID_TEXTED);
60 frodo 64 res = -PSICONV_E_PARSE;
61     goto ERROR2;
62 frodo 2 }
63     len += 4;
64    
65     psiconv_progress(lev+2,off+len,"Going to read the section jumptable");
66 frodo 64 while (temp = psiconv_read_u32(buf,lev+3,off+len,&res),
67     !res && temp != PSICONV_ID_TEXTED_TEXT) {
68 frodo 2 len += 4;
69     if (temp == PSICONV_ID_TEXTED_LAYOUT) {
70 frodo 64 layout_sec = psiconv_read_u32(buf,lev+3,off+len,&res);
71     if (res)
72     goto ERROR2;
73 frodo 2 psiconv_debug(lev+3,off+len,"Found Layout section at %08x",layout_sec);
74     } else if (temp == PSICONV_ID_TEXTED_REPLACEMENT) {
75 frodo 64 replacement_sec = psiconv_read_u32(buf,lev+3,off+len,&res);
76     if (res)
77     goto ERROR2;
78 frodo 2 psiconv_debug(lev+3,off+len,"Found Replacement section at %08x",
79     replacement_sec);
80     } else if (temp == PSICONV_ID_TEXTED_UNKNOWN) {
81 frodo 64 unknown_sec= psiconv_read_u32(buf,lev+3,off+len,&res);
82     if (res)
83     goto ERROR2;
84 frodo 2 if (unknown_sec) {
85     psiconv_warn(lev+3,off+len,
86 frodo 64 "Unknown section in TextEd jumptable has real offset (ignoring)");
87 frodo 2 }
88     psiconv_debug(lev+3,off+len,"Found Unknown section at %08x",
89     unknown_sec);
90     } else {
91 frodo 64 psiconv_warn(lev+3,off+len,
92     "Unknown section in TextEd jumptable (ignoring)");
93 frodo 2 psiconv_debug(lev+3,off+len,"Section ID %08x at offset %08x",temp,
94 frodo 64 psiconv_read_u32(buf,lev+3,off+len,NULL));
95 frodo 2 }
96     len += 4;
97     }
98 frodo 64 if (res)
99     goto ERROR2;
100 frodo 2
101     len += 4;
102     psiconv_progress(lev+2,off+len,"Going to read the text");
103 frodo 64 if ((res = psiconv_parse_text_section(buf,lev+2,off+len,&leng,
104     &(*result)->paragraphs)))
105     goto ERROR2;
106 frodo 2 len += leng;
107    
108     if (layout_sec) {
109     psiconv_progress(lev+2,off+len,"Going to read the layout");
110 frodo 64 if ((res = psiconv_parse_styleless_layout_section(buf,lev+2,layout_sec,NULL,
111 frodo 2 (*result)->paragraphs,
112 frodo 64 base_char,base_para)))
113     goto ERROR3;
114 frodo 2 }
115    
116     #if 0
117     if (replacement_sec) {
118     psiconv_progress(lev+2,off+len,"Going to read the replacements");
119     /* WHATEVER */
120     }
121     #endif
122    
123     if (length)
124     *length = len;
125    
126     psiconv_progress(lev+1,off+len-1,"End of TextEd section "
127     "(total length: %08x", len);
128    
129 frodo 64 return 0;
130    
131     ERROR3:
132     psiconv_free_text_and_layout((*result)->paragraphs);
133     ERROR2:
134     free (*result);
135     ERROR1:
136     psiconv_warn(lev+1,off,"Reading of TextEd Section failed");
137     if (length)
138     *length = 0;
139     if (!res)
140     return -PSICONV_E_NOMEM;
141     else
142     return res;
143 frodo 2 }
144    
145    

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