/[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 104 Revision 193
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)))
259 goto ERROR; 286 goto ERROR;
260 } 287 }
261 288
262 if (!base || (value->wrap_to_fit_cell != base->wrap_to_fit_cell)) { 289 if (!base || (value->wrap_to_fit_cell != base->wrap_to_fit_cell)) {
263 if ((res = psiconv_write_u8(extra_buf,0x0f))) 290 if ((res = psiconv_write_u8(config,extra_buf,lev+1,0x0f)))
264 goto ERROR; 291 goto ERROR;
265 if ((res = psiconv_write_bool(extra_buf,value->wrap_to_fit_cell))) 292 if ((res = psiconv_write_bool(config,extra_buf,lev+1,value->wrap_to_fit_cell)))
266 goto ERROR; 293 goto ERROR;
267 } 294 }
268 295
269 if (!base || (value->border_distance != base->border_distance)) { 296 if (!base || (value->border_distance != base->border_distance)) {
270 if ((res = psiconv_write_u8(extra_buf,0x10))) 297 if ((res = psiconv_write_u8(config,extra_buf,lev+1,0x10)))
271 goto ERROR; 298 goto ERROR;
272 if ((res = psiconv_write_length(extra_buf,value->border_distance))) 299 if ((res = psiconv_write_length(config,extra_buf,lev+1,value->border_distance)))
273 goto ERROR; 300 goto ERROR;
274 } 301 }
275 302
276 if (!base || psiconv_compare_border(value->top_border,base->top_border)) { 303 if (!base || psiconv_compare_border(value->top_border,base->top_border)) {
277 if ((res = psiconv_write_u8(extra_buf,0x11))) 304 if ((res = psiconv_write_u8(config,extra_buf,lev+1,0x11)))
278 goto ERROR; 305 goto ERROR;
279 if ((res = psiconv_write_border(extra_buf,value->top_border))) 306 if ((res = psiconv_write_border(config,extra_buf,lev+1,value->top_border)))
280 goto ERROR; 307 goto ERROR;
281 } 308 }
282 309
283 if (!base || psiconv_compare_border(value->bottom_border, 310 if (!base || psiconv_compare_border(value->bottom_border,
284 base->bottom_border)) { 311 base->bottom_border)) {
285 if ((res = psiconv_write_u8(extra_buf,0x12))) 312 if ((res = psiconv_write_u8(config,extra_buf,lev+1,0x12)))
286 goto ERROR; 313 goto ERROR;
287 if ((res = psiconv_write_border(extra_buf,value->bottom_border))) 314 if ((res = psiconv_write_border(config,extra_buf,lev+1,value->bottom_border)))
288 goto ERROR; 315 goto ERROR;
289 } 316 }
290 317
291 if (!base || psiconv_compare_border(value->left_border, 318 if (!base || psiconv_compare_border(value->left_border,
292 base->left_border)) { 319 base->left_border)) {
293 if ((res = psiconv_write_u8(extra_buf,0x13))) 320 if ((res = psiconv_write_u8(config,extra_buf,lev+1,0x13)))
294 goto ERROR; 321 goto ERROR;
295 if ((res = psiconv_write_border(extra_buf,value->left_border))) 322 if ((res = psiconv_write_border(config,extra_buf,lev+1,value->left_border)))
296 goto ERROR; 323 goto ERROR;
297 } 324 }
298 325
299 if (!base || psiconv_compare_border(value->right_border, 326 if (!base || psiconv_compare_border(value->right_border,
300 base->right_border)) { 327 base->right_border)) {
301 if ((res = psiconv_write_u8(extra_buf,0x14))) 328 if ((res = psiconv_write_u8(config,extra_buf,lev+1,0x14)))
302 goto ERROR; 329 goto ERROR;
303 if ((res = psiconv_write_border(extra_buf,value->right_border))) 330 if ((res = psiconv_write_border(config,extra_buf,lev+1,value->right_border)))
304 goto ERROR; 331 goto ERROR;
305 } 332 }
306 333
307 if (!base || psiconv_compare_bullet(value->bullet, 334 if (!base || psiconv_compare_bullet(value->bullet,
308 base->bullet)) { 335 base->bullet)) {
309 if ((res = psiconv_write_u8(extra_buf,0x15))) 336 if ((res = psiconv_write_u8(config,extra_buf,lev+1,0x15)))
310 goto ERROR; 337 goto ERROR;
311 if ((res = psiconv_write_bullet(extra_buf,value->bullet))) 338 if ((res = psiconv_write_bullet(config,extra_buf,lev+1,value->bullet)))
312 goto ERROR; 339 goto ERROR;
313 } 340 }
314 341
315 if (!value->tabs || !value->tabs->extras) { 342 if (!value->tabs || !value->tabs->extras) {
316 psiconv_warn(0,psiconv_buffer_length(buf),"Null tabs"); 343 psiconv_error(config,0,psiconv_buffer_length(buf),"Null tabs");
317 res = -PSICONV_E_GENERATE; 344 res = -PSICONV_E_GENERATE;
318 goto ERROR; 345 goto ERROR;
319 } 346 }
320 347
321 /* 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
322 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
323 the normal tab-interval, and all specific tabs */ 350 the normal tab-interval, and all specific tabs */
324 if (!base || psiconv_compare_all_tabs(value->tabs,base->tabs)) { 351 if (!base || psiconv_compare_all_tabs(value->tabs,base->tabs)) {
325 if ((res = psiconv_write_u8(extra_buf,0x16))) 352 if ((res = psiconv_write_u8(config,extra_buf,lev+1,0x16)))
326 goto ERROR; 353 goto ERROR;
327 if ((res = psiconv_write_length(extra_buf,value->tabs->normal))) 354 if ((res = psiconv_write_length(config,extra_buf,lev+1,value->tabs->normal)))
328 goto ERROR; 355 goto ERROR;
329 for (i = 0; i < psiconv_list_length(value->tabs->extras); i++) { 356 for (i = 0; i < psiconv_list_length(value->tabs->extras); i++) {
330 if (!(tab = psiconv_list_get(value->tabs->extras,i))) { 357 if (!(tab = psiconv_list_get(value->tabs->extras,i))) {
331 psiconv_warn(0,psiconv_buffer_length(buf),"Massive memory corruption"); 358 psiconv_error(config,0,psiconv_buffer_length(buf),"Massive memory corruption");
332 res = -PSICONV_E_NOMEM; 359 res = -PSICONV_E_NOMEM;
333 goto ERROR; 360 goto ERROR;
334 } 361 }
335 if ((res = psiconv_write_u8(extra_buf,0x17))) 362 if ((res = psiconv_write_u8(config,extra_buf,lev+1,0x17)))
336 goto ERROR; 363 goto ERROR;
337 if ((res = psiconv_write_tab(extra_buf,tab))) 364 if ((res = psiconv_write_tab(config,extra_buf,lev+1,tab)))
338 goto ERROR; 365 goto ERROR;
339 } 366 }
340 } 367 }
341 368
342 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))))
343 goto ERROR; 370 goto ERROR;
344 371
345 res = psiconv_buffer_concat(buf,extra_buf); 372 res = psiconv_buffer_concat(buf,extra_buf);
346 373
347ERROR: 374ERROR:
348 psiconv_buffer_free(extra_buf); 375 psiconv_buffer_free(extra_buf);
349 return res; 376 return res;
350} 377}
351 378
352int psiconv_write_character_layout_list(psiconv_buffer buf, 379int psiconv_write_character_layout_list(const psiconv_config config,
380 psiconv_buffer buf,int lev,
353 psiconv_character_layout value, 381 psiconv_character_layout value,
354 psiconv_character_layout base) 382 psiconv_character_layout base)
355{ 383{
356 int res; 384 int res;
357 psiconv_buffer extra_buf; 385 psiconv_buffer extra_buf;
386
387 psiconv_progress(config,lev,0,"Writing character layout list");
388
358 if (!value) { 389 if (!value) {
359 psiconv_warn(0,psiconv_buffer_length(buf),"Null character layout list"); 390 psiconv_error(config,0,psiconv_buffer_length(buf),"Null character layout list");
360 return -PSICONV_E_GENERATE; 391 return -PSICONV_E_GENERATE;
361 } 392 }
362 if (!(extra_buf = psiconv_buffer_new())) 393 if (!(extra_buf = psiconv_buffer_new()))
363 return -PSICONV_E_NOMEM; 394 return -PSICONV_E_NOMEM;
364 395
365 if (!base || psiconv_compare_color(base->color,value->color)) { 396 if (!base || psiconv_compare_color(base->color,value->color)) {
366 if ((res = psiconv_write_u8(extra_buf,0x19))) 397 if ((res = psiconv_write_u8(config,extra_buf,lev+1,0x19)))
367 goto ERROR; 398 goto ERROR;
368 if ((res = psiconv_write_color(extra_buf,value->color))) 399 if ((res = psiconv_write_color(config,extra_buf,lev+1,value->color)))
369 goto ERROR; 400 goto ERROR;
370 } 401 }
371 402
372 if (!base || psiconv_compare_color(base->back_color,value->back_color)) { 403 if (!base || psiconv_compare_color(base->back_color,value->back_color)) {
373 if ((res = psiconv_write_u8(extra_buf,0x1a))) 404 if ((res = psiconv_write_u8(config,extra_buf,lev+1,0x1a)))
374 goto ERROR; 405 goto ERROR;
375 if ((res = psiconv_write_color(extra_buf,value->back_color))) 406 if ((res = psiconv_write_color(config,extra_buf,lev+1,value->back_color)))
376 goto ERROR; 407 goto ERROR;
377 } 408 }
378 409
379 if (!base || (value->font_size != base->font_size)) { 410 if (!base || (value->font_size != base->font_size)) {
380 if ((res = psiconv_write_u8(extra_buf,0x1c))) 411 if ((res = psiconv_write_u8(config,extra_buf,lev+1,0x1c)))
381 goto ERROR; 412 goto ERROR;
382 if ((res = psiconv_write_size(extra_buf,value->font_size))) 413 if ((res = psiconv_write_size(config,extra_buf,lev+1,value->font_size)))
383 goto ERROR; 414 goto ERROR;
384 } 415 }
385 416
386 if (!base || (value->italic != base->italic)) { 417 if (!base || (value->italic != base->italic)) {
387 if ((res = psiconv_write_u8(extra_buf,0x1d))) 418 if ((res = psiconv_write_u8(config,extra_buf,lev+1,0x1d)))
388 goto ERROR; 419 goto ERROR;
389 if ((res = psiconv_write_bool(extra_buf,value->italic))) 420 if ((res = psiconv_write_bool(config,extra_buf,lev+1,value->italic)))
390 goto ERROR; 421 goto ERROR;
391 } 422 }
392 423
393 if (!base || (value->bold != base->bold)) { 424 if (!base || (value->bold != base->bold)) {
394 if ((res = psiconv_write_u8(extra_buf,0x1e))) 425 if ((res = psiconv_write_u8(config,extra_buf,lev+1,0x1e)))
395 goto ERROR; 426 goto ERROR;
396 if ((res = psiconv_write_bool(extra_buf,value->bold))) 427 if ((res = psiconv_write_bool(config,extra_buf,lev+1,value->bold)))
397 goto ERROR; 428 goto ERROR;
398 } 429 }
399 430
400 if (!base || (value->super_sub != base->super_sub)) { 431 if (!base || (value->super_sub != base->super_sub)) {
401 if ((value->super_sub != psiconv_superscript) && 432 if ((value->super_sub != psiconv_superscript) &&
402 (value->super_sub != psiconv_subscript) && 433 (value->super_sub != psiconv_subscript) &&
403 (value->super_sub != psiconv_normalscript)) 434 (value->super_sub != psiconv_normalscript))
404 psiconv_warn(0,psiconv_buffer_length(buf), 435 psiconv_warn(config,0,psiconv_buffer_length(buf),
405 "Unknown supersubscript (%d); assuming normal", 436 "Unknown supersubscript (%d); assuming normal",
406 value->super_sub); 437 value->super_sub);
407 if ((res = psiconv_write_u8(extra_buf,0x1f))) 438 if ((res = psiconv_write_u8(config,extra_buf,lev+1,0x1f)))
408 goto ERROR; 439 goto ERROR;
409 if ((res = psiconv_write_u8(extra_buf, 440 if ((res = psiconv_write_u8(config,extra_buf,lev+1,
410 value->super_sub == psiconv_superscript?1: 441 value->super_sub == psiconv_superscript?1:
411 value->super_sub == psiconv_subscript?2:0))) 442 value->super_sub == psiconv_subscript?2:0)))
412 goto ERROR; 443 goto ERROR;
413 } 444 }
414 445
415 if (!base || (value->underline != base->underline)) { 446 if (!base || (value->underline != base->underline)) {
416 if ((res = psiconv_write_u8(extra_buf,0x20))) 447 if ((res = psiconv_write_u8(config,extra_buf,lev+1,0x20)))
417 goto ERROR; 448 goto ERROR;
418 if ((res = psiconv_write_bool(extra_buf,value->underline))) 449 if ((res = psiconv_write_bool(config,extra_buf,lev+1,value->underline)))
419 goto ERROR; 450 goto ERROR;
420 } 451 }
421 452
422 if (!base || (value->strikethrough != base->strikethrough)) { 453 if (!base || (value->strikethrough != base->strikethrough)) {
423 if ((res = psiconv_write_u8(extra_buf,0x21))) 454 if ((res = psiconv_write_u8(config,extra_buf,lev+1,0x21)))
424 goto ERROR; 455 goto ERROR;
425 if ((res = psiconv_write_bool(extra_buf,value->strikethrough))) 456 if ((res = psiconv_write_bool(config,extra_buf,lev+1,value->strikethrough)))
426 goto ERROR; 457 goto ERROR;
427 } 458 }
428 459
429 if (!base || psiconv_compare_font(base->font,value->font)) { 460 if (!base || psiconv_compare_font(base->font,value->font)) {
430 if ((res = psiconv_write_u8(extra_buf,0x22))) 461 if ((res = psiconv_write_u8(config,extra_buf,lev+1,0x22)))
431 goto ERROR; 462 goto ERROR;
432 if ((res = psiconv_write_font(extra_buf,value->font))) 463 if ((res = psiconv_write_font(config,extra_buf,lev+1,value->font)))
433 goto ERROR; 464 goto ERROR;
434 } 465 }
435 466
436 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))))
437 goto ERROR; 468 goto ERROR;
438 469
439 res = psiconv_buffer_concat(buf,extra_buf); 470 res = psiconv_buffer_concat(buf,extra_buf);
440 471
441ERROR: 472ERROR:

Legend:
Removed from v.104  
changed lines
  Added in v.193

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