/[public]/psiconv/trunk/lib/psiconv/generate_layout.c
ViewVC logotype

Diff of /psiconv/trunk/lib/psiconv/generate_layout.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

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

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