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

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

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