/[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 76 - (hide annotations)
Mon Dec 25 00:26:53 2000 UTC (23 years, 3 months ago) by frodo
File MIME type: text/plain
File size: 18274 byte(s)
(Frodo) Added word-specific generation routines

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

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