api.go 21 KB

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