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

Annotation of /psiconv/trunk/lib/psiconv/parse_page.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: 8857 byte(s)
(Frodo) DMALLOC support

1 frodo 2 /*
2     parse_page.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     #include <string.h>
25    
26     #include "parse_routines.h"
27 frodo 71 #include "error.h"
28 frodo 2
29 frodo 142 #ifdef DMALLOC
30     #include <dmalloc.h>
31     #endif
32    
33    
34 frodo 2 int psiconv_parse_page_header(const psiconv_buffer buf,int lev,psiconv_u32 off,
35     int *length,psiconv_page_header *result)
36     {
37     int res = 0;
38     int len = 0;
39 frodo 111 int i,leng,has_content;
40 frodo 2 psiconv_u32 temp;
41    
42     psiconv_progress(lev+1,off,"Going to read a page header (or footer)");
43 frodo 64 if (!(*result = malloc(sizeof(**result))))
44     goto ERROR1;
45 frodo 2
46     psiconv_progress(lev+2,off+len,
47 frodo 111 "Going to read the has_content flag");
48 frodo 64 temp = psiconv_read_u8(buf,lev+2,off+len,&res);
49 frodo 65 if (res)
50 frodo 64 goto ERROR2;
51 frodo 111 if (temp == 0x00)
52     has_content = 0;
53     else if (temp == 0x01)
54     has_content = 1;
55     else {
56     psiconv_warn(lev+2,off+len,
57     "Page header has_content flag unknown value (assumed default)");
58     psiconv_debug(lev+2,off+len,"Flag: %02x",temp);
59     has_content = 1;
60 frodo 2 }
61 frodo 111 psiconv_debug(lev+2,off+len,"Has_content flag: %02x",has_content);
62 frodo 2 len += 1;
63    
64     psiconv_progress(lev+2,off+len,"Going to read displayed-on-first-page flag");
65 frodo 64 if ((res = psiconv_parse_bool(buf,lev+2,off+len,&leng,
66     &(*result)->on_first_page)))
67     goto ERROR2;
68 frodo 2 len += leng;
69    
70     psiconv_progress(lev+2,off+len,"Going to read three zero bytes");
71     for (i = 0; i < 0x03; i++,len++) {
72 frodo 64 temp = psiconv_read_u8(buf,lev+2,off+len,&res);
73     if (res)
74     goto ERROR2;
75 frodo 2 if (temp != 0x00) {
76     psiconv_warn(lev+2,off+len,
77     "Page Header unknown value in zero bytes section");
78     psiconv_debug(lev+2,off+len,"Byte %d: read %02x, expected %02x",
79     i,temp,0x00);
80     }
81     }
82    
83     psiconv_progress(lev+2,off+len,"Going to read base paragraph layout");
84 frodo 64 if (!((*result)->base_paragraph_layout = psiconv_basic_paragraph_layout()))
85     goto ERROR2;
86 frodo 2
87 frodo 111 if (has_content) {
88     if ((res = psiconv_parse_paragraph_layout_list(buf,lev+2,off+len,&leng,
89     (*result)->base_paragraph_layout)))
90     goto ERROR3;
91     len += leng;
92     }
93    
94 frodo 2 psiconv_progress(lev+2,off+len,"Going to read base character layout");
95 frodo 64 if (!((*result)->base_character_layout = psiconv_basic_character_layout()))
96     goto ERROR3;
97 frodo 111 if (has_content) {
98     if ((res = psiconv_parse_character_layout_list(buf,lev+2,off+len,&leng,
99     (*result)->base_character_layout)))
100     goto ERROR4;
101     }
102 frodo 2 len += leng;
103    
104    
105     psiconv_progress(lev+2,off+len,"Going to read the TextEd section");
106 frodo 111 if (has_content) {
107     if ((res = psiconv_parse_texted_section(buf,lev+2,off+len,&leng,
108     &(*result)->text,
109     (*result)->base_character_layout,
110     (*result)->base_paragraph_layout)))
111     goto ERROR4;
112     len += leng;
113 frodo 140 } else {
114     (*result)->text = NULL;
115 frodo 111 }
116 frodo 2
117     if (length)
118     *length = len;
119    
120     psiconv_progress(lev+1,off+len-1,"End of page header"
121     "(total length: %08x", len);
122    
123     return res;
124 frodo 64
125     ERROR4:
126     psiconv_free_character_layout((*result)->base_character_layout);
127     ERROR3:
128     psiconv_free_paragraph_layout((*result)->base_paragraph_layout);
129     ERROR2:
130     free (*result);
131     ERROR1:
132     psiconv_warn(lev+1,off,"Reading of Page Header failed");
133     if (length)
134     *length = 0;
135     if (!res)
136     return -PSICONV_E_NOMEM;
137     else
138     return res;
139 frodo 2 }
140    
141     int psiconv_parse_page_layout_section(const psiconv_buffer buf,int lev,
142     psiconv_u32 off, int *length,
143     psiconv_page_layout_section *result)
144     {
145     int res = 0;
146     int len = 0;
147     int leng;
148     psiconv_u32 temp;
149    
150     psiconv_progress(lev+1,off,"Going to read the page layout section");
151 frodo 64 if (!(*result = malloc(sizeof(**result))))
152     goto ERROR1;
153 frodo 2
154     psiconv_progress(lev+2,off+len,"Going to read first page number");
155 frodo 64 (*result)->first_page_nr = psiconv_read_u32(buf,lev+2,off+len,&res);
156     if (res)
157     goto ERROR2;
158 frodo 2 psiconv_debug(lev+2,off+len,"First page: %d",(*result)->first_page_nr);
159     len += 4;
160    
161     psiconv_progress(lev+2,off+len,"Going to read header distance");
162 frodo 64 (*result)->header_dist = psiconv_read_length(buf,lev+2,off+len,&leng,&res);
163     if (res)
164     goto ERROR2;
165 frodo 2 psiconv_debug(lev+2,off+len,"Header distance: %6.3f",(*result)->header_dist);
166     len += leng;
167    
168     psiconv_progress(lev+2,off+len,"Going to read footer distance");
169 frodo 64 (*result)->footer_dist = psiconv_read_length(buf,lev+2,off+len,&leng,&res);
170     if (res)
171     goto ERROR2;
172 frodo 2 psiconv_debug(lev+2,off+len,"Footer distance: %6.3f",(*result)->footer_dist);
173     len += leng;
174    
175     psiconv_progress(lev+2,off+len,"Going to read the left margin");
176 frodo 64 (*result)->left_margin = psiconv_read_length(buf,lev+2,off+len,&leng,&res);
177     if (res)
178     goto ERROR2;
179 frodo 2 psiconv_debug(lev+2,off+len,"Left margin: %6.3f",(*result)->left_margin);
180     len += leng;
181    
182     psiconv_progress(lev+2,off+len,"Going read the to right margin");
183 frodo 64 (*result)->right_margin = psiconv_read_length(buf,lev+2,off+len,&leng,&res);
184     if (res)
185     goto ERROR2;
186 frodo 2 psiconv_debug(lev+2,off+len,"Right margin: %6.3f",(*result)->right_margin);
187     len += leng;
188    
189     psiconv_progress(lev+2,off+len,"Going to read the top margin");
190 frodo 64 (*result)->top_margin = psiconv_read_length(buf,lev+2,off+len,&leng,&res);
191     if (res)
192     goto ERROR2;
193 frodo 2 psiconv_debug(lev+2,off+len,"Top margin: %6.3f",(*result)->top_margin);
194     len += leng;
195    
196     psiconv_progress(lev+2,off+len,"Going to read the bottom margin");
197 frodo 64 (*result)->bottom_margin = psiconv_read_length(buf,lev+2,off+len,&leng,&res);
198     if (res)
199     goto ERROR2;
200 frodo 2 psiconv_debug(lev+2,off+len,"Bottom margin: %6.3f",(*result)->bottom_margin);
201     len += leng;
202    
203     psiconv_progress(lev+2,off+len,"Going to read the header");
204 frodo 64 if ((res = psiconv_parse_page_header(buf,lev+2,off+len,&leng,
205     &(*result)->header)))
206     goto ERROR2;
207 frodo 2 len += leng;
208    
209     psiconv_progress(lev+2,off+len,"Going to read the footer");
210 frodo 64 if ((res = psiconv_parse_page_header(buf,lev+2,off+len,&leng,
211     &(*result)->footer)))
212     goto ERROR3;
213 frodo 2 len += leng;
214    
215     psiconv_progress(lev+2,off+len,"Going to read page dimensions id");
216 frodo 64 temp = psiconv_read_u32(buf,lev+2,off+len,&res);
217     if (res)
218     goto ERROR4;
219 frodo 76 if ((temp != PSICONV_ID_PAGE_DIMENSIONS1) &&
220     (temp != PSICONV_ID_PAGE_DIMENSIONS2)) {
221 frodo 2 psiconv_warn(lev+2,off+len,
222     "Page layout section page dimensions marker not found");
223     psiconv_debug(lev+2,off+len,
224 frodo 76 "Page dimensions marker: read %08x, expected %08x or %08x",
225     temp, PSICONV_ID_PAGE_DIMENSIONS1,
226     PSICONV_ID_PAGE_DIMENSIONS2);
227 frodo 2 }
228 frodo 65 len += 4;
229 frodo 2
230     psiconv_progress(lev+2,off+len,"Going to read the page width");
231 frodo 64 (*result)->page_width = psiconv_read_length(buf,lev+2,off+len,&leng,&res);
232 frodo 65 if (res)
233 frodo 64 goto ERROR4;
234 frodo 2 psiconv_debug(lev+2,off+len,"Page width: %6.3f",(*result)->page_width);
235     len += leng;
236    
237     psiconv_progress(lev+2,off+len,"Going to read the page height");
238 frodo 64 (*result)->page_height = psiconv_read_length(buf,lev+2,off+len,&leng,&res);
239 frodo 65 if (res)
240 frodo 64 goto ERROR4;
241 frodo 2 psiconv_debug(lev+2,off+len,"Page height: %6.3f",(*result)->page_height);
242     len += leng;
243    
244 frodo 76 psiconv_progress(lev+2,off+len,"Going to read page portrait/landscape");
245     if ((res = psiconv_parse_bool(buf,lev+2,off+len,&leng,&(*result)->landscape)))
246     goto ERROR4;
247     psiconv_debug(lev+2,off+len,"Landscape: %d",(*result)->landscape);
248     len += leng;
249    
250    
251 frodo 2 if (length)
252     *length = len;
253    
254     psiconv_progress(lev,off+len-1,"End of page section (total length: %08x)",
255     len);
256    
257     return res;
258 frodo 64
259     ERROR4:
260     psiconv_free_page_header((*result)->footer);
261     ERROR3:
262     psiconv_free_page_header((*result)->header);
263     ERROR2:
264     free (*result);
265     ERROR1:
266     psiconv_warn(lev+1,off,"Reading of Page Section failed");
267     if (length)
268     *length = 0;
269     if (!res)
270     return -PSICONV_E_NOMEM;
271     else
272     return res;
273 frodo 2 }

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