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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 351 - (hide annotations)
Wed Oct 22 19:53:40 2014 UTC (9 years, 5 months ago) by frodo
File MIME type: text/plain
File size: 26431 byte(s)
(Frodo) Update copyright year in all source files

1 frodo 2 /*
2     parse_layout.c - Part of psiconv, a PSION 5 file formats converter
3 frodo 351 Copyright (c) 1999-2014 Frodo Looijaard <frodo@frodo.looijaard.name>
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 <math.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 168 int psiconv_parse_color(const psiconv_config config,
35     const psiconv_buffer buf, int lev, psiconv_u32 off,
36 frodo 2 int *length, psiconv_color *result)
37     {
38     int res = 0;
39     int len = 0;
40    
41 frodo 168 psiconv_progress(config,lev+1,off,"Going to parse color");
42 frodo 64 if (!(*result = malloc(sizeof(**result))))
43     goto ERROR1;
44 frodo 2
45 frodo 168 (*result)->red = psiconv_read_u8(config,buf,lev+2,off+len,&res);
46 frodo 64 if (res)
47     goto ERROR2;
48 frodo 168 (*result)->green = psiconv_read_u8(config,buf,lev+2,off+len+1,&res);
49 frodo 64 if (res)
50     goto ERROR2;
51 frodo 168 (*result)->blue = psiconv_read_u8(config,buf,lev+2,off+len+2,&res);
52 frodo 64 if (res)
53     goto ERROR2;
54 frodo 2 len += 3;
55    
56 frodo 168 psiconv_debug(config,lev+2,off,"Color: red %02x, green %02x, blue %02x",
57 frodo 2 (*result)->red, (*result)->green, (*result)->blue);
58     if (length)
59     *length = len;
60    
61 frodo 168 psiconv_progress(config,lev+1,off+len-1,"End of color (total length: %08x)",len);
62 frodo 64 return 0;
63    
64     ERROR2:
65     free(*result);
66     ERROR1:
67 frodo 184 psiconv_error(config,lev+1,off,"Reading of Color failed");
68 frodo 64 if (length)
69     *length = 0;
70     if (res == 0)
71     return -PSICONV_E_NOMEM;
72     else
73     return res;
74 frodo 2 }
75    
76    
77    
78 frodo 168 int psiconv_parse_font(const psiconv_config config,
79     const psiconv_buffer buf, int lev, psiconv_u32 off,
80 frodo 2 int *length, psiconv_font *result)
81     {
82     int res = 0;
83     char *str_copy;
84 frodo 182 int len=0;
85 frodo 184 int fontlen;
86 frodo 2
87 frodo 168 psiconv_progress(config,lev+1,off,"Going to parse font");
88 frodo 64 if (!(*result = malloc(sizeof(**result))))
89     goto ERROR1;
90 frodo 2
91 frodo 184 fontlen = psiconv_read_u8(config,buf,lev+2,off,&res);
92 frodo 64 if (res)
93     goto ERROR2;
94 frodo 184 len = 1;
95 frodo 182
96 frodo 222 (*result)->name = psiconv_read_charlist(config,buf,lev+2,off+len, fontlen-1,&res);
97 frodo 184 if (res)
98     goto ERROR2;
99     len += fontlen - 1;
100    
101 frodo 182 (*result)->screenfont = psiconv_read_u8(config,buf,lev+2,off+len,&res);
102 frodo 64 if (res)
103     goto ERROR3;
104 frodo 2
105 frodo 184 if (!(str_copy = psiconv_make_printable(config,(*result)->name)))
106 frodo 64 goto ERROR3;
107    
108 frodo 182 psiconv_debug(config,lev+2,off+len,
109     "Found font `%s', displayed with screen font %02x",
110 frodo 2 str_copy,(*result)->screenfont);
111     free(str_copy);
112 frodo 182 len ++;
113    
114 frodo 2 if (length)
115     *length = len;
116    
117 frodo 182 psiconv_progress(config,lev+1,off + len - 1,
118     "End of font (total length: %08x)",len);
119 frodo 64 return 0;
120    
121     ERROR3:
122     free ((*result)->name);
123     ERROR2:
124     free (*result);
125     ERROR1:
126 frodo 184 psiconv_error(config,lev+1,off,"Reading of Font failed");
127 frodo 64 if (length)
128     *length = 0;
129     if (!res)
130     return -PSICONV_E_NOMEM;
131     else
132     return res;
133 frodo 2 }
134    
135 frodo 168 int psiconv_parse_border(const psiconv_config config,
136     const psiconv_buffer buf,int lev,psiconv_u32 off,
137 frodo 2 int *length, psiconv_border *result)
138     {
139     int res = 0;
140     int len = 0;
141     psiconv_u32 temp;
142     int leng;
143    
144 frodo 168 psiconv_progress(config,lev+1,off,"Going to parse border data");
145 frodo 64 if (!(*result = malloc(sizeof(**result)))) {
146     goto ERROR1;
147     }
148 frodo 2
149 frodo 168 psiconv_progress(config,lev+2,off+len,"Going to read border kind");
150     temp = psiconv_read_u8(config,buf,lev+2,off+len,&res);
151 frodo 64 if (res)
152     goto ERROR2;
153 frodo 2 if (temp == 0x00)
154     (*result)->kind = psiconv_border_none;
155     else if (temp == 0x01)
156     (*result)->kind = psiconv_border_solid;
157     else if (temp == 0x02)
158     (*result)->kind = psiconv_border_double;
159     else if (temp == 0x03)
160     (*result)->kind = psiconv_border_dotted;
161     else if (temp == 0x04)
162 frodo 67 (*result)->kind = psiconv_border_dashed;
163 frodo 2 else if (temp == 0x05)
164 frodo 67 (*result)->kind = psiconv_border_dotdashed;
165 frodo 2 else if (temp == 0x06)
166 frodo 67 (*result)->kind = psiconv_border_dotdotdashed;
167 frodo 2 else {
168 frodo 168 psiconv_warn(config,lev+2,off,"Unknown border kind (defaults to `none')");
169 frodo 2 (*result)->kind = psiconv_border_none;
170     }
171 frodo 168 psiconv_debug(config,lev+2,off+len,"Kind: %02x",temp);
172 frodo 2 len ++;
173    
174 frodo 168 psiconv_progress(config,lev+2,off+len,"Going to read border thickness");
175     (*result)->thickness = psiconv_read_size(config,buf,lev+2,off+len,&leng,&res);
176 frodo 64 if (res)
177     goto ERROR2;
178 frodo 84 #if 0
179     /* This seems no longer necessary to test? */
180 frodo 2 if (((*result)->kind != psiconv_border_solid) &&
181     ((*result)->kind != psiconv_border_double) &&
182     ((*result)->thickness != 0.0) &&
183     (fabs((*result)->thickness - 1/20) >= 1/1000)) {
184 frodo 168 psiconv_warn(config,lev+2,off,
185 frodo 2 "Border thickness specified for unlikely border type");
186     }
187 frodo 84 #endif
188 frodo 168 psiconv_debug(config,lev+2,off+len,"Thickness: %f",(*result)->thickness);
189 frodo 2 len += leng;
190    
191 frodo 168 psiconv_progress(config,lev+2,off+len,"Going to read the border color");
192     if ((psiconv_parse_color(config,buf,lev+2,off+len,&leng,&(*result)->color)))
193 frodo 64 goto ERROR2;
194 frodo 2 len += leng;
195    
196 frodo 168 psiconv_progress(config,lev+2,off+len,"Going to read the final unknown byte "
197 frodo 84 "(0x00 or 0x01 expected)");
198 frodo 168 temp = psiconv_read_u8(config,buf,lev+2,off + len,&res);
199 frodo 64 if (res)
200     goto ERROR3;
201 frodo 84 if ((temp != 0x01) && (temp != 0x00)) {
202 frodo 168 psiconv_warn(config,lev+2,off,"Unknown last byte in border specification");
203     psiconv_debug(config,lev+2,off+len, "Last byte: read %02x, expected %02x or %02x",
204 frodo 84 temp,0x00,0x01);
205 frodo 2 }
206     len ++;
207    
208     if (length)
209     *length = len;
210    
211 frodo 168 psiconv_progress(config,lev+1,off + len - 1,
212 frodo 2 "End of border (total length: %08x)",len);
213    
214 frodo 64 return 0;
215    
216     ERROR3:
217     psiconv_free_color((*result)->color);
218     ERROR2:
219     free (result);
220     ERROR1:
221 frodo 184 psiconv_error(config,lev+1,off,"Reading of Border failed");
222 frodo 64 if (length)
223     *length = 0;
224     if (!res)
225     return -PSICONV_E_NOMEM;
226     else
227     return res;
228 frodo 2 }
229    
230 frodo 168 int psiconv_parse_bullet(const psiconv_config config,
231     const psiconv_buffer buf,int lev,psiconv_u32 off,
232 frodo 2 int *length, psiconv_bullet *result)
233     {
234     int res = 0;
235     int len = 0;
236     int leng;
237     int bullet_length;
238    
239 frodo 64 if (!(*result = malloc(sizeof(**result))))
240     goto ERROR1;
241 frodo 2 (*result)->on = psiconv_bool_true;
242    
243 frodo 168 psiconv_progress(config,lev+1,off,"Going to parse bullet data");
244     psiconv_progress(config,lev+2,off+len,"Going to read bullet length");
245     bullet_length = psiconv_read_u8(config,buf,lev+2,off+len,&res);
246 frodo 64 if (res)
247     goto ERROR2;
248 frodo 168 psiconv_debug(config,lev+2,off+len,"Length: %02x",bullet_length);
249 frodo 2 len ++;
250    
251 frodo 168 psiconv_progress(config,lev+2,off+len,"Going to read bullet font size");
252     (*result)->font_size = psiconv_read_size(config,buf,lev+2,off+len, &leng,&res);
253 frodo 64 if (res)
254     goto ERROR2;
255 frodo 2 len +=leng;
256    
257 frodo 168 psiconv_progress(config,lev+2,off+len,"Going to read bullet character");
258 frodo 217 (*result)->character = psiconv_unicode_read_char(config,buf,lev+2,
259     off+len,&leng,&res);
260 frodo 64 if (res)
261     goto ERROR2;
262 frodo 168 psiconv_debug(config,lev+2,off+len,"Character: %02x",(*result)->character);
263 frodo 217 len += leng;
264 frodo 2
265 frodo 168 psiconv_progress(config,lev+2,off+len,"Going to read indent on/off");
266     if ((res = psiconv_parse_bool(config,buf,lev+2,off+len,&leng,&(*result)->indent)))
267 frodo 64 goto ERROR2;
268 frodo 168 psiconv_debug(config,lev+2,off+len,"Indent on: %02x",(*result)->indent);
269 frodo 2 len += leng;
270    
271 frodo 168 psiconv_progress(config,lev+2,off+len,"Going to read bullet color");
272     if ((res = psiconv_parse_color(config,buf,lev+2,off+len,&leng,&(*result)->color)))
273 frodo 64 goto ERROR2;
274 frodo 2 len += leng;
275    
276 frodo 168 psiconv_progress(config,lev+2,off+len,"Going to read bullet font");
277     if ((res = psiconv_parse_font(config,buf,lev+2,off+len,&leng,&(*result)->font)))
278 frodo 64 goto ERROR3;
279 frodo 2 len += leng;
280    
281     if (len != bullet_length + 1) {
282 frodo 168 psiconv_warn(config,lev+2,off,"Bullet data structure length mismatch");
283     psiconv_debug(config,lev+2,off,"Length: specified %02x, found %02x",
284 frodo 2 bullet_length,len-1);
285     }
286    
287 frodo 168 psiconv_progress(config,lev+1,off + len - 1,
288 frodo 2 "End of bullet data (total length: %08x)",len);
289    
290     if (length)
291     *length = len;
292 frodo 65 return 0;
293 frodo 64
294     ERROR3:
295     psiconv_free_color((*result)->color);
296     ERROR2:
297     free (result);
298     ERROR1:
299 frodo 184 psiconv_error(config,lev+1,off,"Reading of Bullet failed");
300 frodo 64 if (length)
301     *length = 0;
302     if (!res)
303     return -PSICONV_E_NOMEM;
304     else
305     return res;
306 frodo 2 }
307    
308 frodo 168 int psiconv_parse_tab(const psiconv_config config,
309     const psiconv_buffer buf, int lev, psiconv_u32 off,
310 frodo 2 int *length, psiconv_tab *result)
311     {
312     int res = 0;
313     int len = 0;
314     int leng;
315     psiconv_u8 temp;
316    
317 frodo 168 psiconv_progress(config,lev+1,off,"Going to parse tab");
318 frodo 64 if (!(*result = malloc(sizeof(**result))))
319     goto ERROR1;
320 frodo 2
321 frodo 168 psiconv_progress(config,lev+2,off,"Going to read tab location");
322     (*result)->location = psiconv_read_length(config,buf,lev+2,off+len,&leng,&res);
323 frodo 64 if (res)
324     goto ERROR2;
325 frodo 2 len += leng;
326    
327 frodo 168 psiconv_progress(config,lev+2,off+len,"Going to read the tab kind");
328     temp = psiconv_read_u8(config,buf,lev+2,off+len,&res);
329 frodo 64 if (res)
330     goto ERROR2;
331 frodo 2 if (temp == 1)
332     (*result)->kind = psiconv_tab_left;
333     else if (temp == 2)
334     (*result)->kind = psiconv_tab_centre;
335     else if (temp == 3)
336     (*result)->kind = psiconv_tab_right;
337     else {
338 frodo 168 psiconv_warn(config,lev+2,off+len,"Unknown tab kind argument");
339     psiconv_debug(config,lev+2,off+len,"Kind found: %02x (defaulted to left tab)",
340 frodo 2 temp);
341     (*result)->kind = psiconv_tab_left;
342     }
343 frodo 168 psiconv_debug(config,lev+2,off+len,"Kind: %02x",temp);
344 frodo 2 len ++;
345    
346     if (length)
347     *length = len;
348    
349 frodo 168 psiconv_progress(config,lev+1,off+len-1,"End of tab (total length: %08x)",len);
350 frodo 64 return 0;
351 frodo 2
352 frodo 64 ERROR2:
353     free (result);
354     ERROR1:
355 frodo 184 psiconv_error(config,lev+1,off,"Reading of Tab failed");
356 frodo 64 if (length)
357     *length = 0;
358     if (!res)
359     return -PSICONV_E_NOMEM;
360     else
361     return res;
362 frodo 2 }
363    
364 frodo 168 int psiconv_parse_paragraph_layout_list(const psiconv_config config,
365     const psiconv_buffer buf, int lev,
366 frodo 2 psiconv_u32 off, int *length,
367     psiconv_paragraph_layout result)
368     {
369     int res=0;
370     int len=0;
371     int list_length,leng,nr;
372     psiconv_u8 id;
373     psiconv_u32 temp;
374 frodo 64 psiconv_tab temp_tab;
375     psiconv_color temp_color;
376     psiconv_border temp_border;
377     psiconv_bullet temp_bullet;
378 frodo 2
379 frodo 168 psiconv_progress(config,lev+1,off,"Going to read paragraph layout list");
380 frodo 2
381 frodo 168 psiconv_progress(config,lev+2,off,"Going to read the list length");
382     list_length = psiconv_read_u32(config,buf,lev+2,off + len,&res);
383 frodo 64 if (res)
384     goto ERROR1;
385 frodo 168 psiconv_debug(config,lev+2,off,"Length in bytes: %08x",list_length);
386 frodo 2 len += 4;
387    
388     nr = 0;
389     while(len - 4 < list_length) {
390 frodo 168 psiconv_progress(config,lev+2,off+len,"Going to read element %d",nr);
391     psiconv_progress(config,lev+3,off+len,"Going to read the element id");
392     id = psiconv_read_u8(config,buf,lev+2,off+len,&res);
393 frodo 64 if (res)
394     goto ERROR1;
395 frodo 168 psiconv_debug(config,lev+3,off+len,"Id: %02x",id);
396 frodo 2 len ++;
397     switch(id) {
398     case 0x01:
399 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read background color");
400     if ((res = psiconv_parse_color(config,buf,lev+3,off+len,&leng,&temp_color)))
401 frodo 64 goto ERROR1;
402 frodo 2 psiconv_free_color(result->back_color);
403 frodo 64 result->back_color = temp_color;
404 frodo 2 len += leng;
405     break;
406     case 0x02:
407 frodo 168 psiconv_progress(config,lev+3,off+len ,"Going to read indent left");
408     result->indent_left = psiconv_read_length(config,buf,lev+3,off+len,&leng,&res);
409 frodo 64 if (res)
410     goto ERROR1;
411 frodo 2 len += leng;
412     break;
413     case 0x03:
414 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read indent right");
415     result->indent_right = psiconv_read_length(config,buf,lev+2,off+len,&leng,
416 frodo 64 &res);
417     if (res)
418     goto ERROR1;
419 frodo 2 len += leng;
420     break;
421     case 0x04:
422 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read indent left first line");
423     result->indent_first = psiconv_read_length(config,buf,lev+2,off+len, &leng,
424 frodo 64 &res);
425     if (res)
426     goto ERROR1;
427 frodo 2 len += leng;
428     break;
429     case 0x05:
430 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read horizontal justify");
431     temp = psiconv_read_u8(config,buf,lev+3,off+len,&res);
432 frodo 64 if (res)
433     goto ERROR1;
434 frodo 2 if (temp == 0x00)
435     result->justify_hor = psiconv_justify_left;
436     else if (temp == 0x01)
437     result->justify_hor = psiconv_justify_centre;
438     else if (temp == 0x02)
439     result->justify_hor = psiconv_justify_right;
440     else if (temp == 0x03)
441     result->justify_hor = psiconv_justify_full;
442     else {
443 frodo 168 psiconv_warn(config,lev+3,off+len, "Unknown horizontal justify argument "
444 frodo 2 "in paragraph layout codes list");
445 frodo 64 result->justify_hor = psiconv_justify_left;
446 frodo 2 }
447 frodo 168 psiconv_debug(config,lev+3,off+len,"Justify: %02x",temp);
448 frodo 2 len ++;
449     break;
450     case 0x06:
451 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read vertical justify");
452     temp = psiconv_read_u8(config,buf,lev+3,off+len,&res);
453 frodo 64 if (res)
454     goto ERROR1;
455 frodo 2 if (temp == 0x00)
456     result->justify_ver = psiconv_justify_top;
457     else if (temp == 0x01)
458     result->justify_ver = psiconv_justify_middle;
459     else if (temp == 0x02)
460     result->justify_ver = psiconv_justify_bottom;
461     else {
462 frodo 168 psiconv_warn(config,lev+3,off+len, "Unknown vertical justify argument "
463 frodo 2 "in paragraph layout codes list");
464 frodo 64 result->justify_ver = psiconv_justify_bottom;
465 frodo 2 }
466 frodo 168 psiconv_debug(config,lev+3,off+len,"Justify: %02x",temp);
467 frodo 2 len ++;
468 frodo 110 break;
469 frodo 2 case 0x07:
470 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read linespacing distance");
471     result->linespacing = psiconv_read_size(config,buf,lev+3,off+len,&leng,&res);
472 frodo 64 if (res)
473     goto ERROR1;
474 frodo 2 len += leng;
475     break;
476     case 0x08:
477 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read linespacing exact");
478     if ((res = psiconv_parse_bool(config,buf,lev+3,off+len,&leng,
479 frodo 67 &result->linespacing_exact)))
480 frodo 64 goto ERROR1;
481 frodo 2 len += leng;
482     break;
483     case 0x09:
484 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read top space");
485     result->space_above = psiconv_read_size(config,buf,lev+3,off+len,&leng,&res);
486 frodo 64 if (res)
487     goto ERROR1;
488 frodo 2 len += leng;
489     break;
490     case 0x0a:
491 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read bottom space");
492     result->space_below = psiconv_read_size(config,buf,lev+3,off+len,&leng,&res);
493 frodo 64 if (res)
494     goto ERROR1;
495 frodo 2 len += leng;
496     break;
497     case 0x0b:
498 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read on one page");
499     if ((res = psiconv_parse_bool(config,buf,lev+3,off+len,&leng,
500 frodo 67 &result->keep_together)))
501 frodo 64 goto ERROR1;
502 frodo 2 len += leng;
503     break;
504     case 0x0c:
505 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read together with");
506     if ((res = psiconv_parse_bool(config,buf,lev+3,off+len,&leng,
507 frodo 67 &result->keep_with_next)))
508 frodo 64 goto ERROR1;
509 frodo 2 len += leng;
510     break;
511     case 0x0d:
512 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read on next page");
513     if ((res = psiconv_parse_bool(config,buf,lev+3,off+len,&leng,
514 frodo 64 &result->on_next_page)))
515     goto ERROR1;
516 frodo 2 len += leng;
517     break;
518     case 0x0e:
519 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read no widow protection");
520     if ((res = psiconv_parse_bool(config,buf,lev+3,off+len,&leng,
521 frodo 64 &result->no_widow_protection)))
522     goto ERROR1;
523 frodo 2 len += leng;
524     break;
525 frodo 104 case 0x0f:
526 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read wrap to fit cell limits");
527     if ((res = psiconv_parse_bool(config,buf,lev+3,off+len,&leng,
528 frodo 104 &result->wrap_to_fit_cell)))
529     goto ERROR1;
530     len += leng;
531     break;
532 frodo 2 case 0x10:
533 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read border distance to text");
534     result->border_distance = psiconv_read_length(config,buf,lev+3,
535 frodo 64 off+len,&leng,&res);
536     if (res)
537     goto ERROR1;
538 frodo 2 len += leng;
539     break;
540     case 0x11:
541 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read top border");
542     if ((res = psiconv_parse_border(config,buf,lev+3,off+len,&leng,&temp_border)))
543 frodo 64 goto ERROR1;
544 frodo 2 psiconv_free_border(result->top_border);
545 frodo 64 result->top_border = temp_border;
546 frodo 2 len += leng;
547     break;
548     case 0x12:
549 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read bottom border");
550     if ((res = psiconv_parse_border(config,buf,lev+3,off+len,&leng,&temp_border)))
551 frodo 64 goto ERROR1;
552 frodo 2 psiconv_free_border(result->bottom_border);
553 frodo 64 result->bottom_border = temp_border;
554 frodo 2 len += leng;
555     break;
556     case 0x13:
557 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read left border");
558     if ((res = psiconv_parse_border(config,buf,lev+3,off+len,&leng,&temp_border)))
559 frodo 64 goto ERROR1;
560 frodo 2 psiconv_free_border(result->left_border);
561 frodo 64 result->left_border = temp_border;
562 frodo 2 len += leng;
563     break;
564     case 0x14:
565 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read right border");
566     if ((res = psiconv_parse_border(config,buf,lev+3,off+len,&leng,&temp_border)))
567 frodo 64 goto ERROR1;
568 frodo 2 psiconv_free_border(result->right_border);
569 frodo 64 result->right_border = temp_border;
570 frodo 2 len += leng;
571     break;
572     case 0x15:
573 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read bullet");
574     if ((res = psiconv_parse_bullet(config,buf,lev+3,off+len,&leng,&temp_bullet)))
575 frodo 64 goto ERROR1;
576 frodo 2 psiconv_free_bullet(result->bullet);
577 frodo 64 result->bullet = temp_bullet;
578 frodo 2 len += leng;
579     break;
580     case 0x16:
581 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read standard tabs");
582     result->tabs->normal = psiconv_read_length(config,buf,lev+3,off+len,&leng,
583 frodo 64 &res);
584     if (res)
585     goto ERROR1;
586 frodo 2 len += leng;
587     break;
588     case 0x17:
589 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read extra tab");
590     if ((res = psiconv_parse_tab(config,buf,lev+3,off+len,&leng,&temp_tab)))
591 frodo 64 goto ERROR1;
592     if ((res = psiconv_list_add(result->tabs->extras,temp_tab))) {
593     psiconv_free_tab(temp_tab);
594     goto ERROR1;
595     }
596 frodo 143 psiconv_free_tab(temp_tab);
597 frodo 2 len += leng;
598     break;
599     default:
600 frodo 168 psiconv_warn(config,lev+3,off+len,
601 frodo 2 "Unknown code in paragraph layout codes list");
602 frodo 168 psiconv_debug(config,lev+3,off+len,"Code: %02x",id);
603 frodo 2 len ++;
604     break;
605     }
606     nr ++;
607     }
608    
609     if (len - 4 != list_length) {
610 frodo 184 psiconv_error(config,lev+2,off+len,
611     "Read past end of paragraph layout codes list. I probably lost track "
612 frodo 2 "somewhere!");
613 frodo 168 psiconv_debug(config,lev+2,off+len,"Read %d characters instead of %d",
614 frodo 2 len-4,list_length);
615 frodo 64 res = PSICONV_E_PARSE;
616     goto ERROR1;
617 frodo 2 }
618    
619     len = list_length + 4;
620    
621 frodo 168 psiconv_progress(config,lev+1,off+len,
622 frodo 2 "End of paragraph layout list (total length: %08x)",len);
623    
624     if (length)
625     *length = len;
626 frodo 64 return 0;
627    
628     ERROR1:
629 frodo 184 psiconv_error(config,lev+1,off,"Reading of paragraph_layout_list failed");
630 frodo 64 if (length)
631     *length = 0;
632     if (!res)
633     return -PSICONV_E_NOMEM;
634     else
635     return res;
636 frodo 2 }
637    
638 frodo 168 int psiconv_parse_character_layout_list(const psiconv_config config,
639     const psiconv_buffer buf, int lev,
640 frodo 2 psiconv_u32 off, int *length,
641     psiconv_character_layout result)
642     {
643     int res=0;
644     int len=0;
645     int list_length,leng,nr;
646     psiconv_u8 id;
647     psiconv_u32 temp;
648 frodo 64 psiconv_color temp_color;
649     psiconv_font temp_font;
650 frodo 2
651 frodo 168 psiconv_progress(config,lev+1,off,"Going to read character layout codes");
652 frodo 2
653 frodo 168 psiconv_progress(config,lev+2,off,"Going to read the list length");
654     list_length = psiconv_read_u32(config,buf,lev+2,off + len,&res);
655 frodo 64 if (res)
656     goto ERROR1;
657 frodo 168 psiconv_debug(config,lev+2,off,"Length in bytes: %08x",list_length);
658 frodo 2 len += 4;
659    
660     nr = 0;
661     while(len-4 < list_length) {
662 frodo 168 psiconv_progress(config,lev+2,off+len,"Going to read element %d",nr);
663     psiconv_progress(config,lev+3,off+len,"Going to read the element id");
664     id = psiconv_read_u8(config,buf,lev+2,off+len,&res);
665 frodo 64 if (res)
666     goto ERROR1;
667 frodo 168 psiconv_debug(config,lev+3,off+len,"Id: %02x",id);
668 frodo 2 len ++;
669     switch(id) {
670 frodo 86 case 0x18:
671 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to skip an unknown setting");
672 frodo 86 len ++;
673     break;
674 frodo 2 case 0x19:
675 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read text color");
676     if ((res = psiconv_parse_color(config,buf,lev+3,off+len, &leng,&temp_color)))
677 frodo 64 goto ERROR1;
678 frodo 2 psiconv_free_color(result->color);
679 frodo 64 result->color = temp_color;
680 frodo 2 len += leng;
681     break;
682     case 0x1a:
683 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read background color (?)");
684     if ((res = psiconv_parse_color(config,buf,lev+2,off+len, &leng,&temp_color)))
685 frodo 64 goto ERROR1;
686 frodo 2 psiconv_free_color(result->back_color);
687 frodo 64 result->back_color = temp_color;
688 frodo 2 len += leng;
689     break;
690 frodo 86 case 0x1b:
691 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to skip an unknown setting");
692 frodo 86 len ++;
693     break;
694 frodo 2 case 0x1c:
695 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read font size");
696     result->font_size = psiconv_read_size(config,buf,lev+3,off+len,&leng,&res);
697 frodo 64 if (res)
698     goto ERROR1;
699 frodo 2 len += leng;
700     break;
701     case 0x1d:
702 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read italic");
703     if ((res = psiconv_parse_bool(config,buf,lev+3,off+len,&leng,&result->italic)))
704 frodo 64 goto ERROR1;
705 frodo 2 len += leng;
706     break;
707     case 0x1e:
708 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read bold");
709     if ((res = psiconv_parse_bool(config,buf,lev+3,off+len,&leng,&result->bold)))
710 frodo 64 goto ERROR1;
711 frodo 2 len += leng;
712     break;
713     case 0x1f:
714 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read super_sub");
715     temp = psiconv_read_u8(config,buf,lev+3,off+len,&res);
716 frodo 64 if (res)
717     goto ERROR1;
718 frodo 2 if (temp == 0x00)
719     result->super_sub = psiconv_normalscript;
720     else if (temp == 0x01)
721     result->super_sub = psiconv_superscript;
722     else if (temp == 0x02)
723     result->super_sub = psiconv_subscript;
724     else {
725 frodo 168 psiconv_warn(config,lev+3,off+len,
726 frodo 2 "Unknown super_sub argument in character layout codes list");
727     }
728 frodo 168 psiconv_debug(config,lev+3,off+len,"Super_sub: %02x",temp);
729 frodo 2 len ++;
730     break;
731     case 0x20:
732 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read underline");
733     if ((res = psiconv_parse_bool(config,buf,lev+3,off+len,&leng,
734 frodo 64 &result->underline)))
735     goto ERROR1;
736 frodo 2 len += leng;
737     break;
738     case 0x21:
739 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read strikethrough");
740     if ((res = psiconv_parse_bool(config,buf,lev+3,off+len,&leng,
741 frodo 67 &result->strikethrough)))
742 frodo 64 goto ERROR1;
743 frodo 2 len += leng;
744     break;
745     case 0x22:
746 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to read font");
747     if ((res = psiconv_parse_font(config,buf,lev+3,off+len, &leng, &temp_font)))
748 frodo 64 goto ERROR1;
749 frodo 2 psiconv_free_font(result->font);
750 frodo 64 result->font = temp_font;
751 frodo 2 len += leng;
752     break;
753 frodo 86 case 0x23:
754 frodo 168 psiconv_progress(config,lev+3,off+len,"Going to skip an unknown setting");
755 frodo 86 len ++;
756     break;
757 frodo 27 case 0x24:
758 frodo 168 psiconv_progress(config,lev+3,off+len,
759 frodo 27 "Going to read unknown code 0x24 (%02x expected)", 0);
760 frodo 168 temp = psiconv_read_u8(config,buf,lev+3,off+len,&res);
761 frodo 64 if (res)
762     goto ERROR1;
763 frodo 27 if (temp != 0) {
764 frodo 168 psiconv_warn(config,lev+3,off+len,
765 frodo 27 "Unknown code 0x24 value != 0x0 (0x%02x)", temp);
766     }
767     len ++;
768     break;
769 frodo 2 default:
770 frodo 168 psiconv_warn(config,lev+3,off+len,"Unknown code in character layout list");
771     psiconv_debug(config,lev+3,off+len,"Code: %02x",id);
772 frodo 2 len ++;
773     break;
774     }
775     nr ++;
776     }
777    
778     if (len - 4 != list_length) {
779 frodo 184 psiconv_error(config,lev+2,off+len,
780     "Read past end of character layout codes list. I probably lost track "
781 frodo 2 "somewhere!");
782 frodo 168 psiconv_debug(config,lev+2,off+len,"Read %d characters instead of %d",
783 frodo 2 len-4,list_length);
784 frodo 64 res = PSICONV_E_PARSE;
785     goto ERROR1;
786 frodo 2 }
787    
788     len = list_length + 4;
789    
790 frodo 168 psiconv_progress(config,lev+1,off+len,
791 frodo 2 "End of character layout list (total length: %08x)",len);
792    
793     if (length)
794     *length = len;
795     return res;
796 frodo 64
797     ERROR1:
798 frodo 184 psiconv_error(config,lev+1,off,"Reading of character_layout_list failed");
799 frodo 64 if (length)
800     *length = 0;
801     if (!res)
802     return -PSICONV_E_NOMEM;
803     else
804     return res;
805 frodo 2 }

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