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

Legend:
Removed from v.142  
changed lines
  Added in v.182

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