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

Legend:
Removed from v.182  
changed lines
  Added in v.270

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