psych 3.1.0-java → 3.3.2-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/ext/psych/yaml/api.c CHANGED
@@ -118,7 +118,12 @@ yaml_string_join(
118
118
  YAML_DECLARE(int)
119
119
  yaml_stack_extend(void **start, void **top, void **end)
120
120
  {
121
- void *new_start = yaml_realloc(*start, ((char *)*end - (char *)*start)*2);
121
+ void *new_start;
122
+
123
+ if ((char *)*end - (char *)*start >= INT_MAX / 2)
124
+ return 0;
125
+
126
+ new_start = yaml_realloc(*start, ((char *)*end - (char *)*start)*2);
122
127
 
123
128
  if (!new_start) return 0;
124
129
 
@@ -618,10 +623,10 @@ yaml_token_delete(yaml_token_t *token)
618
623
  */
619
624
 
620
625
  static int
621
- yaml_check_utf8(yaml_char_t *start, size_t length)
626
+ yaml_check_utf8(const yaml_char_t *start, size_t length)
622
627
  {
623
- yaml_char_t *end = start+length;
624
- yaml_char_t *pointer = start;
628
+ const yaml_char_t *end = start+length;
629
+ const yaml_char_t *pointer = start;
625
630
 
626
631
  while (pointer < end) {
627
632
  unsigned char octet;
@@ -789,7 +794,7 @@ yaml_document_end_event_initialize(yaml_event_t *event, int implicit)
789
794
  */
790
795
 
791
796
  YAML_DECLARE(int)
792
- yaml_alias_event_initialize(yaml_event_t *event, yaml_char_t *anchor)
797
+ yaml_alias_event_initialize(yaml_event_t *event, const yaml_char_t *anchor)
793
798
  {
794
799
  yaml_mark_t mark = { 0, 0, 0 };
795
800
  yaml_char_t *anchor_copy = NULL;
@@ -814,8 +819,8 @@ yaml_alias_event_initialize(yaml_event_t *event, yaml_char_t *anchor)
814
819
 
815
820
  YAML_DECLARE(int)
816
821
  yaml_scalar_event_initialize(yaml_event_t *event,
817
- yaml_char_t *anchor, yaml_char_t *tag,
818
- yaml_char_t *value, int length,
822
+ const yaml_char_t *anchor, const yaml_char_t *tag,
823
+ const yaml_char_t *value, int length,
819
824
  int plain_implicit, int quoted_implicit,
820
825
  yaml_scalar_style_t style)
821
826
  {
@@ -840,7 +845,7 @@ yaml_scalar_event_initialize(yaml_event_t *event,
840
845
  }
841
846
 
842
847
  if (length < 0) {
843
- length = strlen((char *)value);
848
+ length = (int)strlen((char *)value);
844
849
  }
845
850
 
846
851
  if (!yaml_check_utf8(value, length)) goto error;
@@ -868,7 +873,7 @@ error:
868
873
 
869
874
  YAML_DECLARE(int)
870
875
  yaml_sequence_start_event_initialize(yaml_event_t *event,
871
- yaml_char_t *anchor, yaml_char_t *tag, int implicit,
876
+ const yaml_char_t *anchor, const yaml_char_t *tag, int implicit,
872
877
  yaml_sequence_style_t style)
873
878
  {
874
879
  yaml_mark_t mark = { 0, 0, 0 };
@@ -923,7 +928,7 @@ yaml_sequence_end_event_initialize(yaml_event_t *event)
923
928
 
924
929
  YAML_DECLARE(int)
925
930
  yaml_mapping_start_event_initialize(yaml_event_t *event,
926
- yaml_char_t *anchor, yaml_char_t *tag, int implicit,
931
+ const yaml_char_t *anchor, const yaml_char_t *tag, int implicit,
927
932
  yaml_mapping_style_t style)
928
933
  {
929
934
  yaml_mark_t mark = { 0, 0, 0 };
@@ -1117,13 +1122,8 @@ error:
1117
1122
  YAML_DECLARE(void)
1118
1123
  yaml_document_delete(yaml_document_t *document)
1119
1124
  {
1120
- struct {
1121
- yaml_error_type_t error;
1122
- } context;
1123
1125
  yaml_tag_directive_t *tag_directive;
1124
1126
 
1125
- context.error = YAML_NO_ERROR; /* Eliminate a compliler warning. */
1126
-
1127
1127
  assert(document); /* Non-NULL document object is expected. */
1128
1128
 
1129
1129
  while (!STACK_EMPTY(&context, document->nodes)) {
@@ -1193,7 +1193,7 @@ yaml_document_get_root_node(yaml_document_t *document)
1193
1193
 
1194
1194
  YAML_DECLARE(int)
1195
1195
  yaml_document_add_scalar(yaml_document_t *document,
1196
- yaml_char_t *tag, yaml_char_t *value, int length,
1196
+ const yaml_char_t *tag, const yaml_char_t *value, int length,
1197
1197
  yaml_scalar_style_t style)
1198
1198
  {
1199
1199
  struct {
@@ -1216,7 +1216,7 @@ yaml_document_add_scalar(yaml_document_t *document,
1216
1216
  if (!tag_copy) goto error;
1217
1217
 
1218
1218
  if (length < 0) {
1219
- length = strlen((char *)value);
1219
+ length = (int)strlen((char *)value);
1220
1220
  }
1221
1221
 
1222
1222
  if (!yaml_check_utf8(value, length)) goto error;
@@ -1228,7 +1228,7 @@ yaml_document_add_scalar(yaml_document_t *document,
1228
1228
  SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark);
1229
1229
  if (!PUSH(&context, document->nodes, node)) goto error;
1230
1230
 
1231
- return document->nodes.top - document->nodes.start;
1231
+ return (int)(document->nodes.top - document->nodes.start);
1232
1232
 
1233
1233
  error:
1234
1234
  yaml_free(tag_copy);
@@ -1243,7 +1243,7 @@ error:
1243
1243
 
1244
1244
  YAML_DECLARE(int)
1245
1245
  yaml_document_add_sequence(yaml_document_t *document,
1246
- yaml_char_t *tag, yaml_sequence_style_t style)
1246
+ const yaml_char_t *tag, yaml_sequence_style_t style)
1247
1247
  {
1248
1248
  struct {
1249
1249
  yaml_error_type_t error;
@@ -1273,7 +1273,7 @@ yaml_document_add_sequence(yaml_document_t *document,
1273
1273
  style, mark, mark);
1274
1274
  if (!PUSH(&context, document->nodes, node)) goto error;
1275
1275
 
1276
- return document->nodes.top - document->nodes.start;
1276
+ return (int)(document->nodes.top - document->nodes.start);
1277
1277
 
1278
1278
  error:
1279
1279
  STACK_DEL(&context, items);
@@ -1288,7 +1288,7 @@ error:
1288
1288
 
1289
1289
  YAML_DECLARE(int)
1290
1290
  yaml_document_add_mapping(yaml_document_t *document,
1291
- yaml_char_t *tag, yaml_mapping_style_t style)
1291
+ const yaml_char_t *tag, yaml_mapping_style_t style)
1292
1292
  {
1293
1293
  struct {
1294
1294
  yaml_error_type_t error;
@@ -1318,7 +1318,7 @@ yaml_document_add_mapping(yaml_document_t *document,
1318
1318
  style, mark, mark);
1319
1319
  if (!PUSH(&context, document->nodes, node)) goto error;
1320
1320
 
1321
- return document->nodes.top - document->nodes.start;
1321
+ return (int)(document->nodes.top - document->nodes.start);
1322
1322
 
1323
1323
  error:
1324
1324
  STACK_DEL(&context, pairs);
@@ -1,10 +1,80 @@
1
+ /* include/config.h. Generated from config.h.in by configure. */
2
+ /* include/config.h.in. Generated from configure.ac by autoheader. */
3
+
4
+ /* Define to 1 if you have the <dlfcn.h> header file. */
5
+ #define HAVE_DLFCN_H 1
6
+
7
+ /* Define to 1 if you have the <inttypes.h> header file. */
8
+ #define HAVE_INTTYPES_H 1
9
+
10
+ /* Define to 1 if you have the <memory.h> header file. */
11
+ #define HAVE_MEMORY_H 1
12
+
13
+ /* Define to 1 if you have the <stdint.h> header file. */
14
+ #define HAVE_STDINT_H 1
15
+
16
+ /* Define to 1 if you have the <stdlib.h> header file. */
17
+ #define HAVE_STDLIB_H 1
18
+
19
+ /* Define to 1 if you have the <strings.h> header file. */
20
+ #define HAVE_STRINGS_H 1
21
+
22
+ /* Define to 1 if you have the <string.h> header file. */
23
+ #define HAVE_STRING_H 1
24
+
25
+ /* Define to 1 if you have the <sys/stat.h> header file. */
26
+ #define HAVE_SYS_STAT_H 1
27
+
28
+ /* Define to 1 if you have the <sys/types.h> header file. */
29
+ #define HAVE_SYS_TYPES_H 1
30
+
31
+ /* Define to 1 if you have the <unistd.h> header file. */
32
+ #define HAVE_UNISTD_H 1
33
+
34
+ /* Define to the sub-directory where libtool stores uninstalled libraries. */
35
+ #define LT_OBJDIR ".libs/"
36
+
37
+ /* Name of package */
38
+ #define PACKAGE "yaml"
39
+
40
+ /* Define to the address where bug reports for this package should be sent. */
41
+ #define PACKAGE_BUGREPORT "https://github.com/yaml/libyaml/issues/new"
42
+
43
+ /* Define to the full name of this package. */
1
44
  #define PACKAGE_NAME "yaml"
45
+
46
+ /* Define to the full name and version of this package. */
47
+ #define PACKAGE_STRING "yaml 0.2.5"
48
+
49
+ /* Define to the one symbol short name of this package. */
2
50
  #define PACKAGE_TARNAME "yaml"
3
- #define PACKAGE_VERSION "0.2.1"
4
- #define PACKAGE_STRING "yaml 0.2.1"
5
- #define PACKAGE_BUGREPORT "https://github.com/yaml/libyaml/issues"
6
- #define PACKAGE_URL "https://github.com/yaml/libyaml"
51
+
52
+ /* Define to the home page for this package. */
53
+ #define PACKAGE_URL ""
54
+
55
+ /* Define to the version of this package. */
56
+ #define PACKAGE_VERSION "0.2.5"
57
+
58
+ /* Define to 1 if you have the ANSI C header files. */
59
+ #define STDC_HEADERS 1
60
+
61
+ /* Version number of package */
62
+ #define VERSION "0.2.5"
63
+
64
+ /* Define the major version number. */
7
65
  #define YAML_VERSION_MAJOR 0
66
+
67
+ /* Define the minor version number. */
8
68
  #define YAML_VERSION_MINOR 2
9
- #define YAML_VERSION_PATCH 1
10
- #define YAML_VERSION_STRING "0.2.1"
69
+
70
+ /* Define the patch version number. */
71
+ #define YAML_VERSION_PATCH 5
72
+
73
+ /* Define the version string. */
74
+ #define YAML_VERSION_STRING "0.2.5"
75
+
76
+ /* Define to empty if `const' does not conform to ANSI C. */
77
+ /* #undef const */
78
+
79
+ /* Define to `unsigned int' if <sys/types.h> does not define. */
80
+ /* #undef size_t */
@@ -131,7 +131,7 @@ yaml_emitter_dump(yaml_emitter_t *emitter, yaml_document_t *document)
131
131
 
132
132
  assert(emitter->opened); /* Emitter should be opened. */
133
133
 
134
- emitter->anchors = yaml_malloc(sizeof(*(emitter->anchors))
134
+ emitter->anchors = (yaml_anchors_t*)yaml_malloc(sizeof(*(emitter->anchors))
135
135
  * (document->nodes.top - document->nodes.start));
136
136
  if (!emitter->anchors) goto error;
137
137
  memset(emitter->anchors, 0, sizeof(*(emitter->anchors))
@@ -16,7 +16,7 @@
16
16
  #define PUT(emitter,value) \
17
17
  (FLUSH(emitter) \
18
18
  && (*(emitter->buffer.pointer++) = (yaml_char_t)(value), \
19
- emitter->column ++, \
19
+ emitter->column++, \
20
20
  1))
21
21
 
22
22
  /*
@@ -495,6 +495,7 @@ static int
495
495
  yaml_emitter_emit_stream_start(yaml_emitter_t *emitter,
496
496
  yaml_event_t *event)
497
497
  {
498
+ emitter->open_ended = 0;
498
499
  if (event->type == YAML_STREAM_START_EVENT)
499
500
  {
500
501
  if (!emitter->encoding) {
@@ -597,13 +598,20 @@ yaml_emitter_emit_document_start(yaml_emitter_t *emitter,
597
598
  if (!yaml_emitter_write_indent(emitter))
598
599
  return 0;
599
600
  }
601
+ emitter->open_ended = 0;
600
602
 
601
603
  if (event->data.document_start.version_directive) {
602
604
  implicit = 0;
603
605
  if (!yaml_emitter_write_indicator(emitter, "%YAML", 1, 0, 0))
604
606
  return 0;
605
- if (!yaml_emitter_write_indicator(emitter, "1.1", 1, 0, 0))
606
- return 0;
607
+ if (event->data.document_start.version_directive->minor == 1) {
608
+ if (!yaml_emitter_write_indicator(emitter, "1.1", 1, 0, 0))
609
+ return 0;
610
+ }
611
+ else {
612
+ if (!yaml_emitter_write_indicator(emitter, "1.2", 1, 0, 0))
613
+ return 0;
614
+ }
607
615
  if (!yaml_emitter_write_indent(emitter))
608
616
  return 0;
609
617
  }
@@ -644,19 +652,25 @@ yaml_emitter_emit_document_start(yaml_emitter_t *emitter,
644
652
 
645
653
  emitter->state = YAML_EMIT_DOCUMENT_CONTENT_STATE;
646
654
 
655
+ emitter->open_ended = 0;
647
656
  return 1;
648
657
  }
649
658
 
650
659
  else if (event->type == YAML_STREAM_END_EVENT)
651
660
  {
652
- if (emitter->open_ended)
661
+
662
+ /**
663
+ * This can happen if a block scalar with trailing empty lines
664
+ * is at the end of the stream
665
+ */
666
+ if (emitter->open_ended == 2)
653
667
  {
654
668
  if (!yaml_emitter_write_indicator(emitter, "...", 1, 0, 0))
655
669
  return 0;
670
+ emitter->open_ended = 0;
656
671
  if (!yaml_emitter_write_indent(emitter))
657
672
  return 0;
658
673
  }
659
-
660
674
  if (!yaml_emitter_flush(emitter))
661
675
  return 0;
662
676
 
@@ -698,9 +712,12 @@ yaml_emitter_emit_document_end(yaml_emitter_t *emitter,
698
712
  if (!event->data.document_end.implicit) {
699
713
  if (!yaml_emitter_write_indicator(emitter, "...", 1, 0, 0))
700
714
  return 0;
715
+ emitter->open_ended = 0;
701
716
  if (!yaml_emitter_write_indent(emitter))
702
717
  return 0;
703
718
  }
719
+ else if (!emitter->open_ended)
720
+ emitter->open_ended = 1;
704
721
  if (!yaml_emitter_flush(emitter))
705
722
  return 0;
706
723
 
@@ -1006,6 +1023,8 @@ yaml_emitter_emit_alias(yaml_emitter_t *emitter, SHIM(yaml_event_t *event))
1006
1023
  {
1007
1024
  if (!yaml_emitter_process_anchor(emitter))
1008
1025
  return 0;
1026
+ if (emitter->simple_key_context)
1027
+ if (!PUT(emitter, ' ')) return 0;
1009
1028
  emitter->state = POP(emitter, emitter->states);
1010
1029
 
1011
1030
  return 1;
@@ -1333,7 +1352,10 @@ static int
1333
1352
  yaml_emitter_analyze_version_directive(yaml_emitter_t *emitter,
1334
1353
  yaml_version_directive_t version_directive)
1335
1354
  {
1336
- if (version_directive.major != 1 || version_directive.minor != 1) {
1355
+ if (version_directive.major != 1 || (
1356
+ version_directive.minor != 1
1357
+ && version_directive.minor != 2
1358
+ )) {
1337
1359
  return yaml_emitter_set_emitter_error(emitter,
1338
1360
  "incompatible %YAML directive");
1339
1361
  }
@@ -1803,7 +1825,6 @@ yaml_emitter_write_indicator(yaml_emitter_t *emitter,
1803
1825
 
1804
1826
  emitter->whitespace = is_whitespace;
1805
1827
  emitter->indention = (emitter->indention && is_indention);
1806
- emitter->open_ended = 0;
1807
1828
 
1808
1829
  return 1;
1809
1830
  }
@@ -1904,7 +1925,17 @@ yaml_emitter_write_plain_scalar(yaml_emitter_t *emitter,
1904
1925
 
1905
1926
  STRING_ASSIGN(string, value, length);
1906
1927
 
1907
- if (!emitter->whitespace) {
1928
+ /**
1929
+ * Avoid trailing spaces for empty values in block mode.
1930
+ * In flow mode, we still want the space to prevent ambiguous things
1931
+ * like {a:}.
1932
+ * Currently, the emitter forbids any plain empty scalar in flow mode
1933
+ * (e.g. it outputs {a: ''} instead), so emitter->flow_level will
1934
+ * never be true here.
1935
+ * But if the emitter is ever changed to allow emitting empty values,
1936
+ * the check for flow_level is already here.
1937
+ */
1938
+ if (!emitter->whitespace && (length || emitter->flow_level)) {
1908
1939
  if (!PUT(emitter, ' ')) return 0;
1909
1940
  }
1910
1941
 
@@ -2004,6 +2035,9 @@ yaml_emitter_write_single_quoted_scalar(yaml_emitter_t *emitter,
2004
2035
  }
2005
2036
  }
2006
2037
 
2038
+ if (breaks)
2039
+ if (!yaml_emitter_write_indent(emitter)) return 0;
2040
+
2007
2041
  if (!yaml_emitter_write_indicator(emitter, "'", 0, 0, 0))
2008
2042
  return 0;
2009
2043
 
@@ -2203,7 +2237,7 @@ yaml_emitter_write_block_scalar_hints(yaml_emitter_t *emitter,
2203
2237
  else if (string.start == string.pointer)
2204
2238
  {
2205
2239
  chomp_hint = "+";
2206
- emitter->open_ended = 1;
2240
+ emitter->open_ended = 2;
2207
2241
  }
2208
2242
  else
2209
2243
  {
@@ -2213,7 +2247,7 @@ yaml_emitter_write_block_scalar_hints(yaml_emitter_t *emitter,
2213
2247
  if (IS_BREAK(string))
2214
2248
  {
2215
2249
  chomp_hint = "+";
2216
- emitter->open_ended = 1;
2250
+ emitter->open_ended = 2;
2217
2251
  }
2218
2252
  }
2219
2253
  }
@@ -37,27 +37,47 @@ yaml_parser_register_anchor(yaml_parser_t *parser,
37
37
  static void
38
38
  yaml_parser_delete_aliases(yaml_parser_t *parser);
39
39
 
40
+ /*
41
+ * Document loading context.
42
+ */
43
+ struct loader_ctx {
44
+ int *start;
45
+ int *end;
46
+ int *top;
47
+ };
48
+
40
49
  /*
41
50
  * Composer functions.
42
51
  */
52
+ static int
53
+ yaml_parser_load_nodes(yaml_parser_t *parser, struct loader_ctx *ctx);
54
+
55
+ static int
56
+ yaml_parser_load_document(yaml_parser_t *parser, yaml_event_t *event);
43
57
 
44
58
  static int
45
- yaml_parser_load_document(yaml_parser_t *parser, yaml_event_t *first_event);
59
+ yaml_parser_load_alias(yaml_parser_t *parser, yaml_event_t *event,
60
+ struct loader_ctx *ctx);
46
61
 
47
62
  static int
48
- yaml_parser_load_node(yaml_parser_t *parser, yaml_event_t *first_event);
63
+ yaml_parser_load_scalar(yaml_parser_t *parser, yaml_event_t *event,
64
+ struct loader_ctx *ctx);
49
65
 
50
66
  static int
51
- yaml_parser_load_alias(yaml_parser_t *parser, yaml_event_t *first_event);
67
+ yaml_parser_load_sequence(yaml_parser_t *parser, yaml_event_t *event,
68
+ struct loader_ctx *ctx);
52
69
 
53
70
  static int
54
- yaml_parser_load_scalar(yaml_parser_t *parser, yaml_event_t *first_event);
71
+ yaml_parser_load_mapping(yaml_parser_t *parser, yaml_event_t *event,
72
+ struct loader_ctx *ctx);
55
73
 
56
74
  static int
57
- yaml_parser_load_sequence(yaml_parser_t *parser, yaml_event_t *first_event);
75
+ yaml_parser_load_sequence_end(yaml_parser_t *parser, yaml_event_t *event,
76
+ struct loader_ctx *ctx);
58
77
 
59
78
  static int
60
- yaml_parser_load_mapping(yaml_parser_t *parser, yaml_event_t *first_event);
79
+ yaml_parser_load_mapping_end(yaml_parser_t *parser, yaml_event_t *event,
80
+ struct loader_ctx *ctx);
61
81
 
62
82
  /*
63
83
  * Load the next document of the stream.
@@ -162,59 +182,78 @@ yaml_parser_delete_aliases(yaml_parser_t *parser)
162
182
  */
163
183
 
164
184
  static int
165
- yaml_parser_load_document(yaml_parser_t *parser, yaml_event_t *first_event)
185
+ yaml_parser_load_document(yaml_parser_t *parser, yaml_event_t *event)
166
186
  {
167
- yaml_event_t event;
187
+ struct loader_ctx ctx = { NULL, NULL, NULL };
168
188
 
169
- assert(first_event->type == YAML_DOCUMENT_START_EVENT);
189
+ assert(event->type == YAML_DOCUMENT_START_EVENT);
170
190
  /* DOCUMENT-START is expected. */
171
191
 
172
192
  parser->document->version_directive
173
- = first_event->data.document_start.version_directive;
193
+ = event->data.document_start.version_directive;
174
194
  parser->document->tag_directives.start
175
- = first_event->data.document_start.tag_directives.start;
195
+ = event->data.document_start.tag_directives.start;
176
196
  parser->document->tag_directives.end
177
- = first_event->data.document_start.tag_directives.end;
197
+ = event->data.document_start.tag_directives.end;
178
198
  parser->document->start_implicit
179
- = first_event->data.document_start.implicit;
180
- parser->document->start_mark = first_event->start_mark;
181
-
182
- if (!yaml_parser_parse(parser, &event)) return 0;
183
-
184
- if (!yaml_parser_load_node(parser, &event)) return 0;
185
-
186
- if (!yaml_parser_parse(parser, &event)) return 0;
187
- assert(event.type == YAML_DOCUMENT_END_EVENT);
188
- /* DOCUMENT-END is expected. */
199
+ = event->data.document_start.implicit;
200
+ parser->document->start_mark = event->start_mark;
189
201
 
190
- parser->document->end_implicit = event.data.document_end.implicit;
191
- parser->document->end_mark = event.end_mark;
202
+ if (!STACK_INIT(parser, ctx, int*)) return 0;
203
+ if (!yaml_parser_load_nodes(parser, &ctx)) {
204
+ STACK_DEL(parser, ctx);
205
+ return 0;
206
+ }
207
+ STACK_DEL(parser, ctx);
192
208
 
193
209
  return 1;
194
210
  }
195
211
 
196
212
  /*
197
- * Compose a node.
213
+ * Compose a node tree.
198
214
  */
199
215
 
200
216
  static int
201
- yaml_parser_load_node(yaml_parser_t *parser, yaml_event_t *first_event)
217
+ yaml_parser_load_nodes(yaml_parser_t *parser, struct loader_ctx *ctx)
202
218
  {
203
- switch (first_event->type) {
204
- case YAML_ALIAS_EVENT:
205
- return yaml_parser_load_alias(parser, first_event);
206
- case YAML_SCALAR_EVENT:
207
- return yaml_parser_load_scalar(parser, first_event);
208
- case YAML_SEQUENCE_START_EVENT:
209
- return yaml_parser_load_sequence(parser, first_event);
210
- case YAML_MAPPING_START_EVENT:
211
- return yaml_parser_load_mapping(parser, first_event);
212
- default:
213
- assert(0); /* Could not happen. */
214
- return 0;
215
- }
219
+ yaml_event_t event;
216
220
 
217
- return 0;
221
+ do {
222
+ if (!yaml_parser_parse(parser, &event)) return 0;
223
+
224
+ switch (event.type) {
225
+ case YAML_ALIAS_EVENT:
226
+ if (!yaml_parser_load_alias(parser, &event, ctx)) return 0;
227
+ break;
228
+ case YAML_SCALAR_EVENT:
229
+ if (!yaml_parser_load_scalar(parser, &event, ctx)) return 0;
230
+ break;
231
+ case YAML_SEQUENCE_START_EVENT:
232
+ if (!yaml_parser_load_sequence(parser, &event, ctx)) return 0;
233
+ break;
234
+ case YAML_SEQUENCE_END_EVENT:
235
+ if (!yaml_parser_load_sequence_end(parser, &event, ctx))
236
+ return 0;
237
+ break;
238
+ case YAML_MAPPING_START_EVENT:
239
+ if (!yaml_parser_load_mapping(parser, &event, ctx)) return 0;
240
+ break;
241
+ case YAML_MAPPING_END_EVENT:
242
+ if (!yaml_parser_load_mapping_end(parser, &event, ctx))
243
+ return 0;
244
+ break;
245
+ default:
246
+ assert(0); /* Could not happen. */
247
+ return 0;
248
+ case YAML_DOCUMENT_END_EVENT:
249
+ break;
250
+ }
251
+ } while (event.type != YAML_DOCUMENT_END_EVENT);
252
+
253
+ parser->document->end_implicit = event.data.document_end.implicit;
254
+ parser->document->end_mark = event.end_mark;
255
+
256
+ return 1;
218
257
  }
219
258
 
220
259
  /*
@@ -252,27 +291,80 @@ yaml_parser_register_anchor(yaml_parser_t *parser,
252
291
  return 1;
253
292
  }
254
293
 
294
+ /*
295
+ * Compose node into its parent in the stree.
296
+ */
297
+
298
+ static int
299
+ yaml_parser_load_node_add(yaml_parser_t *parser, struct loader_ctx *ctx,
300
+ int index)
301
+ {
302
+ struct yaml_node_s *parent;
303
+ int parent_index;
304
+
305
+ if (STACK_EMPTY(parser, *ctx)) {
306
+ /* This is the root node, there's no tree to add it to. */
307
+ return 1;
308
+ }
309
+
310
+ parent_index = *((*ctx).top - 1);
311
+ parent = &parser->document->nodes.start[parent_index-1];
312
+
313
+ switch (parent->type) {
314
+ case YAML_SEQUENCE_NODE:
315
+ if (!STACK_LIMIT(parser, parent->data.sequence.items, INT_MAX-1))
316
+ return 0;
317
+ if (!PUSH(parser, parent->data.sequence.items, index))
318
+ return 0;
319
+ break;
320
+ case YAML_MAPPING_NODE: {
321
+ yaml_node_pair_t pair;
322
+ if (!STACK_EMPTY(parser, parent->data.mapping.pairs)) {
323
+ yaml_node_pair_t *p = parent->data.mapping.pairs.top - 1;
324
+ if (p->key != 0 && p->value == 0) {
325
+ p->value = index;
326
+ break;
327
+ }
328
+ }
329
+
330
+ pair.key = index;
331
+ pair.value = 0;
332
+ if (!STACK_LIMIT(parser, parent->data.mapping.pairs, INT_MAX-1))
333
+ return 0;
334
+ if (!PUSH(parser, parent->data.mapping.pairs, pair))
335
+ return 0;
336
+
337
+ break;
338
+ }
339
+ default:
340
+ assert(0); /* Could not happen. */
341
+ return 0;
342
+ }
343
+ return 1;
344
+ }
345
+
255
346
  /*
256
347
  * Compose a node corresponding to an alias.
257
348
  */
258
349
 
259
350
  static int
260
- yaml_parser_load_alias(yaml_parser_t *parser, yaml_event_t *first_event)
351
+ yaml_parser_load_alias(yaml_parser_t *parser, yaml_event_t *event,
352
+ struct loader_ctx *ctx)
261
353
  {
262
- yaml_char_t *anchor = first_event->data.alias.anchor;
354
+ yaml_char_t *anchor = event->data.alias.anchor;
263
355
  yaml_alias_data_t *alias_data;
264
356
 
265
357
  for (alias_data = parser->aliases.start;
266
358
  alias_data != parser->aliases.top; alias_data ++) {
267
359
  if (strcmp((char *)alias_data->anchor, (char *)anchor) == 0) {
268
360
  yaml_free(anchor);
269
- return alias_data->index;
361
+ return yaml_parser_load_node_add(parser, ctx, alias_data->index);
270
362
  }
271
363
  }
272
364
 
273
365
  yaml_free(anchor);
274
366
  return yaml_parser_set_composer_error(parser, "found undefined alias",
275
- first_event->start_mark);
367
+ event->start_mark);
276
368
  }
277
369
 
278
370
  /*
@@ -280,11 +372,12 @@ yaml_parser_load_alias(yaml_parser_t *parser, yaml_event_t *first_event)
280
372
  */
281
373
 
282
374
  static int
283
- yaml_parser_load_scalar(yaml_parser_t *parser, yaml_event_t *first_event)
375
+ yaml_parser_load_scalar(yaml_parser_t *parser, yaml_event_t *event,
376
+ struct loader_ctx *ctx)
284
377
  {
285
378
  yaml_node_t node;
286
379
  int index;
287
- yaml_char_t *tag = first_event->data.scalar.tag;
380
+ yaml_char_t *tag = event->data.scalar.tag;
288
381
 
289
382
  if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
290
383
 
@@ -294,23 +387,23 @@ yaml_parser_load_scalar(yaml_parser_t *parser, yaml_event_t *first_event)
294
387
  if (!tag) goto error;
295
388
  }
296
389
 
297
- SCALAR_NODE_INIT(node, tag, first_event->data.scalar.value,
298
- first_event->data.scalar.length, first_event->data.scalar.style,
299
- first_event->start_mark, first_event->end_mark);
390
+ SCALAR_NODE_INIT(node, tag, event->data.scalar.value,
391
+ event->data.scalar.length, event->data.scalar.style,
392
+ event->start_mark, event->end_mark);
300
393
 
301
394
  if (!PUSH(parser, parser->document->nodes, node)) goto error;
302
395
 
303
- index = parser->document->nodes.top - parser->document->nodes.start;
396
+ index = (int)(parser->document->nodes.top - parser->document->nodes.start);
304
397
 
305
398
  if (!yaml_parser_register_anchor(parser, index,
306
- first_event->data.scalar.anchor)) return 0;
399
+ event->data.scalar.anchor)) return 0;
307
400
 
308
- return index;
401
+ return yaml_parser_load_node_add(parser, ctx, index);
309
402
 
310
403
  error:
311
404
  yaml_free(tag);
312
- yaml_free(first_event->data.scalar.anchor);
313
- yaml_free(first_event->data.scalar.value);
405
+ yaml_free(event->data.scalar.anchor);
406
+ yaml_free(event->data.scalar.value);
314
407
  return 0;
315
408
  }
316
409
 
@@ -319,17 +412,17 @@ error:
319
412
  */
320
413
 
321
414
  static int
322
- yaml_parser_load_sequence(yaml_parser_t *parser, yaml_event_t *first_event)
415
+ yaml_parser_load_sequence(yaml_parser_t *parser, yaml_event_t *event,
416
+ struct loader_ctx *ctx)
323
417
  {
324
- yaml_event_t event;
325
418
  yaml_node_t node;
326
419
  struct {
327
420
  yaml_node_item_t *start;
328
421
  yaml_node_item_t *end;
329
422
  yaml_node_item_t *top;
330
423
  } items = { NULL, NULL, NULL };
331
- int index, item_index;
332
- yaml_char_t *tag = first_event->data.sequence_start.tag;
424
+ int index;
425
+ yaml_char_t *tag = event->data.sequence_start.tag;
333
426
 
334
427
  if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
335
428
 
@@ -342,48 +435,54 @@ yaml_parser_load_sequence(yaml_parser_t *parser, yaml_event_t *first_event)
342
435
  if (!STACK_INIT(parser, items, yaml_node_item_t*)) goto error;
343
436
 
344
437
  SEQUENCE_NODE_INIT(node, tag, items.start, items.end,
345
- first_event->data.sequence_start.style,
346
- first_event->start_mark, first_event->end_mark);
438
+ event->data.sequence_start.style,
439
+ event->start_mark, event->end_mark);
347
440
 
348
441
  if (!PUSH(parser, parser->document->nodes, node)) goto error;
349
442
 
350
- index = parser->document->nodes.top - parser->document->nodes.start;
443
+ index = (int)(parser->document->nodes.top - parser->document->nodes.start);
351
444
 
352
445
  if (!yaml_parser_register_anchor(parser, index,
353
- first_event->data.sequence_start.anchor)) return 0;
354
-
355
- if (!yaml_parser_parse(parser, &event)) return 0;
356
-
357
- while (event.type != YAML_SEQUENCE_END_EVENT) {
358
- if (!STACK_LIMIT(parser,
359
- parser->document->nodes.start[index-1].data.sequence.items,
360
- INT_MAX-1)) return 0;
361
- item_index = yaml_parser_load_node(parser, &event);
362
- if (!item_index) return 0;
363
- if (!PUSH(parser,
364
- parser->document->nodes.start[index-1].data.sequence.items,
365
- item_index)) return 0;
366
- if (!yaml_parser_parse(parser, &event)) return 0;
367
- }
446
+ event->data.sequence_start.anchor)) return 0;
368
447
 
369
- parser->document->nodes.start[index-1].end_mark = event.end_mark;
448
+ if (!yaml_parser_load_node_add(parser, ctx, index)) return 0;
370
449
 
371
- return index;
450
+ if (!STACK_LIMIT(parser, *ctx, INT_MAX-1)) return 0;
451
+ if (!PUSH(parser, *ctx, index)) return 0;
452
+
453
+ return 1;
372
454
 
373
455
  error:
374
456
  yaml_free(tag);
375
- yaml_free(first_event->data.sequence_start.anchor);
457
+ yaml_free(event->data.sequence_start.anchor);
376
458
  return 0;
377
459
  }
378
460
 
461
+ static int
462
+ yaml_parser_load_sequence_end(yaml_parser_t *parser, yaml_event_t *event,
463
+ struct loader_ctx *ctx)
464
+ {
465
+ int index;
466
+
467
+ assert(((*ctx).top - (*ctx).start) > 0);
468
+
469
+ index = *((*ctx).top - 1);
470
+ assert(parser->document->nodes.start[index-1].type == YAML_SEQUENCE_NODE);
471
+ parser->document->nodes.start[index-1].end_mark = event->end_mark;
472
+
473
+ (void)POP(parser, *ctx);
474
+
475
+ return 1;
476
+ }
477
+
379
478
  /*
380
479
  * Compose a mapping node.
381
480
  */
382
481
 
383
482
  static int
384
- yaml_parser_load_mapping(yaml_parser_t *parser, yaml_event_t *first_event)
483
+ yaml_parser_load_mapping(yaml_parser_t *parser, yaml_event_t *event,
484
+ struct loader_ctx *ctx)
385
485
  {
386
- yaml_event_t event;
387
486
  yaml_node_t node;
388
487
  struct {
389
488
  yaml_node_pair_t *start;
@@ -391,8 +490,7 @@ yaml_parser_load_mapping(yaml_parser_t *parser, yaml_event_t *first_event)
391
490
  yaml_node_pair_t *top;
392
491
  } pairs = { NULL, NULL, NULL };
393
492
  int index;
394
- yaml_node_pair_t pair;
395
- yaml_char_t *tag = first_event->data.mapping_start.tag;
493
+ yaml_char_t *tag = event->data.mapping_start.tag;
396
494
 
397
495
  if (!STACK_LIMIT(parser, parser->document->nodes, INT_MAX-1)) goto error;
398
496
 
@@ -405,40 +503,42 @@ yaml_parser_load_mapping(yaml_parser_t *parser, yaml_event_t *first_event)
405
503
  if (!STACK_INIT(parser, pairs, yaml_node_pair_t*)) goto error;
406
504
 
407
505
  MAPPING_NODE_INIT(node, tag, pairs.start, pairs.end,
408
- first_event->data.mapping_start.style,
409
- first_event->start_mark, first_event->end_mark);
506
+ event->data.mapping_start.style,
507
+ event->start_mark, event->end_mark);
410
508
 
411
509
  if (!PUSH(parser, parser->document->nodes, node)) goto error;
412
510
 
413
- index = parser->document->nodes.top - parser->document->nodes.start;
511
+ index = (int)(parser->document->nodes.top - parser->document->nodes.start);
414
512
 
415
513
  if (!yaml_parser_register_anchor(parser, index,
416
- first_event->data.mapping_start.anchor)) return 0;
514
+ event->data.mapping_start.anchor)) return 0;
417
515
 
418
- if (!yaml_parser_parse(parser, &event)) return 0;
516
+ if (!yaml_parser_load_node_add(parser, ctx, index)) return 0;
419
517
 
420
- while (event.type != YAML_MAPPING_END_EVENT) {
421
- if (!STACK_LIMIT(parser,
422
- parser->document->nodes.start[index-1].data.mapping.pairs,
423
- INT_MAX-1)) return 0;
424
- pair.key = yaml_parser_load_node(parser, &event);
425
- if (!pair.key) return 0;
426
- if (!yaml_parser_parse(parser, &event)) return 0;
427
- pair.value = yaml_parser_load_node(parser, &event);
428
- if (!pair.value) return 0;
429
- if (!PUSH(parser,
430
- parser->document->nodes.start[index-1].data.mapping.pairs,
431
- pair)) return 0;
432
- if (!yaml_parser_parse(parser, &event)) return 0;
433
- }
518
+ if (!STACK_LIMIT(parser, *ctx, INT_MAX-1)) return 0;
519
+ if (!PUSH(parser, *ctx, index)) return 0;
434
520
 
435
- parser->document->nodes.start[index-1].end_mark = event.end_mark;
436
-
437
- return index;
521
+ return 1;
438
522
 
439
523
  error:
440
524
  yaml_free(tag);
441
- yaml_free(first_event->data.mapping_start.anchor);
525
+ yaml_free(event->data.mapping_start.anchor);
442
526
  return 0;
443
527
  }
444
528
 
529
+ static int
530
+ yaml_parser_load_mapping_end(yaml_parser_t *parser, yaml_event_t *event,
531
+ struct loader_ctx *ctx)
532
+ {
533
+ int index;
534
+
535
+ assert(((*ctx).top - (*ctx).start) > 0);
536
+
537
+ index = *((*ctx).top - 1);
538
+ assert(parser->document->nodes.start[index-1].type == YAML_MAPPING_NODE);
539
+ parser->document->nodes.start[index-1].end_mark = event->end_mark;
540
+
541
+ (void)POP(parser, *ctx);
542
+
543
+ return 1;
544
+ }