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

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

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

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

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

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