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

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

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