/[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 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: 15040 byte(s)
(Frodo) DMALLOC support

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

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