]>
Commit | Line | Data |
---|---|---|
e27a3c88 KS |
1 | |
2 | #include <yaml.h> | |
3 | ||
4 | #include <stdlib.h> | |
5 | #include <stdio.h> | |
6 | ||
7 | int | |
8 | main(int argc, char *argv[]) | |
9 | { | |
10 | int help = 0; | |
11 | int canonical = 0; | |
12 | int unicode = 0; | |
13 | int k; | |
14 | int done = 0; | |
15 | ||
16 | yaml_parser_t parser; | |
17 | yaml_emitter_t emitter; | |
18 | yaml_event_t input_event; | |
19 | yaml_document_t output_document; | |
20 | ||
21 | int root; | |
22 | ||
23 | /* Clear the objects. */ | |
24 | ||
25 | memset(&parser, 0, sizeof(parser)); | |
26 | memset(&emitter, 0, sizeof(emitter)); | |
27 | memset(&input_event, 0, sizeof(input_event)); | |
28 | memset(&output_document, 0, sizeof(output_document)); | |
29 | ||
30 | /* Analyze command line options. */ | |
31 | ||
32 | for (k = 1; k < argc; k ++) | |
33 | { | |
34 | if (strcmp(argv[k], "-h") == 0 | |
35 | || strcmp(argv[k], "--help") == 0) { | |
36 | help = 1; | |
37 | } | |
38 | ||
39 | else if (strcmp(argv[k], "-c") == 0 | |
40 | || strcmp(argv[k], "--canonical") == 0) { | |
41 | canonical = 1; | |
42 | } | |
43 | ||
44 | else if (strcmp(argv[k], "-u") == 0 | |
45 | || strcmp(argv[k], "--unicode") == 0) { | |
46 | unicode = 1; | |
47 | } | |
48 | ||
49 | else { | |
50 | fprintf(stderr, "Unrecognized option: %s\n" | |
51 | "Try `%s --help` for more information.\n", | |
52 | argv[k], argv[0]); | |
53 | return 1; | |
54 | } | |
55 | } | |
56 | ||
57 | /* Display the help string. */ | |
58 | ||
59 | if (help) | |
60 | { | |
61 | printf("%s <input\n" | |
62 | "or\n%s -h | --help\nDeconstruct a YAML stream\n\nOptions:\n" | |
63 | "-h, --help\t\tdisplay this help and exit\n" | |
64 | "-c, --canonical\t\toutput in the canonical YAML format\n" | |
65 | "-u, --unicode\t\toutput unescaped non-ASCII characters\n", | |
66 | argv[0], argv[0]); | |
67 | return 0; | |
68 | } | |
69 | ||
70 | /* Initialize the parser and emitter objects. */ | |
71 | ||
72 | if (!yaml_parser_initialize(&parser)) { | |
73 | fprintf(stderr, "Could not initialize the parser object\n"); | |
74 | return 1; | |
75 | } | |
76 | ||
77 | if (!yaml_emitter_initialize(&emitter)) { | |
78 | yaml_parser_delete(&parser); | |
79 | fprintf(stderr, "Could not inialize the emitter object\n"); | |
80 | return 1; | |
81 | } | |
82 | ||
83 | /* Set the parser parameters. */ | |
84 | ||
85 | yaml_parser_set_input_file(&parser, stdin); | |
86 | ||
87 | /* Set the emitter parameters. */ | |
88 | ||
89 | yaml_emitter_set_output_file(&emitter, stdout); | |
90 | ||
91 | yaml_emitter_set_canonical(&emitter, canonical); | |
92 | yaml_emitter_set_unicode(&emitter, unicode); | |
93 | ||
94 | /* Create and emit the STREAM-START event. */ | |
95 | ||
96 | if (!yaml_emitter_open(&emitter)) | |
97 | goto emitter_error; | |
98 | ||
99 | /* Create a output_document object. */ | |
100 | ||
101 | if (!yaml_document_initialize(&output_document, NULL, NULL, NULL, 0, 0)) | |
102 | goto document_error; | |
103 | ||
104 | /* Create the root sequence. */ | |
105 | ||
106 | root = yaml_document_add_sequence(&output_document, NULL, | |
107 | YAML_BLOCK_SEQUENCE_STYLE); | |
108 | if (!root) goto document_error; | |
109 | ||
110 | /* Loop through the input events. */ | |
111 | ||
112 | while (!done) | |
113 | { | |
114 | int properties, key, value, map, seq; | |
115 | ||
116 | /* Get the next event. */ | |
117 | ||
118 | if (!yaml_parser_parse(&parser, &input_event)) | |
119 | goto parser_error; | |
120 | ||
121 | /* Check if this is the stream end. */ | |
122 | ||
123 | if (input_event.type == YAML_STREAM_END_EVENT) { | |
124 | done = 1; | |
125 | } | |
126 | ||
127 | /* Create a mapping node and attach it to the root sequence. */ | |
128 | ||
129 | properties = yaml_document_add_mapping(&output_document, NULL, | |
130 | YAML_BLOCK_MAPPING_STYLE); | |
131 | if (!properties) goto document_error; | |
132 | if (!yaml_document_append_sequence_item(&output_document, | |
133 | root, properties)) goto document_error; | |
134 | ||
135 | /* Analyze the event. */ | |
136 | ||
137 | switch (input_event.type) | |
138 | { | |
139 | case YAML_STREAM_START_EVENT: | |
140 | ||
141 | /* Add 'type': 'STREAM-START'. */ | |
142 | ||
143 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 144 | (yaml_char_t *)"type", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
145 | if (!key) goto document_error; |
146 | value = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 147 | (yaml_char_t *)"STREAM-START", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
148 | if (!value) goto document_error; |
149 | if (!yaml_document_append_mapping_pair(&output_document, | |
150 | properties, key, value)) goto document_error; | |
151 | ||
152 | /* Add 'encoding': <encoding>. */ | |
153 | ||
154 | if (input_event.data.stream_start.encoding) | |
155 | { | |
156 | yaml_encoding_t encoding | |
157 | = input_event.data.stream_start.encoding; | |
158 | ||
159 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 160 | (yaml_char_t *)"encoding", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
161 | if (!key) goto document_error; |
162 | value = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 163 | (yaml_char_t *)(encoding == YAML_UTF8_ENCODING ? "utf-8" : |
e27a3c88 KS |
164 | encoding == YAML_UTF16LE_ENCODING ? "utf-16-le" : |
165 | encoding == YAML_UTF16BE_ENCODING ? "utf-16-be" : | |
166 | "unknown"), -1, YAML_PLAIN_SCALAR_STYLE); | |
167 | if (!value) goto document_error; | |
168 | if (!yaml_document_append_mapping_pair(&output_document, | |
169 | properties, key, value)) goto document_error; | |
170 | } | |
171 | ||
172 | break; | |
173 | ||
174 | case YAML_STREAM_END_EVENT: | |
175 | ||
176 | /* Add 'type': 'STREAM-END'. */ | |
177 | ||
178 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 179 | (yaml_char_t *)"type", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
180 | if (!key) goto document_error; |
181 | value = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 182 | (yaml_char_t *)"STREAM-END", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
183 | if (!value) goto document_error; |
184 | if (!yaml_document_append_mapping_pair(&output_document, | |
185 | properties, key, value)) goto document_error; | |
186 | ||
187 | break; | |
188 | ||
189 | case YAML_DOCUMENT_START_EVENT: | |
190 | ||
191 | /* Add 'type': 'DOCUMENT-START'. */ | |
192 | ||
193 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 194 | (yaml_char_t *)"type", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
195 | if (!key) goto document_error; |
196 | value = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 197 | (yaml_char_t *)"DOCUMENT-START", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
198 | if (!value) goto document_error; |
199 | if (!yaml_document_append_mapping_pair(&output_document, | |
200 | properties, key, value)) goto document_error; | |
201 | ||
202 | /* Display the output_document version numbers. */ | |
203 | ||
204 | if (input_event.data.document_start.version_directive) | |
205 | { | |
206 | yaml_version_directive_t *version | |
207 | = input_event.data.document_start.version_directive; | |
208 | char number[64]; | |
209 | ||
210 | /* Add 'version': {}. */ | |
211 | ||
212 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 213 | (yaml_char_t *)"version", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
214 | if (!key) goto document_error; |
215 | map = yaml_document_add_mapping(&output_document, NULL, | |
216 | YAML_FLOW_MAPPING_STYLE); | |
217 | if (!map) goto document_error; | |
218 | if (!yaml_document_append_mapping_pair(&output_document, | |
219 | properties, key, map)) goto document_error; | |
220 | ||
221 | /* Add 'major': <number>. */ | |
222 | ||
223 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 224 | (yaml_char_t *)"major", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
225 | if (!key) goto document_error; |
226 | sprintf(number, "%d", version->major); | |
70342132 IC |
227 | value = yaml_document_add_scalar(&output_document, (yaml_char_t *)YAML_INT_TAG, |
228 | (yaml_char_t *)number, -1, YAML_PLAIN_SCALAR_STYLE); | |
e27a3c88 KS |
229 | if (!value) goto document_error; |
230 | if (!yaml_document_append_mapping_pair(&output_document, | |
231 | map, key, value)) goto document_error; | |
232 | ||
233 | /* Add 'minor': <number>. */ | |
234 | ||
235 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 236 | (yaml_char_t *)"minor", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
237 | if (!key) goto document_error; |
238 | sprintf(number, "%d", version->minor); | |
70342132 IC |
239 | value = yaml_document_add_scalar(&output_document, (yaml_char_t *)YAML_INT_TAG, |
240 | (yaml_char_t *)number, -1, YAML_PLAIN_SCALAR_STYLE); | |
e27a3c88 KS |
241 | if (!value) goto document_error; |
242 | if (!yaml_document_append_mapping_pair(&output_document, | |
243 | map, key, value)) goto document_error; | |
244 | } | |
245 | ||
246 | /* Display the output_document tag directives. */ | |
247 | ||
248 | if (input_event.data.document_start.tag_directives.start | |
249 | != input_event.data.document_start.tag_directives.end) | |
250 | { | |
251 | yaml_tag_directive_t *tag; | |
252 | ||
253 | /* Add 'tags': []. */ | |
254 | ||
255 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 256 | (yaml_char_t *)"tags", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
257 | if (!key) goto document_error; |
258 | seq = yaml_document_add_sequence(&output_document, NULL, | |
259 | YAML_BLOCK_SEQUENCE_STYLE); | |
260 | if (!seq) goto document_error; | |
261 | if (!yaml_document_append_mapping_pair(&output_document, | |
262 | properties, key, seq)) goto document_error; | |
263 | ||
264 | for (tag = input_event.data.document_start.tag_directives.start; | |
265 | tag != input_event.data.document_start.tag_directives.end; | |
266 | tag ++) | |
267 | { | |
268 | /* Add {}. */ | |
269 | ||
270 | map = yaml_document_add_mapping(&output_document, NULL, | |
271 | YAML_FLOW_MAPPING_STYLE); | |
272 | if (!map) goto document_error; | |
273 | if (!yaml_document_append_sequence_item(&output_document, | |
274 | seq, map)) goto document_error; | |
275 | ||
276 | /* Add 'handle': <handle>. */ | |
277 | ||
278 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 279 | (yaml_char_t *)"handle", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
280 | if (!key) goto document_error; |
281 | value = yaml_document_add_scalar(&output_document, NULL, | |
282 | tag->handle, -1, YAML_DOUBLE_QUOTED_SCALAR_STYLE); | |
283 | if (!value) goto document_error; | |
284 | if (!yaml_document_append_mapping_pair(&output_document, | |
285 | map, key, value)) goto document_error; | |
286 | ||
287 | /* Add 'prefix': <prefix>. */ | |
288 | ||
289 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 290 | (yaml_char_t *)"prefix", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
291 | if (!key) goto document_error; |
292 | value = yaml_document_add_scalar(&output_document, NULL, | |
293 | tag->prefix, -1, YAML_DOUBLE_QUOTED_SCALAR_STYLE); | |
294 | if (!value) goto document_error; | |
295 | if (!yaml_document_append_mapping_pair(&output_document, | |
296 | map, key, value)) goto document_error; | |
297 | } | |
298 | } | |
299 | ||
300 | /* Add 'implicit': <flag>. */ | |
301 | ||
302 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 303 | (yaml_char_t *)"implicit", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 | 304 | if (!key) goto document_error; |
70342132 IC |
305 | value = yaml_document_add_scalar(&output_document, (yaml_char_t *)YAML_BOOL_TAG, |
306 | (yaml_char_t *)(input_event.data.document_start.implicit ? | |
e27a3c88 KS |
307 | "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE); |
308 | if (!value) goto document_error; | |
309 | if (!yaml_document_append_mapping_pair(&output_document, | |
310 | properties, key, value)) goto document_error; | |
311 | ||
312 | break; | |
313 | ||
314 | case YAML_DOCUMENT_END_EVENT: | |
315 | ||
316 | /* Add 'type': 'DOCUMENT-END'. */ | |
317 | ||
318 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 319 | (yaml_char_t *)"type", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
320 | if (!key) goto document_error; |
321 | value = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 322 | (yaml_char_t *)"DOCUMENT-END", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
323 | if (!value) goto document_error; |
324 | if (!yaml_document_append_mapping_pair(&output_document, | |
325 | properties, key, value)) goto document_error; | |
326 | ||
327 | /* Add 'implicit': <flag>. */ | |
328 | ||
329 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 330 | (yaml_char_t *)"implicit", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 | 331 | if (!key) goto document_error; |
70342132 IC |
332 | value = yaml_document_add_scalar(&output_document, (yaml_char_t *)YAML_BOOL_TAG, |
333 | (yaml_char_t *)(input_event.data.document_end.implicit ? | |
e27a3c88 KS |
334 | "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE); |
335 | if (!value) goto document_error; | |
336 | if (!yaml_document_append_mapping_pair(&output_document, | |
337 | properties, key, value)) goto document_error; | |
338 | ||
339 | break; | |
340 | ||
341 | case YAML_ALIAS_EVENT: | |
342 | ||
343 | /* Add 'type': 'ALIAS'. */ | |
344 | ||
345 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 346 | (yaml_char_t *)"type", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
347 | if (!key) goto document_error; |
348 | value = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 349 | (yaml_char_t *)"ALIAS", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
350 | if (!value) goto document_error; |
351 | if (!yaml_document_append_mapping_pair(&output_document, | |
352 | properties, key, value)) goto document_error; | |
353 | ||
354 | /* Add 'anchor': <anchor>. */ | |
355 | ||
356 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 357 | (yaml_char_t *)"anchor", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
358 | if (!key) goto document_error; |
359 | value = yaml_document_add_scalar(&output_document, NULL, | |
360 | input_event.data.alias.anchor, -1, | |
361 | YAML_DOUBLE_QUOTED_SCALAR_STYLE); | |
362 | if (!value) goto document_error; | |
363 | if (!yaml_document_append_mapping_pair(&output_document, | |
364 | properties, key, value)) goto document_error; | |
365 | ||
366 | break; | |
367 | ||
368 | case YAML_SCALAR_EVENT: | |
369 | ||
370 | /* Add 'type': 'SCALAR'. */ | |
371 | ||
372 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 373 | (yaml_char_t *)"type", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
374 | if (!key) goto document_error; |
375 | value = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 376 | (yaml_char_t *)"SCALAR", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
377 | if (!value) goto document_error; |
378 | if (!yaml_document_append_mapping_pair(&output_document, | |
379 | properties, key, value)) goto document_error; | |
380 | ||
381 | /* Add 'anchor': <anchor>. */ | |
382 | ||
383 | if (input_event.data.scalar.anchor) | |
384 | { | |
385 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 386 | (yaml_char_t *)"anchor", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
387 | if (!key) goto document_error; |
388 | value = yaml_document_add_scalar(&output_document, NULL, | |
389 | input_event.data.scalar.anchor, -1, | |
390 | YAML_DOUBLE_QUOTED_SCALAR_STYLE); | |
391 | if (!value) goto document_error; | |
392 | if (!yaml_document_append_mapping_pair(&output_document, | |
393 | properties, key, value)) goto document_error; | |
394 | } | |
395 | ||
396 | /* Add 'tag': <tag>. */ | |
397 | ||
398 | if (input_event.data.scalar.tag) | |
399 | { | |
400 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 401 | (yaml_char_t *)"tag", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
402 | if (!key) goto document_error; |
403 | value = yaml_document_add_scalar(&output_document, NULL, | |
404 | input_event.data.scalar.tag, -1, | |
405 | YAML_DOUBLE_QUOTED_SCALAR_STYLE); | |
406 | if (!value) goto document_error; | |
407 | if (!yaml_document_append_mapping_pair(&output_document, | |
408 | properties, key, value)) goto document_error; | |
409 | } | |
410 | ||
411 | /* Add 'value': <value>. */ | |
412 | ||
413 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 414 | (yaml_char_t *)"value", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
415 | if (!key) goto document_error; |
416 | value = yaml_document_add_scalar(&output_document, NULL, | |
417 | input_event.data.scalar.value, | |
418 | input_event.data.scalar.length, | |
419 | YAML_DOUBLE_QUOTED_SCALAR_STYLE); | |
420 | if (!value) goto document_error; | |
421 | if (!yaml_document_append_mapping_pair(&output_document, | |
422 | properties, key, value)) goto document_error; | |
423 | ||
424 | /* Display if the scalar tag is implicit. */ | |
425 | ||
426 | /* Add 'implicit': {} */ | |
427 | ||
428 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 429 | (yaml_char_t *)"version", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
430 | if (!key) goto document_error; |
431 | map = yaml_document_add_mapping(&output_document, NULL, | |
432 | YAML_FLOW_MAPPING_STYLE); | |
433 | if (!map) goto document_error; | |
434 | if (!yaml_document_append_mapping_pair(&output_document, | |
435 | properties, key, map)) goto document_error; | |
436 | ||
437 | /* Add 'plain': <flag>. */ | |
438 | ||
439 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 440 | (yaml_char_t *)"plain", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 | 441 | if (!key) goto document_error; |
70342132 IC |
442 | value = yaml_document_add_scalar(&output_document, (yaml_char_t *)YAML_BOOL_TAG, |
443 | (yaml_char_t *)(input_event.data.scalar.plain_implicit ? | |
e27a3c88 KS |
444 | "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE); |
445 | if (!value) goto document_error; | |
446 | if (!yaml_document_append_mapping_pair(&output_document, | |
447 | map, key, value)) goto document_error; | |
448 | ||
449 | /* Add 'quoted': <flag>. */ | |
450 | ||
451 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 452 | (yaml_char_t *)"quoted", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 | 453 | if (!key) goto document_error; |
70342132 IC |
454 | value = yaml_document_add_scalar(&output_document, (yaml_char_t *)YAML_BOOL_TAG, |
455 | (yaml_char_t *)(input_event.data.scalar.quoted_implicit ? | |
e27a3c88 KS |
456 | "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE); |
457 | if (!value) goto document_error; | |
458 | if (!yaml_document_append_mapping_pair(&output_document, | |
459 | map, key, value)) goto document_error; | |
460 | ||
461 | /* Display the style information. */ | |
462 | ||
463 | if (input_event.data.scalar.style) | |
464 | { | |
465 | yaml_scalar_style_t style = input_event.data.scalar.style; | |
466 | ||
467 | /* Add 'style': <style>. */ | |
468 | ||
469 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 470 | (yaml_char_t *)"style", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
471 | if (!key) goto document_error; |
472 | value = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 473 | (yaml_char_t *)(style == YAML_PLAIN_SCALAR_STYLE ? "plain" : |
e27a3c88 KS |
474 | style == YAML_SINGLE_QUOTED_SCALAR_STYLE ? |
475 | "single-quoted" : | |
476 | style == YAML_DOUBLE_QUOTED_SCALAR_STYLE ? | |
477 | "double-quoted" : | |
478 | style == YAML_LITERAL_SCALAR_STYLE ? "literal" : | |
479 | style == YAML_FOLDED_SCALAR_STYLE ? "folded" : | |
480 | "unknown"), -1, YAML_PLAIN_SCALAR_STYLE); | |
481 | if (!value) goto document_error; | |
482 | if (!yaml_document_append_mapping_pair(&output_document, | |
483 | properties, key, value)) goto document_error; | |
484 | } | |
485 | ||
486 | break; | |
487 | ||
488 | case YAML_SEQUENCE_START_EVENT: | |
489 | ||
490 | /* Add 'type': 'SEQUENCE-START'. */ | |
491 | ||
492 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 493 | (yaml_char_t *)"type", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
494 | if (!key) goto document_error; |
495 | value = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 496 | (yaml_char_t *)"SEQUENCE-START", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
497 | if (!value) goto document_error; |
498 | if (!yaml_document_append_mapping_pair(&output_document, | |
499 | properties, key, value)) goto document_error; | |
500 | ||
501 | /* Add 'anchor': <anchor>. */ | |
502 | ||
503 | if (input_event.data.sequence_start.anchor) | |
504 | { | |
505 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 506 | (yaml_char_t *)"anchor", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
507 | if (!key) goto document_error; |
508 | value = yaml_document_add_scalar(&output_document, NULL, | |
509 | input_event.data.sequence_start.anchor, -1, | |
510 | YAML_DOUBLE_QUOTED_SCALAR_STYLE); | |
511 | if (!value) goto document_error; | |
512 | if (!yaml_document_append_mapping_pair(&output_document, | |
513 | properties, key, value)) goto document_error; | |
514 | } | |
515 | ||
516 | /* Add 'tag': <tag>. */ | |
517 | ||
518 | if (input_event.data.sequence_start.tag) | |
519 | { | |
520 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 521 | (yaml_char_t *)"tag", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
522 | if (!key) goto document_error; |
523 | value = yaml_document_add_scalar(&output_document, NULL, | |
524 | input_event.data.sequence_start.tag, -1, | |
525 | YAML_DOUBLE_QUOTED_SCALAR_STYLE); | |
526 | if (!value) goto document_error; | |
527 | if (!yaml_document_append_mapping_pair(&output_document, | |
528 | properties, key, value)) goto document_error; | |
529 | } | |
530 | ||
531 | /* Add 'implicit': <flag>. */ | |
532 | ||
533 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 534 | (yaml_char_t *)"implicit", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 | 535 | if (!key) goto document_error; |
70342132 IC |
536 | value = yaml_document_add_scalar(&output_document, (yaml_char_t *)YAML_BOOL_TAG, |
537 | (yaml_char_t *)(input_event.data.sequence_start.implicit ? | |
e27a3c88 KS |
538 | "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE); |
539 | if (!value) goto document_error; | |
540 | if (!yaml_document_append_mapping_pair(&output_document, | |
541 | properties, key, value)) goto document_error; | |
542 | ||
543 | /* Display the style information. */ | |
544 | ||
545 | if (input_event.data.sequence_start.style) | |
546 | { | |
547 | yaml_sequence_style_t style | |
548 | = input_event.data.sequence_start.style; | |
549 | ||
550 | /* Add 'style': <style>. */ | |
551 | ||
552 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 553 | (yaml_char_t *)"style", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
554 | if (!key) goto document_error; |
555 | value = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 556 | (yaml_char_t *)(style == YAML_BLOCK_SEQUENCE_STYLE ? "block" : |
e27a3c88 KS |
557 | style == YAML_FLOW_SEQUENCE_STYLE ? "flow" : |
558 | "unknown"), -1, YAML_PLAIN_SCALAR_STYLE); | |
559 | if (!value) goto document_error; | |
560 | if (!yaml_document_append_mapping_pair(&output_document, | |
561 | properties, key, value)) goto document_error; | |
562 | } | |
563 | ||
564 | break; | |
565 | ||
566 | case YAML_SEQUENCE_END_EVENT: | |
567 | ||
568 | /* Add 'type': 'SEQUENCE-END'. */ | |
569 | ||
570 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 571 | (yaml_char_t *)"type", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
572 | if (!key) goto document_error; |
573 | value = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 574 | (yaml_char_t *)"SEQUENCE-END", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
575 | if (!value) goto document_error; |
576 | if (!yaml_document_append_mapping_pair(&output_document, | |
577 | properties, key, value)) goto document_error; | |
578 | ||
579 | break; | |
580 | ||
581 | case YAML_MAPPING_START_EVENT: | |
582 | ||
583 | /* Add 'type': 'MAPPING-START'. */ | |
584 | ||
585 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 586 | (yaml_char_t *)"type", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
587 | if (!key) goto document_error; |
588 | value = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 589 | (yaml_char_t *)"MAPPING-START", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
590 | if (!value) goto document_error; |
591 | if (!yaml_document_append_mapping_pair(&output_document, | |
592 | properties, key, value)) goto document_error; | |
593 | ||
594 | /* Add 'anchor': <anchor>. */ | |
595 | ||
596 | if (input_event.data.mapping_start.anchor) | |
597 | { | |
598 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 599 | (yaml_char_t *)"anchor", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
600 | if (!key) goto document_error; |
601 | value = yaml_document_add_scalar(&output_document, NULL, | |
602 | input_event.data.mapping_start.anchor, -1, | |
603 | YAML_DOUBLE_QUOTED_SCALAR_STYLE); | |
604 | if (!value) goto document_error; | |
605 | if (!yaml_document_append_mapping_pair(&output_document, | |
606 | properties, key, value)) goto document_error; | |
607 | } | |
608 | ||
609 | /* Add 'tag': <tag>. */ | |
610 | ||
611 | if (input_event.data.mapping_start.tag) | |
612 | { | |
613 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 614 | (yaml_char_t *)"tag", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
615 | if (!key) goto document_error; |
616 | value = yaml_document_add_scalar(&output_document, NULL, | |
617 | input_event.data.mapping_start.tag, -1, | |
618 | YAML_DOUBLE_QUOTED_SCALAR_STYLE); | |
619 | if (!value) goto document_error; | |
620 | if (!yaml_document_append_mapping_pair(&output_document, | |
621 | properties, key, value)) goto document_error; | |
622 | } | |
623 | ||
624 | /* Add 'implicit': <flag>. */ | |
625 | ||
626 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 627 | (yaml_char_t *)"implicit", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 | 628 | if (!key) goto document_error; |
70342132 IC |
629 | value = yaml_document_add_scalar(&output_document, (yaml_char_t *)YAML_BOOL_TAG, |
630 | (yaml_char_t *)(input_event.data.mapping_start.implicit ? | |
e27a3c88 KS |
631 | "true" : "false"), -1, YAML_PLAIN_SCALAR_STYLE); |
632 | if (!value) goto document_error; | |
633 | if (!yaml_document_append_mapping_pair(&output_document, | |
634 | properties, key, value)) goto document_error; | |
635 | ||
636 | /* Display the style information. */ | |
637 | ||
638 | if (input_event.data.sequence_start.style) | |
639 | { | |
640 | yaml_sequence_style_t style | |
70342132 | 641 | = (yaml_sequence_style_t) input_event.data.mapping_start.style; |
e27a3c88 KS |
642 | |
643 | /* Add 'style': <style>. */ | |
644 | ||
645 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 646 | (yaml_char_t *)"style", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
647 | if (!key) goto document_error; |
648 | value = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 649 | (yaml_char_t *)(style == YAML_BLOCK_MAPPING_STYLE ? "block" : |
e27a3c88 KS |
650 | style == YAML_FLOW_MAPPING_STYLE ? "flow" : |
651 | "unknown"), -1, YAML_PLAIN_SCALAR_STYLE); | |
652 | if (!value) goto document_error; | |
653 | if (!yaml_document_append_mapping_pair(&output_document, | |
654 | properties, key, value)) goto document_error; | |
655 | } | |
656 | ||
657 | break; | |
658 | ||
659 | case YAML_MAPPING_END_EVENT: | |
660 | ||
661 | /* Add 'type': 'MAPPING-END'. */ | |
662 | ||
663 | key = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 664 | (yaml_char_t *)"type", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
665 | if (!key) goto document_error; |
666 | value = yaml_document_add_scalar(&output_document, NULL, | |
70342132 | 667 | (yaml_char_t *)"MAPPING-END", -1, YAML_PLAIN_SCALAR_STYLE); |
e27a3c88 KS |
668 | if (!value) goto document_error; |
669 | if (!yaml_document_append_mapping_pair(&output_document, | |
670 | properties, key, value)) goto document_error; | |
671 | ||
672 | break; | |
673 | ||
674 | default: | |
675 | /* It couldn't really happen. */ | |
676 | break; | |
677 | } | |
678 | ||
679 | /* Delete the event object. */ | |
680 | ||
681 | yaml_event_delete(&input_event); | |
682 | } | |
683 | ||
684 | if (!yaml_emitter_dump(&emitter, &output_document)) | |
685 | goto emitter_error; | |
686 | if (!yaml_emitter_close(&emitter)) | |
687 | goto emitter_error; | |
688 | ||
689 | yaml_parser_delete(&parser); | |
690 | yaml_emitter_delete(&emitter); | |
691 | ||
692 | return 0; | |
693 | ||
694 | parser_error: | |
695 | ||
696 | /* Display a parser error message. */ | |
697 | ||
698 | switch (parser.error) | |
699 | { | |
700 | case YAML_MEMORY_ERROR: | |
701 | fprintf(stderr, "Memory error: Not enough memory for parsing\n"); | |
702 | break; | |
703 | ||
704 | case YAML_READER_ERROR: | |
705 | if (parser.problem_value != -1) { | |
44d49c90 | 706 | fprintf(stderr, "Reader error: %s: #%X at %zd\n", parser.problem, |
e27a3c88 KS |
707 | parser.problem_value, parser.problem_offset); |
708 | } | |
709 | else { | |
44d49c90 | 710 | fprintf(stderr, "Reader error: %s at %zd\n", parser.problem, |
e27a3c88 KS |
711 | parser.problem_offset); |
712 | } | |
713 | break; | |
714 | ||
715 | case YAML_SCANNER_ERROR: | |
716 | if (parser.context) { | |
44d49c90 IC |
717 | fprintf(stderr, "Scanner error: %s at line %lu, column %lu\n" |
718 | "%s at line %lu, column %lu\n", parser.context, | |
e27a3c88 KS |
719 | parser.context_mark.line+1, parser.context_mark.column+1, |
720 | parser.problem, parser.problem_mark.line+1, | |
721 | parser.problem_mark.column+1); | |
722 | } | |
723 | else { | |
44d49c90 | 724 | fprintf(stderr, "Scanner error: %s at line %lu, column %lu\n", |
e27a3c88 KS |
725 | parser.problem, parser.problem_mark.line+1, |
726 | parser.problem_mark.column+1); | |
727 | } | |
728 | break; | |
729 | ||
730 | case YAML_PARSER_ERROR: | |
731 | if (parser.context) { | |
44d49c90 IC |
732 | fprintf(stderr, "Parser error: %s at line %lu, column %lu\n" |
733 | "%s at line %lu, column %lu\n", parser.context, | |
e27a3c88 KS |
734 | parser.context_mark.line+1, parser.context_mark.column+1, |
735 | parser.problem, parser.problem_mark.line+1, | |
736 | parser.problem_mark.column+1); | |
737 | } | |
738 | else { | |
44d49c90 | 739 | fprintf(stderr, "Parser error: %s at line %lu, column %lu\n", |
e27a3c88 KS |
740 | parser.problem, parser.problem_mark.line+1, |
741 | parser.problem_mark.column+1); | |
742 | } | |
743 | break; | |
744 | ||
745 | default: | |
746 | /* Couldn't happen. */ | |
747 | fprintf(stderr, "Internal error\n"); | |
748 | break; | |
749 | } | |
750 | ||
751 | yaml_event_delete(&input_event); | |
752 | yaml_document_delete(&output_document); | |
753 | yaml_parser_delete(&parser); | |
754 | yaml_emitter_delete(&emitter); | |
755 | ||
756 | return 1; | |
757 | ||
758 | emitter_error: | |
759 | ||
760 | /* Display an emitter error message. */ | |
761 | ||
762 | switch (emitter.error) | |
763 | { | |
764 | case YAML_MEMORY_ERROR: | |
765 | fprintf(stderr, "Memory error: Not enough memory for emitting\n"); | |
766 | break; | |
767 | ||
768 | case YAML_WRITER_ERROR: | |
769 | fprintf(stderr, "Writer error: %s\n", emitter.problem); | |
770 | break; | |
771 | ||
772 | case YAML_EMITTER_ERROR: | |
773 | fprintf(stderr, "Emitter error: %s\n", emitter.problem); | |
774 | break; | |
775 | ||
776 | default: | |
777 | /* Couldn't happen. */ | |
778 | fprintf(stderr, "Internal error\n"); | |
779 | break; | |
780 | } | |
781 | ||
782 | yaml_event_delete(&input_event); | |
783 | yaml_document_delete(&output_document); | |
784 | yaml_parser_delete(&parser); | |
785 | yaml_emitter_delete(&emitter); | |
786 | ||
787 | return 1; | |
788 | ||
789 | document_error: | |
790 | ||
791 | fprintf(stderr, "Memory error: Not enough memory for creating a document\n"); | |
792 | ||
793 | yaml_event_delete(&input_event); | |
794 | yaml_document_delete(&output_document); | |
795 | yaml_parser_delete(&parser); | |
796 | yaml_emitter_delete(&emitter); | |
797 | ||
798 | return 1; | |
799 | } | |
800 |