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

Diff of /psiconv/trunk/lib/psiconv/parse_page.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.63  
changed lines
  Added in v.71

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