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

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

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