1 |
// |
2 |
// Copyright (c) 2011-2019 Canonical Ltd |
3 |
// Copyright (c) 2006-2010 Kirill Simonov |
4 |
// |
5 |
// Permission is hereby granted, free of charge, to any person obtaining a copy of |
6 |
// this software and associated documentation files (the "Software"), to deal in |
7 |
// the Software without restriction, including without limitation the rights to |
8 |
// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies |
9 |
// of the Software, and to permit persons to whom the Software is furnished to do |
10 |
// so, subject to the following conditions: |
11 |
// |
12 |
// The above copyright notice and this permission notice shall be included in all |
13 |
// copies or substantial portions of the Software. |
14 |
// |
15 |
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
16 |
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
17 |
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
18 |
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
19 |
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
20 |
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
21 |
// SOFTWARE. |
22 |
|
23 |
package yaml |
24 |
|
25 |
import ( |
26 |
"io" |
27 |
) |
28 |
|
29 |
func yaml_insert_token(parser *yaml_parser_t, pos int, token *yaml_token_t) { |
30 |
//fmt.Println("yaml_insert_token", "pos:", pos, "typ:", token.typ, "head:", parser.tokens_head, "len:", len(parser.tokens)) |
31 |
|
32 |
// Check if we can move the queue at the beginning of the buffer. |
33 |
if parser.tokens_head > 0 && len(parser.tokens) == cap(parser.tokens) { |
34 |
if parser.tokens_head != len(parser.tokens) { |
35 |
copy(parser.tokens, parser.tokens[parser.tokens_head:]) |
36 |
} |
37 |
parser.tokens = parser.tokens[:len(parser.tokens)-parser.tokens_head] |
38 |
parser.tokens_head = 0 |
39 |
} |
40 |
parser.tokens = append(parser.tokens, *token) |
41 |
if pos < 0 { |
42 |
return |
43 |
} |
44 |
copy(parser.tokens[parser.tokens_head+pos+1:], parser.tokens[parser.tokens_head+pos:]) |
45 |
parser.tokens[parser.tokens_head+pos] = *token |
46 |
} |
47 |
|
48 |
// Create a new parser object. |
49 |
func yaml_parser_initialize(parser *yaml_parser_t) bool { |
50 |
*parser = yaml_parser_t{ |
51 |
raw_buffer: make([]byte, 0, input_raw_buffer_size), |
52 |
buffer: make([]byte, 0, input_buffer_size), |
53 |
} |
54 |
return true |
55 |
} |
56 |
|
57 |
// Destroy a parser object. |
58 |
func yaml_parser_delete(parser *yaml_parser_t) { |
59 |
*parser = yaml_parser_t{} |
60 |
} |
61 |
|
62 |
// String read handler. |
63 |
func yaml_string_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { |
64 |
if parser.input_pos == len(parser.input) { |
65 |
return 0, io.EOF |
66 |
} |
67 |
n = copy(buffer, parser.input[parser.input_pos:]) |
68 |
parser.input_pos += n |
69 |
return n, nil |
70 |
} |
71 |
|
72 |
// Reader read handler. |
73 |
func yaml_reader_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { |
74 |
return parser.input_reader.Read(buffer) |
75 |
} |
76 |
|
77 |
// Set a string input. |
78 |
func yaml_parser_set_input_string(parser *yaml_parser_t, input []byte) { |
79 |
if parser.read_handler != nil { |
80 |
panic("must set the input source only once") |
81 |
} |
82 |
parser.read_handler = yaml_string_read_handler |
83 |
parser.input = input |
84 |
parser.input_pos = 0 |
85 |
} |
86 |
|
87 |
// Set a file input. |
88 |
func yaml_parser_set_input_reader(parser *yaml_parser_t, r io.Reader) { |
89 |
if parser.read_handler != nil { |
90 |
panic("must set the input source only once") |
91 |
} |
92 |
parser.read_handler = yaml_reader_read_handler |
93 |
parser.input_reader = r |
94 |
} |
95 |
|
96 |
// Set the source encoding. |
97 |
func yaml_parser_set_encoding(parser *yaml_parser_t, encoding yaml_encoding_t) { |
98 |
if parser.encoding != yaml_ANY_ENCODING { |
99 |
panic("must set the encoding only once") |
100 |
} |
101 |
parser.encoding = encoding |
102 |
} |
103 |
|
104 |
// Create a new emitter object. |
105 |
func yaml_emitter_initialize(emitter *yaml_emitter_t) { |
106 |
*emitter = yaml_emitter_t{ |
107 |
buffer: make([]byte, output_buffer_size), |
108 |
raw_buffer: make([]byte, 0, output_raw_buffer_size), |
109 |
states: make([]yaml_emitter_state_t, 0, initial_stack_size), |
110 |
events: make([]yaml_event_t, 0, initial_queue_size), |
111 |
best_width: -1, |
112 |
} |
113 |
} |
114 |
|
115 |
// Destroy an emitter object. |
116 |
func yaml_emitter_delete(emitter *yaml_emitter_t) { |
117 |
*emitter = yaml_emitter_t{} |
118 |
} |
119 |
|
120 |
// String write handler. |
121 |
func yaml_string_write_handler(emitter *yaml_emitter_t, buffer []byte) error { |
122 |
*emitter.output_buffer = append(*emitter.output_buffer, buffer...) |
123 |
return nil |
124 |
} |
125 |
|
126 |
// yaml_writer_write_handler uses emitter.output_writer to write the |
127 |
// emitted text. |
128 |
func yaml_writer_write_handler(emitter *yaml_emitter_t, buffer []byte) error { |
129 |
_, err := emitter.output_writer.Write(buffer) |
130 |
return err |
131 |
} |
132 |
|
133 |
// Set a string output. |
134 |
func yaml_emitter_set_output_string(emitter *yaml_emitter_t, output_buffer *[]byte) { |
135 |
if emitter.write_handler != nil { |
136 |
panic("must set the output target only once") |
137 |
} |
138 |
emitter.write_handler = yaml_string_write_handler |
139 |
emitter.output_buffer = output_buffer |
140 |
} |
141 |
|
142 |
// Set a file output. |
143 |
func yaml_emitter_set_output_writer(emitter *yaml_emitter_t, w io.Writer) { |
144 |
if emitter.write_handler != nil { |
145 |
panic("must set the output target only once") |
146 |
} |
147 |
emitter.write_handler = yaml_writer_write_handler |
148 |
emitter.output_writer = w |
149 |
} |
150 |
|
151 |
// Set the output encoding. |
152 |
func yaml_emitter_set_encoding(emitter *yaml_emitter_t, encoding yaml_encoding_t) { |
153 |
if emitter.encoding != yaml_ANY_ENCODING { |
154 |
panic("must set the output encoding only once") |
155 |
} |
156 |
emitter.encoding = encoding |
157 |
} |
158 |
|
159 |
// Set the canonical output style. |
160 |
func yaml_emitter_set_canonical(emitter *yaml_emitter_t, canonical bool) { |
161 |
emitter.canonical = canonical |
162 |
} |
163 |
|
164 |
// Set the indentation increment. |
165 |
func yaml_emitter_set_indent(emitter *yaml_emitter_t, indent int) { |
166 |
if indent < 2 || indent > 9 { |
167 |
indent = 2 |
168 |
} |
169 |
emitter.best_indent = indent |
170 |
} |
171 |
|
172 |
// Set the preferred line width. |
173 |
func yaml_emitter_set_width(emitter *yaml_emitter_t, width int) { |
174 |
if width < 0 { |
175 |
width = -1 |
176 |
} |
177 |
emitter.best_width = width |
178 |
} |
179 |
|
180 |
// Set if unescaped non-ASCII characters are allowed. |
181 |
func yaml_emitter_set_unicode(emitter *yaml_emitter_t, unicode bool) { |
182 |
emitter.unicode = unicode |
183 |
} |
184 |
|
185 |
// Set the preferred line break character. |
186 |
func yaml_emitter_set_break(emitter *yaml_emitter_t, line_break yaml_break_t) { |
187 |
emitter.line_break = line_break |
188 |
} |
189 |
|
190 |
///* |
191 |
// * Destroy a token object. |
192 |
// */ |
193 |
// |
194 |
//YAML_DECLARE(void) |
195 |
//yaml_token_delete(yaml_token_t *token) |
196 |
//{ |
197 |
// assert(token); // Non-NULL token object expected. |
198 |
// |
199 |
// switch (token.type) |
200 |
// { |
201 |
// case YAML_TAG_DIRECTIVE_TOKEN: |
202 |
// yaml_free(token.data.tag_directive.handle); |
203 |
// yaml_free(token.data.tag_directive.prefix); |
204 |
// break; |
205 |
// |
206 |
// case YAML_ALIAS_TOKEN: |
207 |
// yaml_free(token.data.alias.value); |
208 |
// break; |
209 |
// |
210 |
// case YAML_ANCHOR_TOKEN: |
211 |
// yaml_free(token.data.anchor.value); |
212 |
// break; |
213 |
// |
214 |
// case YAML_TAG_TOKEN: |
215 |
// yaml_free(token.data.tag.handle); |
216 |
// yaml_free(token.data.tag.suffix); |
217 |
// break; |
218 |
// |
219 |
// case YAML_SCALAR_TOKEN: |
220 |
// yaml_free(token.data.scalar.value); |
221 |
// break; |
222 |
// |
223 |
// default: |
224 |
// break; |
225 |
// } |
226 |
// |
227 |
// memset(token, 0, sizeof(yaml_token_t)); |
228 |
//} |
229 |
// |
230 |
///* |
231 |
// * Check if a string is a valid UTF-8 sequence. |
232 |
// * |
233 |
// * Check 'reader.c' for more details on UTF-8 encoding. |
234 |
// */ |
235 |
// |
236 |
//static int |
237 |
//yaml_check_utf8(yaml_char_t *start, size_t length) |
238 |
//{ |
239 |
// yaml_char_t *end = start+length; |
240 |
// yaml_char_t *pointer = start; |
241 |
// |
242 |
// while (pointer < end) { |
243 |
// unsigned char octet; |
244 |
// unsigned int width; |
245 |
// unsigned int value; |
246 |
// size_t k; |
247 |
// |
248 |
// octet = pointer[0]; |
249 |
// width = (octet & 0x80) == 0x00 ? 1 : |
250 |
// (octet & 0xE0) == 0xC0 ? 2 : |
251 |
// (octet & 0xF0) == 0xE0 ? 3 : |
252 |
// (octet & 0xF8) == 0xF0 ? 4 : 0; |
253 |
// value = (octet & 0x80) == 0x00 ? octet & 0x7F : |
254 |
// (octet & 0xE0) == 0xC0 ? octet & 0x1F : |
255 |
// (octet & 0xF0) == 0xE0 ? octet & 0x0F : |
256 |
// (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0; |
257 |
// if (!width) return 0; |
258 |
// if (pointer+width > end) return 0; |
259 |
// for (k = 1; k < width; k ++) { |
260 |
// octet = pointer[k]; |
261 |
// if ((octet & 0xC0) != 0x80) return 0; |
262 |
// value = (value << 6) + (octet & 0x3F); |
263 |
// } |
264 |
// if (!((width == 1) || |
265 |
// (width == 2 && value >= 0x80) || |
266 |
// (width == 3 && value >= 0x800) || |
267 |
// (width == 4 && value >= 0x10000))) return 0; |
268 |
// |
269 |
// pointer += width; |
270 |
// } |
271 |
// |
272 |
// return 1; |
273 |
//} |
274 |
// |
275 |
|
276 |
// Create STREAM-START. |
277 |
func yaml_stream_start_event_initialize(event *yaml_event_t, encoding yaml_encoding_t) { |
278 |
*event = yaml_event_t{ |
279 |
typ: yaml_STREAM_START_EVENT, |
280 |
encoding: encoding, |
281 |
} |
282 |
} |
283 |
|
284 |
// Create STREAM-END. |
285 |
func yaml_stream_end_event_initialize(event *yaml_event_t) { |
286 |
*event = yaml_event_t{ |
287 |
typ: yaml_STREAM_END_EVENT, |
288 |
} |
289 |
} |
290 |
|
291 |
// Create DOCUMENT-START. |
292 |
func yaml_document_start_event_initialize( |
293 |
event *yaml_event_t, |
294 |
version_directive *yaml_version_directive_t, |
295 |
tag_directives []yaml_tag_directive_t, |
296 |
implicit bool, |
297 |
) { |
298 |
*event = yaml_event_t{ |
299 |
typ: yaml_DOCUMENT_START_EVENT, |
300 |
version_directive: version_directive, |
301 |
tag_directives: tag_directives, |
302 |
implicit: implicit, |
303 |
} |
304 |
} |
305 |
|
306 |
// Create DOCUMENT-END. |
307 |
func yaml_document_end_event_initialize(event *yaml_event_t, implicit bool) { |
308 |
*event = yaml_event_t{ |
309 |
typ: yaml_DOCUMENT_END_EVENT, |
310 |
implicit: implicit, |
311 |
} |
312 |
} |
313 |
|
314 |
// Create ALIAS. |
315 |
func yaml_alias_event_initialize(event *yaml_event_t, anchor []byte) bool { |
316 |
*event = yaml_event_t{ |
317 |
typ: yaml_ALIAS_EVENT, |
318 |
anchor: anchor, |
319 |
} |
320 |
return true |
321 |
} |
322 |
|
323 |
// Create SCALAR. |
324 |
func yaml_scalar_event_initialize(event *yaml_event_t, anchor, tag, value []byte, plain_implicit, quoted_implicit bool, style yaml_scalar_style_t) bool { |
325 |
*event = yaml_event_t{ |
326 |
typ: yaml_SCALAR_EVENT, |
327 |
anchor: anchor, |
328 |
tag: tag, |
329 |
value: value, |
330 |
implicit: plain_implicit, |
331 |
quoted_implicit: quoted_implicit, |
332 |
style: yaml_style_t(style), |
333 |
} |
334 |
return true |
335 |
} |
336 |
|
337 |
// Create SEQUENCE-START. |
338 |
func yaml_sequence_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_sequence_style_t) bool { |
339 |
*event = yaml_event_t{ |
340 |
typ: yaml_SEQUENCE_START_EVENT, |
341 |
anchor: anchor, |
342 |
tag: tag, |
343 |
implicit: implicit, |
344 |
style: yaml_style_t(style), |
345 |
} |
346 |
return true |
347 |
} |
348 |
|
349 |
// Create SEQUENCE-END. |
350 |
func yaml_sequence_end_event_initialize(event *yaml_event_t) bool { |
351 |
*event = yaml_event_t{ |
352 |
typ: yaml_SEQUENCE_END_EVENT, |
353 |
} |
354 |
return true |
355 |
} |
356 |
|
357 |
// Create MAPPING-START. |
358 |
func yaml_mapping_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_mapping_style_t) { |
359 |
*event = yaml_event_t{ |
360 |
typ: yaml_MAPPING_START_EVENT, |
361 |
anchor: anchor, |
362 |
tag: tag, |
363 |
implicit: implicit, |
364 |
style: yaml_style_t(style), |
365 |
} |
366 |
} |
367 |
|
368 |
// Create MAPPING-END. |
369 |
func yaml_mapping_end_event_initialize(event *yaml_event_t) { |
370 |
*event = yaml_event_t{ |
371 |
typ: yaml_MAPPING_END_EVENT, |
372 |
} |
373 |
} |
374 |
|
375 |
// Destroy an event object. |
376 |
func yaml_event_delete(event *yaml_event_t) { |
377 |
*event = yaml_event_t{} |
378 |
} |
379 |
|
380 |
///* |
381 |
// * Create a document object. |
382 |
// */ |
383 |
// |
384 |
//YAML_DECLARE(int) |
385 |
//yaml_document_initialize(document *yaml_document_t, |
386 |
// version_directive *yaml_version_directive_t, |
387 |
// tag_directives_start *yaml_tag_directive_t, |
388 |
// tag_directives_end *yaml_tag_directive_t, |
389 |
// start_implicit int, end_implicit int) |
390 |
//{ |
391 |
// struct { |
392 |
// error yaml_error_type_t |
393 |
// } context |
394 |
// struct { |
395 |
// start *yaml_node_t |
396 |
// end *yaml_node_t |
397 |
// top *yaml_node_t |
398 |
// } nodes = { NULL, NULL, NULL } |
399 |
// version_directive_copy *yaml_version_directive_t = NULL |
400 |
// struct { |
401 |
// start *yaml_tag_directive_t |
402 |
// end *yaml_tag_directive_t |
403 |
// top *yaml_tag_directive_t |
404 |
// } tag_directives_copy = { NULL, NULL, NULL } |
405 |
// value yaml_tag_directive_t = { NULL, NULL } |
406 |
// mark yaml_mark_t = { 0, 0, 0 } |
407 |
// |
408 |
// assert(document) // Non-NULL document object is expected. |
409 |
// assert((tag_directives_start && tag_directives_end) || |
410 |
// (tag_directives_start == tag_directives_end)) |
411 |
// // Valid tag directives are expected. |
412 |
// |
413 |
// if (!STACK_INIT(&context, nodes, INITIAL_STACK_SIZE)) goto error |
414 |
// |
415 |
// if (version_directive) { |
416 |
// version_directive_copy = yaml_malloc(sizeof(yaml_version_directive_t)) |
417 |
// if (!version_directive_copy) goto error |
418 |
// version_directive_copy.major = version_directive.major |
419 |
// version_directive_copy.minor = version_directive.minor |
420 |
// } |
421 |
// |
422 |
// if (tag_directives_start != tag_directives_end) { |
423 |
// tag_directive *yaml_tag_directive_t |
424 |
// if (!STACK_INIT(&context, tag_directives_copy, INITIAL_STACK_SIZE)) |
425 |
// goto error |
426 |
// for (tag_directive = tag_directives_start |
427 |
// tag_directive != tag_directives_end; tag_directive ++) { |
428 |
// assert(tag_directive.handle) |
429 |
// assert(tag_directive.prefix) |
430 |
// if (!yaml_check_utf8(tag_directive.handle, |
431 |
// strlen((char *)tag_directive.handle))) |
432 |
// goto error |
433 |
// if (!yaml_check_utf8(tag_directive.prefix, |
434 |
// strlen((char *)tag_directive.prefix))) |
435 |
// goto error |
436 |
// value.handle = yaml_strdup(tag_directive.handle) |
437 |
// value.prefix = yaml_strdup(tag_directive.prefix) |
438 |
// if (!value.handle || !value.prefix) goto error |
439 |
// if (!PUSH(&context, tag_directives_copy, value)) |
440 |
// goto error |
441 |
// value.handle = NULL |
442 |
// value.prefix = NULL |
443 |
// } |
444 |
// } |
445 |
// |
446 |
// DOCUMENT_INIT(*document, nodes.start, nodes.end, version_directive_copy, |
447 |
// tag_directives_copy.start, tag_directives_copy.top, |
448 |
// start_implicit, end_implicit, mark, mark) |
449 |
// |
450 |
// return 1 |
451 |
// |
452 |
//error: |
453 |
// STACK_DEL(&context, nodes) |
454 |
// yaml_free(version_directive_copy) |
455 |
// while (!STACK_EMPTY(&context, tag_directives_copy)) { |
456 |
// value yaml_tag_directive_t = POP(&context, tag_directives_copy) |
457 |
// yaml_free(value.handle) |
458 |
// yaml_free(value.prefix) |
459 |
// } |
460 |
// STACK_DEL(&context, tag_directives_copy) |
461 |
// yaml_free(value.handle) |
462 |
// yaml_free(value.prefix) |
463 |
// |
464 |
// return 0 |
465 |
//} |
466 |
// |
467 |
///* |
468 |
// * Destroy a document object. |
469 |
// */ |
470 |
// |
471 |
//YAML_DECLARE(void) |
472 |
//yaml_document_delete(document *yaml_document_t) |
473 |
//{ |
474 |
// struct { |
475 |
// error yaml_error_type_t |
476 |
// } context |
477 |
// tag_directive *yaml_tag_directive_t |
478 |
// |
479 |
// context.error = YAML_NO_ERROR // Eliminate a compiler warning. |
480 |
// |
481 |
// assert(document) // Non-NULL document object is expected. |
482 |
// |
483 |
// while (!STACK_EMPTY(&context, document.nodes)) { |
484 |
// node yaml_node_t = POP(&context, document.nodes) |
485 |
// yaml_free(node.tag) |
486 |
// switch (node.type) { |
487 |
// case YAML_SCALAR_NODE: |
488 |
// yaml_free(node.data.scalar.value) |
489 |
// break |
490 |
// case YAML_SEQUENCE_NODE: |
491 |
// STACK_DEL(&context, node.data.sequence.items) |
492 |
// break |
493 |
// case YAML_MAPPING_NODE: |
494 |
// STACK_DEL(&context, node.data.mapping.pairs) |
495 |
// break |
496 |
// default: |
497 |
// assert(0) // Should not happen. |
498 |
// } |
499 |
// } |
500 |
// STACK_DEL(&context, document.nodes) |
501 |
// |
502 |
// yaml_free(document.version_directive) |
503 |
// for (tag_directive = document.tag_directives.start |
504 |
// tag_directive != document.tag_directives.end |
505 |
// tag_directive++) { |
506 |
// yaml_free(tag_directive.handle) |
507 |
// yaml_free(tag_directive.prefix) |
508 |
// } |
509 |
// yaml_free(document.tag_directives.start) |
510 |
// |
511 |
// memset(document, 0, sizeof(yaml_document_t)) |
512 |
//} |
513 |
// |
514 |
///** |
515 |
// * Get a document node. |
516 |
// */ |
517 |
// |
518 |
//YAML_DECLARE(yaml_node_t *) |
519 |
//yaml_document_get_node(document *yaml_document_t, index int) |
520 |
//{ |
521 |
// assert(document) // Non-NULL document object is expected. |
522 |
// |
523 |
// if (index > 0 && document.nodes.start + index <= document.nodes.top) { |
524 |
// return document.nodes.start + index - 1 |
525 |
// } |
526 |
// return NULL |
527 |
//} |
528 |
// |
529 |
///** |
530 |
// * Get the root object. |
531 |
// */ |
532 |
// |
533 |
//YAML_DECLARE(yaml_node_t *) |
534 |
//yaml_document_get_root_node(document *yaml_document_t) |
535 |
//{ |
536 |
// assert(document) // Non-NULL document object is expected. |
537 |
// |
538 |
// if (document.nodes.top != document.nodes.start) { |
539 |
// return document.nodes.start |
540 |
// } |
541 |
// return NULL |
542 |
//} |
543 |
// |
544 |
///* |
545 |
// * Add a scalar node to a document. |
546 |
// */ |
547 |
// |
548 |
//YAML_DECLARE(int) |
549 |
//yaml_document_add_scalar(document *yaml_document_t, |
550 |
// tag *yaml_char_t, value *yaml_char_t, length int, |
551 |
// style yaml_scalar_style_t) |
552 |
//{ |
553 |
// struct { |
554 |
// error yaml_error_type_t |
555 |
// } context |
556 |
// mark yaml_mark_t = { 0, 0, 0 } |
557 |
// tag_copy *yaml_char_t = NULL |
558 |
// value_copy *yaml_char_t = NULL |
559 |
// node yaml_node_t |
560 |
// |
561 |
// assert(document) // Non-NULL document object is expected. |
562 |
// assert(value) // Non-NULL value is expected. |
563 |
// |
564 |
// if (!tag) { |
565 |
// tag = (yaml_char_t *)YAML_DEFAULT_SCALAR_TAG |
566 |
// } |
567 |
// |
568 |
// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error |
569 |
// tag_copy = yaml_strdup(tag) |
570 |
// if (!tag_copy) goto error |
571 |
// |
572 |
// if (length < 0) { |
573 |
// length = strlen((char *)value) |
574 |
// } |
575 |
// |
576 |
// if (!yaml_check_utf8(value, length)) goto error |
577 |
// value_copy = yaml_malloc(length+1) |
578 |
// if (!value_copy) goto error |
579 |
// memcpy(value_copy, value, length) |
580 |
// value_copy[length] = '\0' |
581 |
// |
582 |
// SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark) |
583 |
// if (!PUSH(&context, document.nodes, node)) goto error |
584 |
// |
585 |
// return document.nodes.top - document.nodes.start |
586 |
// |
587 |
//error: |
588 |
// yaml_free(tag_copy) |
589 |
// yaml_free(value_copy) |
590 |
// |
591 |
// return 0 |
592 |
//} |
593 |
// |
594 |
///* |
595 |
// * Add a sequence node to a document. |
596 |
// */ |
597 |
// |
598 |
//YAML_DECLARE(int) |
599 |
//yaml_document_add_sequence(document *yaml_document_t, |
600 |
// tag *yaml_char_t, style yaml_sequence_style_t) |
601 |
//{ |
602 |
// struct { |
603 |
// error yaml_error_type_t |
604 |
// } context |
605 |
// mark yaml_mark_t = { 0, 0, 0 } |
606 |
// tag_copy *yaml_char_t = NULL |
607 |
// struct { |
608 |
// start *yaml_node_item_t |
609 |
// end *yaml_node_item_t |
610 |
// top *yaml_node_item_t |
611 |
// } items = { NULL, NULL, NULL } |
612 |
// node yaml_node_t |
613 |
// |
614 |
// assert(document) // Non-NULL document object is expected. |
615 |
// |
616 |
// if (!tag) { |
617 |
// tag = (yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG |
618 |
// } |
619 |
// |
620 |
// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error |
621 |
// tag_copy = yaml_strdup(tag) |
622 |
// if (!tag_copy) goto error |
623 |
// |
624 |
// if (!STACK_INIT(&context, items, INITIAL_STACK_SIZE)) goto error |
625 |
// |
626 |
// SEQUENCE_NODE_INIT(node, tag_copy, items.start, items.end, |
627 |
// style, mark, mark) |
628 |
// if (!PUSH(&context, document.nodes, node)) goto error |
629 |
// |
630 |
// return document.nodes.top - document.nodes.start |
631 |
// |
632 |
//error: |
633 |
// STACK_DEL(&context, items) |
634 |
// yaml_free(tag_copy) |
635 |
// |
636 |
// return 0 |
637 |
//} |
638 |
// |
639 |
///* |
640 |
// * Add a mapping node to a document. |
641 |
// */ |
642 |
// |
643 |
//YAML_DECLARE(int) |
644 |
//yaml_document_add_mapping(document *yaml_document_t, |
645 |
// tag *yaml_char_t, style yaml_mapping_style_t) |
646 |
//{ |
647 |
// struct { |
648 |
// error yaml_error_type_t |
649 |
// } context |
650 |
// mark yaml_mark_t = { 0, 0, 0 } |
651 |
// tag_copy *yaml_char_t = NULL |
652 |
// struct { |
653 |
// start *yaml_node_pair_t |
654 |
// end *yaml_node_pair_t |
655 |
// top *yaml_node_pair_t |
656 |
// } pairs = { NULL, NULL, NULL } |
657 |
// node yaml_node_t |
658 |
// |
659 |
// assert(document) // Non-NULL document object is expected. |
660 |
// |
661 |
// if (!tag) { |
662 |
// tag = (yaml_char_t *)YAML_DEFAULT_MAPPING_TAG |
663 |
// } |
664 |
// |
665 |
// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error |
666 |
// tag_copy = yaml_strdup(tag) |
667 |
// if (!tag_copy) goto error |
668 |
// |
669 |
// if (!STACK_INIT(&context, pairs, INITIAL_STACK_SIZE)) goto error |
670 |
// |
671 |
// MAPPING_NODE_INIT(node, tag_copy, pairs.start, pairs.end, |
672 |
// style, mark, mark) |
673 |
// if (!PUSH(&context, document.nodes, node)) goto error |
674 |
// |
675 |
// return document.nodes.top - document.nodes.start |
676 |
// |
677 |
//error: |
678 |
// STACK_DEL(&context, pairs) |
679 |
// yaml_free(tag_copy) |
680 |
// |
681 |
// return 0 |
682 |
//} |
683 |
// |
684 |
///* |
685 |
// * Append an item to a sequence node. |
686 |
// */ |
687 |
// |
688 |
//YAML_DECLARE(int) |
689 |
//yaml_document_append_sequence_item(document *yaml_document_t, |
690 |
// sequence int, item int) |
691 |
//{ |
692 |
// struct { |
693 |
// error yaml_error_type_t |
694 |
// } context |
695 |
// |
696 |
// assert(document) // Non-NULL document is required. |
697 |
// assert(sequence > 0 |
698 |
// && document.nodes.start + sequence <= document.nodes.top) |
699 |
// // Valid sequence id is required. |
700 |
// assert(document.nodes.start[sequence-1].type == YAML_SEQUENCE_NODE) |
701 |
// // A sequence node is required. |
702 |
// assert(item > 0 && document.nodes.start + item <= document.nodes.top) |
703 |
// // Valid item id is required. |
704 |
// |
705 |
// if (!PUSH(&context, |
706 |
// document.nodes.start[sequence-1].data.sequence.items, item)) |
707 |
// return 0 |
708 |
// |
709 |
// return 1 |
710 |
//} |
711 |
// |
712 |
///* |
713 |
// * Append a pair of a key and a value to a mapping node. |
714 |
// */ |
715 |
// |
716 |
//YAML_DECLARE(int) |
717 |
//yaml_document_append_mapping_pair(document *yaml_document_t, |
718 |
// mapping int, key int, value int) |
719 |
//{ |
720 |
// struct { |
721 |
// error yaml_error_type_t |
722 |
// } context |
723 |
// |
724 |
// pair yaml_node_pair_t |
725 |
// |
726 |
// assert(document) // Non-NULL document is required. |
727 |
// assert(mapping > 0 |
728 |
// && document.nodes.start + mapping <= document.nodes.top) |
729 |
// // Valid mapping id is required. |
730 |
// assert(document.nodes.start[mapping-1].type == YAML_MAPPING_NODE) |
731 |
// // A mapping node is required. |
732 |
// assert(key > 0 && document.nodes.start + key <= document.nodes.top) |
733 |
// // Valid key id is required. |
734 |
// assert(value > 0 && document.nodes.start + value <= document.nodes.top) |
735 |
// // Valid value id is required. |
736 |
// |
737 |
// pair.key = key |
738 |
// pair.value = value |
739 |
// |
740 |
// if (!PUSH(&context, |
741 |
// document.nodes.start[mapping-1].data.mapping.pairs, pair)) |
742 |
// return 0 |
743 |
// |
744 |
// return 1 |
745 |
//} |
746 |
// |
747 |
// |