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

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

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