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

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

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