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

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

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

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

Legend:
Removed from v.78  
changed lines
  Added in v.231

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