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

Legend:
Removed from v.84  
changed lines
  Added in v.196

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