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

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

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