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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 182 - (hide annotations)
Sun Jan 4 22:07:02 2004 UTC (20 years, 3 months ago) by frodo
File MIME type: text/plain
File size: 15905 byte(s)
(Frodo) Move fontnames to psiconv_string type

1 frodo 72 /*
2     generate_layout.c - Part of psiconv, a PSION 5 file formats converter
3     Copyright (c) 2000 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 frodo 168 #include <string.h>
21    
22 frodo 72 #include "config.h"
23     #include "compat.h"
24    
25     #include "generate_routines.h"
26     #include "error.h"
27    
28 frodo 142 #ifdef DMALLOC
29     #include <dmalloc.h>
30     #endif
31    
32    
33 frodo 168 int psiconv_write_color(const psiconv_config config, psiconv_buffer buf, const psiconv_color value)
34 frodo 72 {
35     int res;
36     if (!value) {
37 frodo 168 psiconv_warn(config,0,psiconv_buffer_length(buf),"Null color");
38 frodo 72 return -PSICONV_E_GENERATE;
39     }
40 frodo 168 if ((res = psiconv_write_u8(config,buf,value->red)))
41 frodo 72 return res;
42 frodo 168 if ((res = psiconv_write_u8(config,buf,value->green)))
43 frodo 72 return res;
44 frodo 168 return psiconv_write_u8(config,buf,value->blue);
45 frodo 72 }
46    
47 frodo 168 int psiconv_write_font(const psiconv_config config, psiconv_buffer buf, const psiconv_font value)
48 frodo 72 {
49 frodo 182 int res;
50 frodo 72 if (!value) {
51 frodo 168 psiconv_warn(config,0,psiconv_buffer_length(buf),"Null font");
52 frodo 72 return -PSICONV_E_GENERATE;
53     }
54 frodo 182 if ((res = psiconv_write_short_string(config,buf,value->name)))
55 frodo 72 return res;
56 frodo 168 return psiconv_write_u8(config,buf,value->screenfont);
57 frodo 72 }
58    
59 frodo 168 int psiconv_write_border(const psiconv_config config, psiconv_buffer buf, const psiconv_border value)
60 frodo 72 {
61     int res;
62    
63     if (!value) {
64 frodo 168 psiconv_warn(config,0,psiconv_buffer_length(buf),"Null border");
65 frodo 72 return -PSICONV_E_GENERATE;
66     }
67     if (value->kind > psiconv_border_dotdotdashed)
68 frodo 168 psiconv_warn(config,0,psiconv_buffer_length(buf),
69 frodo 72 "Unknown border kind (%d); assuming none",value->kind);
70 frodo 168 if ((res =psiconv_write_u8(config,buf,value->kind == psiconv_border_none?0:
71 frodo 72 value->kind == psiconv_border_solid?1:
72     value->kind == psiconv_border_double?2:
73     value->kind == psiconv_border_dotted?3:
74     value->kind == psiconv_border_dashed?4:
75     value->kind == psiconv_border_dotdashed?5:
76     value->kind == psiconv_border_dotdotdashed?6:
77     0)))
78     return res;
79 frodo 168 if ((res = psiconv_write_size(config,buf,(value->kind == psiconv_border_solid) ||
80 frodo 72 (value->kind == psiconv_border_double) ?
81     value->thickness:1.0/20.0)))
82     return res;
83 frodo 168 if ((res = psiconv_write_color(config,buf,value->color)))
84 frodo 72 return res;
85     // Unknown byte
86 frodo 168 return psiconv_write_u8(config,buf,1);
87 frodo 72 }
88    
89 frodo 168 int psiconv_write_bullet(const psiconv_config config, psiconv_buffer buf, const psiconv_bullet value)
90 frodo 72 {
91     int res;
92     psiconv_buffer extra_buf;
93     if (!value) {
94 frodo 168 psiconv_warn(config,0,psiconv_buffer_length(buf),"Null bullet");
95 frodo 72 return -PSICONV_E_GENERATE;
96     }
97    
98 frodo 80 if (!(extra_buf = psiconv_buffer_new()))
99 frodo 72 return -PSICONV_E_NOMEM;
100 frodo 168 if ((res = psiconv_write_size(config,extra_buf,value->font_size)))
101 frodo 72 goto ERROR;
102 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,value->character)))
103 frodo 72 goto ERROR;
104 frodo 168 if ((res = psiconv_write_bool(config,extra_buf,value->indent)))
105 frodo 72 goto ERROR;
106 frodo 168 if ((res = psiconv_write_color(config,extra_buf,value->color)))
107 frodo 72 goto ERROR;
108 frodo 168 if ((res = psiconv_write_font(config,extra_buf,value->font)))
109 frodo 72 goto ERROR;
110    
111 frodo 168 if ((res = psiconv_write_u8(config,buf,psiconv_buffer_length(extra_buf))))
112 frodo 72 goto ERROR;
113 frodo 79 res = psiconv_buffer_concat(buf,extra_buf);
114 frodo 72
115     ERROR:
116 frodo 79 psiconv_buffer_free(extra_buf);
117 frodo 72 return res;
118     }
119    
120 frodo 168 int psiconv_write_tab(const psiconv_config config, psiconv_buffer buf,psiconv_tab value)
121 frodo 72 {
122     int res;
123     if (!value) {
124 frodo 168 psiconv_warn(config,0,psiconv_buffer_length(buf),"Null tab");
125 frodo 72 return -PSICONV_E_GENERATE;
126     }
127 frodo 168 if ((res = psiconv_write_length(config,buf,value->location)))
128 frodo 72 return res;
129     if ((value->kind != psiconv_tab_left) &&
130     (value->kind != psiconv_tab_right) &&
131     (value->kind != psiconv_tab_centre))
132 frodo 168 psiconv_warn(config,0,psiconv_buffer_length(buf),
133 frodo 72 "Unknown tab kind (%d); assuming left",value->kind);
134 frodo 168 return psiconv_write_u8(config,buf, value->kind == psiconv_tab_right?2:
135 frodo 72 value->kind == psiconv_tab_centre?3:1);
136     }
137    
138 frodo 168 int psiconv_write_paragraph_layout_list(const psiconv_config config,
139     psiconv_buffer buf,
140 frodo 72 psiconv_paragraph_layout value,
141     psiconv_paragraph_layout base)
142     {
143 frodo 78 int res,i;
144 frodo 72 psiconv_buffer extra_buf;
145 frodo 78 psiconv_tab tab;
146 frodo 72
147     if (!value) {
148 frodo 168 psiconv_warn(config,0,psiconv_buffer_length(buf),"Null paragraph layout list");
149 frodo 72 return -PSICONV_E_GENERATE;
150     }
151 frodo 80 if (!(extra_buf = psiconv_buffer_new()))
152 frodo 72 return -PSICONV_E_NOMEM;
153    
154 frodo 78 if (!base || psiconv_compare_color(base->back_color,value->back_color)) {
155 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x01)))
156 frodo 72 goto ERROR;
157 frodo 168 if ((res = psiconv_write_color(config,extra_buf,value->back_color)))
158 frodo 72 goto ERROR;
159     }
160    
161     if (!base || (value->indent_left != base->indent_left)) {
162 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x02)))
163 frodo 72 goto ERROR;
164 frodo 168 if ((res = psiconv_write_length(config,extra_buf,value->indent_left)))
165 frodo 72 goto ERROR;
166     }
167    
168     if (!base || (value->indent_right != base->indent_right)) {
169 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x03)))
170 frodo 72 goto ERROR;
171 frodo 168 if ((res = psiconv_write_length(config,extra_buf,value->indent_right)))
172 frodo 72 goto ERROR;
173     }
174    
175     if (!base || (value->indent_first != base->indent_first)) {
176 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x04)))
177 frodo 72 goto ERROR;
178 frodo 168 if ((res = psiconv_write_length(config,extra_buf,value->indent_first)))
179 frodo 72 goto ERROR;
180     }
181    
182     if (!base || (value->justify_hor != base->justify_hor)) {
183 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x05)))
184 frodo 72 goto ERROR;
185     if ((value->justify_hor < psiconv_justify_left) ||
186     (value->justify_hor > psiconv_justify_full))
187 frodo 168 psiconv_warn(config,0,psiconv_buffer_length(buf),
188 frodo 72 "Unknown horizontal justify (%d); assuming left",
189     value->justify_hor);
190 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,
191 frodo 72 value->justify_hor == psiconv_justify_centre?1:
192     value->justify_hor == psiconv_justify_right?2:
193     value->justify_hor == psiconv_justify_full?3:0)))
194     goto ERROR;
195     }
196    
197     if (!base || (value->justify_ver != base->justify_ver)) {
198 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x06)))
199 frodo 72 goto ERROR;
200     if ((value->justify_ver < psiconv_justify_top) ||
201     (value->justify_ver > psiconv_justify_bottom))
202 frodo 168 psiconv_warn(config,0,psiconv_buffer_length(buf),
203 frodo 72 "Unknown vertical justify (%d); assuming middle",
204     value->justify_ver);
205 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,
206 frodo 72 value->justify_ver == psiconv_justify_centre?1:
207     value->justify_ver == psiconv_justify_right?2:0)))
208     goto ERROR;
209     }
210    
211     if (!base || (value->linespacing != base->linespacing)) {
212 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x07)))
213 frodo 72 goto ERROR;
214 frodo 168 if ((res = psiconv_write_size(config,extra_buf,value->linespacing)))
215 frodo 72 goto ERROR;
216     }
217    
218     if (!base || (value->linespacing_exact != base->linespacing_exact)) {
219 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x08)))
220 frodo 72 goto ERROR;
221 frodo 168 if ((res = psiconv_write_bool(config,extra_buf,value->linespacing_exact)))
222 frodo 72 goto ERROR;
223     }
224    
225     if (!base || (value->space_above != base->space_above)) {
226 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x09)))
227 frodo 72 goto ERROR;
228 frodo 168 if ((res = psiconv_write_size(config,extra_buf,value->space_above)))
229 frodo 72 goto ERROR;
230     }
231    
232     if (!base || (value->space_below != base->space_below)) {
233 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x0a)))
234 frodo 72 goto ERROR;
235 frodo 168 if ((res = psiconv_write_size(config,extra_buf,value->space_below)))
236 frodo 72 goto ERROR;
237     }
238    
239     if (!base || (value->keep_together != base->keep_together)) {
240 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x0b)))
241 frodo 72 goto ERROR;
242 frodo 168 if ((res = psiconv_write_bool(config,extra_buf,value->keep_together)))
243 frodo 72 goto ERROR;
244     }
245    
246     if (!base || (value->keep_with_next != base->keep_with_next)) {
247 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x0c)))
248 frodo 72 goto ERROR;
249 frodo 168 if ((res = psiconv_write_bool(config,extra_buf,value->keep_with_next)))
250 frodo 72 goto ERROR;
251     }
252    
253     if (!base || (value->on_next_page != base->on_next_page)) {
254 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x0d)))
255 frodo 72 goto ERROR;
256 frodo 168 if ((res = psiconv_write_bool(config,extra_buf,value->on_next_page)))
257 frodo 72 goto ERROR;
258     }
259    
260     if (!base || (value->no_widow_protection != base->no_widow_protection)) {
261 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x0e)))
262 frodo 72 goto ERROR;
263 frodo 168 if ((res = psiconv_write_bool(config,extra_buf,value->no_widow_protection)))
264 frodo 72 goto ERROR;
265     }
266    
267 frodo 104 if (!base || (value->wrap_to_fit_cell != base->wrap_to_fit_cell)) {
268 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x0f)))
269 frodo 104 goto ERROR;
270 frodo 168 if ((res = psiconv_write_bool(config,extra_buf,value->wrap_to_fit_cell)))
271 frodo 104 goto ERROR;
272     }
273    
274 frodo 72 if (!base || (value->border_distance != base->border_distance)) {
275 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x10)))
276 frodo 72 goto ERROR;
277 frodo 168 if ((res = psiconv_write_length(config,extra_buf,value->border_distance)))
278 frodo 72 goto ERROR;
279     }
280    
281 frodo 78 if (!base || psiconv_compare_border(value->top_border,base->top_border)) {
282 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x11)))
283 frodo 72 goto ERROR;
284 frodo 168 if ((res = psiconv_write_border(config,extra_buf,value->top_border)))
285 frodo 72 goto ERROR;
286     }
287    
288 frodo 78 if (!base || psiconv_compare_border(value->bottom_border,
289     base->bottom_border)) {
290 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x12)))
291 frodo 72 goto ERROR;
292 frodo 168 if ((res = psiconv_write_border(config,extra_buf,value->bottom_border)))
293 frodo 72 goto ERROR;
294     }
295    
296 frodo 78 if (!base || psiconv_compare_border(value->left_border,
297     base->left_border)) {
298 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x13)))
299 frodo 72 goto ERROR;
300 frodo 168 if ((res = psiconv_write_border(config,extra_buf,value->left_border)))
301 frodo 72 goto ERROR;
302     }
303    
304 frodo 78 if (!base || psiconv_compare_border(value->right_border,
305     base->right_border)) {
306 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x14)))
307 frodo 72 goto ERROR;
308 frodo 168 if ((res = psiconv_write_border(config,extra_buf,value->right_border)))
309 frodo 72 goto ERROR;
310     }
311    
312 frodo 78 if (!base || psiconv_compare_bullet(value->bullet,
313     base->bullet)) {
314 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x15)))
315 frodo 72 goto ERROR;
316 frodo 168 if ((res = psiconv_write_bullet(config,extra_buf,value->bullet)))
317 frodo 72 goto ERROR;
318     }
319    
320     if (!value->tabs || !value->tabs->extras) {
321 frodo 168 psiconv_warn(config,0,psiconv_buffer_length(buf),"Null tabs");
322 frodo 72 res = -PSICONV_E_GENERATE;
323     goto ERROR;
324     }
325 frodo 78
326 frodo 72 /* It is not entirely clear how tabs are inherited. For now, I assume
327     if there is any difference at all, we will have to generate both
328     the normal tab-interval, and all specific tabs */
329 frodo 78 if (!base || psiconv_compare_all_tabs(value->tabs,base->tabs)) {
330 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x16)))
331 frodo 72 goto ERROR;
332 frodo 168 if ((res = psiconv_write_length(config,extra_buf,value->tabs->normal)))
333 frodo 72 goto ERROR;
334     for (i = 0; i < psiconv_list_length(value->tabs->extras); i++) {
335 frodo 78 if (!(tab = psiconv_list_get(value->tabs->extras,i))) {
336 frodo 168 psiconv_warn(config,0,psiconv_buffer_length(buf),"Massive memory corruption");
337 frodo 72 res = -PSICONV_E_NOMEM;
338     goto ERROR;
339     }
340 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x17)))
341 frodo 72 goto ERROR;
342 frodo 168 if ((res = psiconv_write_tab(config,extra_buf,tab)))
343 frodo 72 goto ERROR;
344     }
345     }
346    
347 frodo 168 if ((res = psiconv_write_u32(config,buf,psiconv_buffer_length(extra_buf))))
348 frodo 76 goto ERROR;
349    
350 frodo 79 res = psiconv_buffer_concat(buf,extra_buf);
351 frodo 72
352     ERROR:
353 frodo 79 psiconv_buffer_free(extra_buf);
354 frodo 72 return res;
355     }
356    
357 frodo 168 int psiconv_write_character_layout_list(const psiconv_config config,
358     psiconv_buffer buf,
359 frodo 72 psiconv_character_layout value,
360     psiconv_character_layout base)
361     {
362     int res;
363     psiconv_buffer extra_buf;
364     if (!value) {
365 frodo 168 psiconv_warn(config,0,psiconv_buffer_length(buf),"Null character layout list");
366 frodo 72 return -PSICONV_E_GENERATE;
367     }
368 frodo 80 if (!(extra_buf = psiconv_buffer_new()))
369 frodo 72 return -PSICONV_E_NOMEM;
370    
371 frodo 78 if (!base || psiconv_compare_color(base->color,value->color)) {
372 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x19)))
373 frodo 72 goto ERROR;
374 frodo 168 if ((res = psiconv_write_color(config,extra_buf,value->color)))
375 frodo 72 goto ERROR;
376     }
377    
378 frodo 78 if (!base || psiconv_compare_color(base->back_color,value->back_color)) {
379 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x1a)))
380 frodo 72 goto ERROR;
381 frodo 168 if ((res = psiconv_write_color(config,extra_buf,value->back_color)))
382 frodo 72 goto ERROR;
383     }
384    
385     if (!base || (value->font_size != base->font_size)) {
386 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x1c)))
387 frodo 72 goto ERROR;
388 frodo 168 if ((res = psiconv_write_size(config,extra_buf,value->font_size)))
389 frodo 72 goto ERROR;
390     }
391    
392     if (!base || (value->italic != base->italic)) {
393 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x1d)))
394 frodo 72 goto ERROR;
395 frodo 168 if ((res = psiconv_write_bool(config,extra_buf,value->italic)))
396 frodo 72 goto ERROR;
397     }
398    
399     if (!base || (value->bold != base->bold)) {
400 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x1e)))
401 frodo 72 goto ERROR;
402 frodo 168 if ((res = psiconv_write_bool(config,extra_buf,value->bold)))
403 frodo 72 goto ERROR;
404     }
405    
406     if (!base || (value->super_sub != base->super_sub)) {
407     if ((value->super_sub != psiconv_superscript) &&
408     (value->super_sub != psiconv_subscript) &&
409     (value->super_sub != psiconv_normalscript))
410 frodo 168 psiconv_warn(config,0,psiconv_buffer_length(buf),
411 frodo 72 "Unknown supersubscript (%d); assuming normal",
412     value->super_sub);
413 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x1f)))
414 frodo 72 goto ERROR;
415 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,
416 frodo 84 value->super_sub == psiconv_superscript?1:
417     value->super_sub == psiconv_subscript?2:0)))
418 frodo 72 goto ERROR;
419     }
420    
421     if (!base || (value->underline != base->underline)) {
422 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x20)))
423 frodo 72 goto ERROR;
424 frodo 168 if ((res = psiconv_write_bool(config,extra_buf,value->underline)))
425 frodo 72 goto ERROR;
426     }
427    
428     if (!base || (value->strikethrough != base->strikethrough)) {
429 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x21)))
430 frodo 72 goto ERROR;
431 frodo 168 if ((res = psiconv_write_bool(config,extra_buf,value->strikethrough)))
432 frodo 72 goto ERROR;
433     }
434    
435 frodo 78 if (!base || psiconv_compare_font(base->font,value->font)) {
436 frodo 168 if ((res = psiconv_write_u8(config,extra_buf,0x22)))
437 frodo 72 goto ERROR;
438 frodo 168 if ((res = psiconv_write_font(config,extra_buf,value->font)))
439 frodo 72 goto ERROR;
440     }
441    
442 frodo 168 if ((res = psiconv_write_u32(config,buf,psiconv_buffer_length(extra_buf))))
443 frodo 76 goto ERROR;
444    
445 frodo 79 res = psiconv_buffer_concat(buf,extra_buf);
446 frodo 72
447     ERROR:
448 frodo 79 psiconv_buffer_free(extra_buf);
449 frodo 72 return res;
450     }

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