psych 3.1.0 → 3.3.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -38,8 +38,8 @@
38
38
  * BLOCK-END # Indentation decrease.
39
39
  * FLOW-SEQUENCE-START # '['
40
40
  * FLOW-SEQUENCE-END # ']'
41
- * BLOCK-SEQUENCE-START # '{'
42
- * BLOCK-SEQUENCE-END # '}'
41
+ * FLOW-MAPPING-START # '{'
42
+ * FLOW-MAPPING-END # '}'
43
43
  * BLOCK-ENTRY # '-'
44
44
  * FLOW-ENTRY # ','
45
45
  * KEY # '?' or nothing (simple keys).
@@ -273,7 +273,7 @@
273
273
  * The tokens BLOCK-SEQUENCE-START and BLOCK-MAPPING-START denote indentation
274
274
  * increase that precedes a block collection (cf. the INDENT token in Python).
275
275
  * The token BLOCK-END denote indentation decrease that ends a block collection
276
- * (cf. the DEDENT token in Python). However YAML has some syntax pecularities
276
+ * (cf. the DEDENT token in Python). However YAML has some syntax peculiarities
277
277
  * that makes detections of these tokens more complex.
278
278
  *
279
279
  * The tokens BLOCK-ENTRY, KEY, and VALUE are used to represent the indicators
@@ -348,6 +348,7 @@
348
348
  * SCALAR("another value",plain)
349
349
  * KEY
350
350
  * SCALAR("a mapping",plain)
351
+ * VALUE
351
352
  * BLOCK-MAPPING-START
352
353
  * KEY
353
354
  * SCALAR("key 1",plain)
@@ -711,7 +712,7 @@ yaml_parser_scan_tag_handle(yaml_parser_t *parser, int directive,
711
712
  yaml_mark_t start_mark, yaml_char_t **handle);
712
713
 
713
714
  static int
714
- yaml_parser_scan_tag_uri(yaml_parser_t *parser, int directive,
715
+ yaml_parser_scan_tag_uri(yaml_parser_t *parser, int uri_char, int directive,
715
716
  yaml_char_t *head, yaml_mark_t start_mark, yaml_char_t **uri);
716
717
 
717
718
  static int
@@ -1227,7 +1228,7 @@ yaml_parser_roll_indent(yaml_parser_t *parser, ptrdiff_t column,
1227
1228
  return 0;
1228
1229
  }
1229
1230
 
1230
- parser->indent = column;
1231
+ parser->indent = (int)column;
1231
1232
 
1232
1233
  /* Create a token and insert it into the queue. */
1233
1234
 
@@ -2292,7 +2293,7 @@ yaml_parser_scan_tag_directive_value(yaml_parser_t *parser,
2292
2293
 
2293
2294
  /* Scan a prefix. */
2294
2295
 
2295
- if (!yaml_parser_scan_tag_uri(parser, 1, NULL, start_mark, &prefix_value))
2296
+ if (!yaml_parser_scan_tag_uri(parser, 1, 1, NULL, start_mark, &prefix_value))
2296
2297
  goto error;
2297
2298
 
2298
2299
  /* Expect a whitespace or line break. */
@@ -2410,7 +2411,7 @@ yaml_parser_scan_tag(yaml_parser_t *parser, yaml_token_t *token)
2410
2411
 
2411
2412
  /* Consume the tag value. */
2412
2413
 
2413
- if (!yaml_parser_scan_tag_uri(parser, 0, NULL, start_mark, &suffix))
2414
+ if (!yaml_parser_scan_tag_uri(parser, 1, 0, NULL, start_mark, &suffix))
2414
2415
  goto error;
2415
2416
 
2416
2417
  /* Check for '>' and eat it. */
@@ -2438,14 +2439,14 @@ yaml_parser_scan_tag(yaml_parser_t *parser, yaml_token_t *token)
2438
2439
  {
2439
2440
  /* Scan the suffix now. */
2440
2441
 
2441
- if (!yaml_parser_scan_tag_uri(parser, 0, NULL, start_mark, &suffix))
2442
+ if (!yaml_parser_scan_tag_uri(parser, 0, 0, NULL, start_mark, &suffix))
2442
2443
  goto error;
2443
2444
  }
2444
2445
  else
2445
2446
  {
2446
2447
  /* It wasn't a handle after all. Scan the rest of the tag. */
2447
2448
 
2448
- if (!yaml_parser_scan_tag_uri(parser, 0, handle, start_mark, &suffix))
2449
+ if (!yaml_parser_scan_tag_uri(parser, 0, 0, handle, start_mark, &suffix))
2449
2450
  goto error;
2450
2451
 
2451
2452
  /* Set the handle to '!'. */
@@ -2474,9 +2475,11 @@ yaml_parser_scan_tag(yaml_parser_t *parser, yaml_token_t *token)
2474
2475
  if (!CACHE(parser, 1)) goto error;
2475
2476
 
2476
2477
  if (!IS_BLANKZ(parser->buffer)) {
2477
- yaml_parser_set_scanner_error(parser, "while scanning a tag",
2478
- start_mark, "did not find expected whitespace or line break");
2479
- goto error;
2478
+ if (!parser->flow_level || !CHECK(parser->buffer, ',') ) {
2479
+ yaml_parser_set_scanner_error(parser, "while scanning a tag",
2480
+ start_mark, "did not find expected whitespace or line break");
2481
+ goto error;
2482
+ }
2480
2483
  }
2481
2484
 
2482
2485
  end_mark = parser->mark;
@@ -2565,7 +2568,7 @@ error:
2565
2568
  */
2566
2569
 
2567
2570
  static int
2568
- yaml_parser_scan_tag_uri(yaml_parser_t *parser, int directive,
2571
+ yaml_parser_scan_tag_uri(yaml_parser_t *parser, int uri_char, int directive,
2569
2572
  yaml_char_t *head, yaml_mark_t start_mark, yaml_char_t **uri)
2570
2573
  {
2571
2574
  size_t length = head ? strlen((char *)head) : 0;
@@ -2601,8 +2604,11 @@ yaml_parser_scan_tag_uri(yaml_parser_t *parser, int directive,
2601
2604
  * The set of characters that may appear in URI is as follows:
2602
2605
  *
2603
2606
  * '0'-'9', 'A'-'Z', 'a'-'z', '_', '-', ';', '/', '?', ':', '@', '&',
2604
- * '=', '+', '$', ',', '.', '!', '~', '*', '\'', '(', ')', '[', ']',
2605
- * '%'.
2607
+ * '=', '+', '$', '.', '!', '~', '*', '\'', '(', ')', '%'.
2608
+ *
2609
+ * If we are inside a verbatim tag <...> (parameter uri_char is true)
2610
+ * then also the following flow indicators are allowed:
2611
+ * ',', '[', ']'
2606
2612
  */
2607
2613
 
2608
2614
  while (IS_ALPHA(parser->buffer) || CHECK(parser->buffer, ';')
@@ -2610,12 +2616,15 @@ yaml_parser_scan_tag_uri(yaml_parser_t *parser, int directive,
2610
2616
  || CHECK(parser->buffer, ':') || CHECK(parser->buffer, '@')
2611
2617
  || CHECK(parser->buffer, '&') || CHECK(parser->buffer, '=')
2612
2618
  || CHECK(parser->buffer, '+') || CHECK(parser->buffer, '$')
2613
- || CHECK(parser->buffer, ',') || CHECK(parser->buffer, '.')
2619
+ || CHECK(parser->buffer, '.') || CHECK(parser->buffer, '%')
2614
2620
  || CHECK(parser->buffer, '!') || CHECK(parser->buffer, '~')
2615
2621
  || CHECK(parser->buffer, '*') || CHECK(parser->buffer, '\'')
2616
2622
  || CHECK(parser->buffer, '(') || CHECK(parser->buffer, ')')
2617
- || CHECK(parser->buffer, '[') || CHECK(parser->buffer, ']')
2618
- || CHECK(parser->buffer, '%'))
2623
+ || (uri_char && (
2624
+ CHECK(parser->buffer, ',')
2625
+ || CHECK(parser->buffer, '[') || CHECK(parser->buffer, ']')
2626
+ )
2627
+ ))
2619
2628
  {
2620
2629
  /* Check if it is a URI-escape sequence. */
2621
2630
 
@@ -2860,7 +2869,7 @@ yaml_parser_scan_block_scalar(yaml_parser_t *parser, yaml_token_t *token,
2860
2869
 
2861
2870
  if (!CACHE(parser, 1)) goto error;
2862
2871
 
2863
- while ((int)parser->mark.column == indent && !IS_Z(parser->buffer))
2872
+ while ((int)parser->mark.column == indent && !(IS_Z(parser->buffer)))
2864
2873
  {
2865
2874
  /*
2866
2875
  * We are at the beginning of a non-empty line.
@@ -3278,7 +3287,7 @@ yaml_parser_scan_flow_scalar(yaml_parser_t *parser, yaml_token_t *token,
3278
3287
 
3279
3288
  /* Check if we are at the end of the scalar. */
3280
3289
 
3281
- /* Fix for crash unitialized value crash
3290
+ /* Fix for crash uninitialized value crash
3282
3291
  * Credit for the bug and input is to OSS Fuzz
3283
3292
  * Credit for the fix to Alex Gaynor
3284
3293
  */
@@ -3430,11 +3439,22 @@ yaml_parser_scan_plain_scalar(yaml_parser_t *parser, yaml_token_t *token)
3430
3439
 
3431
3440
  while (!IS_BLANKZ(parser->buffer))
3432
3441
  {
3433
- /* Check for 'x:x' in the flow context. TODO: Fix the test "spec-08-13". */
3442
+ /* Check for "x:" + one of ',?[]{}' in the flow context. TODO: Fix the test "spec-08-13".
3443
+ * This is not completely according to the spec
3444
+ * See http://yaml.org/spec/1.1/#id907281 9.1.3. Plain
3445
+ */
3434
3446
 
3435
3447
  if (parser->flow_level
3436
3448
  && CHECK(parser->buffer, ':')
3437
- && !IS_BLANKZ_AT(parser->buffer, 1)) {
3449
+ && (
3450
+ CHECK_AT(parser->buffer, ',', 1)
3451
+ || CHECK_AT(parser->buffer, '?', 1)
3452
+ || CHECK_AT(parser->buffer, '[', 1)
3453
+ || CHECK_AT(parser->buffer, ']', 1)
3454
+ || CHECK_AT(parser->buffer, '{', 1)
3455
+ || CHECK_AT(parser->buffer, '}', 1)
3456
+ )
3457
+ ) {
3438
3458
  yaml_parser_set_scanner_error(parser, "while scanning a plain scalar",
3439
3459
  start_mark, "found unexpected ':'");
3440
3460
  goto error;
@@ -3444,8 +3464,8 @@ yaml_parser_scan_plain_scalar(yaml_parser_t *parser, yaml_token_t *token)
3444
3464
 
3445
3465
  if ((CHECK(parser->buffer, ':') && IS_BLANKZ_AT(parser->buffer, 1))
3446
3466
  || (parser->flow_level &&
3447
- (CHECK(parser->buffer, ',') || CHECK(parser->buffer, ':')
3448
- || CHECK(parser->buffer, '?') || CHECK(parser->buffer, '[')
3467
+ (CHECK(parser->buffer, ',')
3468
+ || CHECK(parser->buffer, '[')
3449
3469
  || CHECK(parser->buffer, ']') || CHECK(parser->buffer, '{')
3450
3470
  || CHECK(parser->buffer, '}'))))
3451
3471
  break;
@@ -3512,7 +3532,7 @@ yaml_parser_scan_plain_scalar(yaml_parser_t *parser, yaml_token_t *token)
3512
3532
  if (leading_blanks && (int)parser->mark.column < indent
3513
3533
  && IS_TAB(parser->buffer)) {
3514
3534
  yaml_parser_set_scanner_error(parser, "while scanning a plain scalar",
3515
- start_mark, "found a tab character that violate indentation");
3535
+ start_mark, "found a tab character that violates indentation");
3516
3536
  goto error;
3517
3537
  }
3518
3538
 
@@ -26,7 +26,9 @@ extern "C" {
26
26
 
27
27
  /** The public API declaration. */
28
28
 
29
- #ifdef _WIN32
29
+ #if defined(__MINGW32__)
30
+ # define YAML_DECLARE(type) type
31
+ #elif defined(_WIN32)
30
32
  # if defined(YAML_DECLARE_STATIC)
31
33
  # define YAML_DECLARE(type) type
32
34
  # elif defined(YAML_DECLARE_EXPORT)
@@ -230,7 +232,7 @@ typedef enum yaml_token_type_e {
230
232
 
231
233
  /** A BLOCK-SEQUENCE-START token. */
232
234
  YAML_BLOCK_SEQUENCE_START_TOKEN,
233
- /** A BLOCK-SEQUENCE-END token. */
235
+ /** A BLOCK-MAPPING-START token. */
234
236
  YAML_BLOCK_MAPPING_START_TOKEN,
235
237
  /** A BLOCK-END token. */
236
238
  YAML_BLOCK_END_TOKEN,
@@ -550,7 +552,7 @@ yaml_document_end_event_initialize(yaml_event_t *event, int implicit);
550
552
  */
551
553
 
552
554
  YAML_DECLARE(int)
553
- yaml_alias_event_initialize(yaml_event_t *event, yaml_char_t *anchor);
555
+ yaml_alias_event_initialize(yaml_event_t *event, const yaml_char_t *anchor);
554
556
 
555
557
  /**
556
558
  * Create a SCALAR event.
@@ -576,8 +578,8 @@ yaml_alias_event_initialize(yaml_event_t *event, yaml_char_t *anchor);
576
578
 
577
579
  YAML_DECLARE(int)
578
580
  yaml_scalar_event_initialize(yaml_event_t *event,
579
- yaml_char_t *anchor, yaml_char_t *tag,
580
- yaml_char_t *value, int length,
581
+ const yaml_char_t *anchor, const yaml_char_t *tag,
582
+ const yaml_char_t *value, int length,
581
583
  int plain_implicit, int quoted_implicit,
582
584
  yaml_scalar_style_t style);
583
585
 
@@ -599,7 +601,7 @@ yaml_scalar_event_initialize(yaml_event_t *event,
599
601
 
600
602
  YAML_DECLARE(int)
601
603
  yaml_sequence_start_event_initialize(yaml_event_t *event,
602
- yaml_char_t *anchor, yaml_char_t *tag, int implicit,
604
+ const yaml_char_t *anchor, const yaml_char_t *tag, int implicit,
603
605
  yaml_sequence_style_t style);
604
606
 
605
607
  /**
@@ -631,7 +633,7 @@ yaml_sequence_end_event_initialize(yaml_event_t *event);
631
633
 
632
634
  YAML_DECLARE(int)
633
635
  yaml_mapping_start_event_initialize(yaml_event_t *event,
634
- yaml_char_t *anchor, yaml_char_t *tag, int implicit,
636
+ const yaml_char_t *anchor, const yaml_char_t *tag, int implicit,
635
637
  yaml_mapping_style_t style);
636
638
 
637
639
  /**
@@ -663,7 +665,7 @@ yaml_event_delete(yaml_event_t *event);
663
665
 
664
666
  /** The tag @c !!null with the only possible value: @c null. */
665
667
  #define YAML_NULL_TAG "tag:yaml.org,2002:null"
666
- /** The tag @c !!bool with the values: @c true and @c falce. */
668
+ /** The tag @c !!bool with the values: @c true and @c false. */
667
669
  #define YAML_BOOL_TAG "tag:yaml.org,2002:bool"
668
670
  /** The tag @c !!str for string values. */
669
671
  #define YAML_STR_TAG "tag:yaml.org,2002:str"
@@ -894,7 +896,7 @@ yaml_document_get_root_node(yaml_document_t *document);
894
896
 
895
897
  YAML_DECLARE(int)
896
898
  yaml_document_add_scalar(yaml_document_t *document,
897
- yaml_char_t *tag, yaml_char_t *value, int length,
899
+ const yaml_char_t *tag, const yaml_char_t *value, int length,
898
900
  yaml_scalar_style_t style);
899
901
 
900
902
  /**
@@ -911,7 +913,7 @@ yaml_document_add_scalar(yaml_document_t *document,
911
913
 
912
914
  YAML_DECLARE(int)
913
915
  yaml_document_add_sequence(yaml_document_t *document,
914
- yaml_char_t *tag, yaml_sequence_style_t style);
916
+ const yaml_char_t *tag, yaml_sequence_style_t style);
915
917
 
916
918
  /**
917
919
  * Create a MAPPING node and attach it to the document.
@@ -927,7 +929,7 @@ yaml_document_add_sequence(yaml_document_t *document,
927
929
 
928
930
  YAML_DECLARE(int)
929
931
  yaml_document_add_mapping(yaml_document_t *document,
930
- yaml_char_t *tag, yaml_mapping_style_t style);
932
+ const yaml_char_t *tag, yaml_mapping_style_t style);
931
933
 
932
934
  /**
933
935
  * Add an item to a SEQUENCE node.
@@ -935,7 +937,7 @@ yaml_document_add_mapping(yaml_document_t *document,
935
937
  * @param[in,out] document A document object.
936
938
  * @param[in] sequence The sequence node id.
937
939
  * @param[in] item The item node id.
938
- *
940
+ *
939
941
  * @returns @c 1 if the function succeeded, @c 0 on error.
940
942
  */
941
943
 
@@ -950,7 +952,7 @@ yaml_document_append_sequence_item(yaml_document_t *document,
950
952
  * @param[in] mapping The mapping node id.
951
953
  * @param[in] key The key node id.
952
954
  * @param[in] value The value node id.
953
- *
955
+ *
954
956
  * @returns @c 1 if the function succeeded, @c 0 on error.
955
957
  */
956
958
 
@@ -1018,6 +1020,7 @@ typedef enum yaml_parser_state_e {
1018
1020
  YAML_PARSE_DOCUMENT_CONTENT_STATE,
1019
1021
  /** Expect DOCUMENT-END. */
1020
1022
  YAML_PARSE_DOCUMENT_END_STATE,
1023
+
1021
1024
  /** Expect a block node. */
1022
1025
  YAML_PARSE_BLOCK_NODE_STATE,
1023
1026
  /** Expect a block node or indentless sequence. */
@@ -1028,6 +1031,7 @@ typedef enum yaml_parser_state_e {
1028
1031
  YAML_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE,
1029
1032
  /** Expect an entry of a block sequence. */
1030
1033
  YAML_PARSE_BLOCK_SEQUENCE_ENTRY_STATE,
1034
+
1031
1035
  /** Expect an entry of an indentless sequence. */
1032
1036
  YAML_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE,
1033
1037
  /** Expect the first key of a block mapping. */
@@ -1038,6 +1042,7 @@ typedef enum yaml_parser_state_e {
1038
1042
  YAML_PARSE_BLOCK_MAPPING_VALUE_STATE,
1039
1043
  /** Expect the first entry of a flow sequence. */
1040
1044
  YAML_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE,
1045
+
1041
1046
  /** Expect an entry of a flow sequence. */
1042
1047
  YAML_PARSE_FLOW_SEQUENCE_ENTRY_STATE,
1043
1048
  /** Expect a key of an ordered mapping. */
@@ -1049,6 +1054,7 @@ typedef enum yaml_parser_state_e {
1049
1054
  /** Expect the first key of a flow mapping. */
1050
1055
  YAML_PARSE_FLOW_MAPPING_FIRST_KEY_STATE,
1051
1056
  /** Expect a key of a flow mapping. */
1057
+
1052
1058
  YAML_PARSE_FLOW_MAPPING_KEY_STATE,
1053
1059
  /** Expect a value of a flow mapping. */
1054
1060
  YAML_PARSE_FLOW_MAPPING_VALUE_STATE,
@@ -1203,7 +1209,7 @@ typedef struct yaml_parser_s {
1203
1209
  /** The number of tokens fetched from the queue. */
1204
1210
  size_t tokens_parsed;
1205
1211
 
1206
- /* Does the tokens queue contain a token ready for dequeueing. */
1212
+ /** Does the tokens queue contain a token ready for dequeueing. */
1207
1213
  int token_available;
1208
1214
 
1209
1215
  /** The indentation levels stack. */
@@ -1329,7 +1335,7 @@ yaml_parser_delete(yaml_parser_t *parser);
1329
1335
  * Set a string input.
1330
1336
  *
1331
1337
  * Note that the @a input pointer must be valid while the @a parser object
1332
- * exists. The application is responsible for destroing @a input after
1338
+ * exists. The application is responsible for destroying @a input after
1333
1339
  * destroying the @a parser.
1334
1340
  *
1335
1341
  * @param[in,out] parser A parser object.
@@ -1444,7 +1450,7 @@ yaml_parser_parse(yaml_parser_t *parser, yaml_event_t *event);
1444
1450
  * @param[in,out] parser A parser object.
1445
1451
  * @param[out] document An empty document object.
1446
1452
  *
1447
- * @return @c 1 if the function succeeded, @c 0 on error.
1453
+ * @returns @c 1 if the function succeeded, @c 0 on error.
1448
1454
  */
1449
1455
 
1450
1456
  YAML_DECLARE(int)
@@ -1487,6 +1493,7 @@ typedef enum yaml_emitter_state_e {
1487
1493
  YAML_EMIT_DOCUMENT_CONTENT_STATE,
1488
1494
  /** Expect DOCUMENT-END. */
1489
1495
  YAML_EMIT_DOCUMENT_END_STATE,
1496
+
1490
1497
  /** Expect the first item of a flow sequence. */
1491
1498
  YAML_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE,
1492
1499
  /** Expect an item of a flow sequence. */
@@ -1497,6 +1504,7 @@ typedef enum yaml_emitter_state_e {
1497
1504
  YAML_EMIT_FLOW_MAPPING_KEY_STATE,
1498
1505
  /** Expect a value for a simple key of a flow mapping. */
1499
1506
  YAML_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE,
1507
+
1500
1508
  /** Expect a value of a flow mapping. */
1501
1509
  YAML_EMIT_FLOW_MAPPING_VALUE_STATE,
1502
1510
  /** Expect the first item of a block sequence. */
@@ -1507,6 +1515,7 @@ typedef enum yaml_emitter_state_e {
1507
1515
  YAML_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE,
1508
1516
  /** Expect the key of a block mapping. */
1509
1517
  YAML_EMIT_BLOCK_MAPPING_KEY_STATE,
1518
+
1510
1519
  /** Expect a value for a simple key of a block mapping. */
1511
1520
  YAML_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE,
1512
1521
  /** Expect a value of a block mapping. */
@@ -1515,6 +1524,18 @@ typedef enum yaml_emitter_state_e {
1515
1524
  YAML_EMIT_END_STATE
1516
1525
  } yaml_emitter_state_t;
1517
1526
 
1527
+
1528
+ /* This is needed for C++ */
1529
+
1530
+ typedef struct yaml_anchors_s {
1531
+ /** The number of references. */
1532
+ int references;
1533
+ /** The anchor id. */
1534
+ int anchor;
1535
+ /** If the node has been emitted? */
1536
+ int serialized;
1537
+ } yaml_anchors_t;
1538
+
1518
1539
  /**
1519
1540
  * The emitter structure.
1520
1541
  *
@@ -1546,7 +1567,7 @@ typedef struct yaml_emitter_s {
1546
1567
  /** Write handler. */
1547
1568
  yaml_write_handler_t *write_handler;
1548
1569
 
1549
- /** A pointer for passing to the white handler. */
1570
+ /** A pointer for passing to the write handler. */
1550
1571
  void *write_handler_data;
1551
1572
 
1552
1573
  /** Standard (string or file) output data. */
@@ -1713,7 +1734,7 @@ typedef struct yaml_emitter_s {
1713
1734
  size_t length;
1714
1735
  /** Does the scalar contain line breaks? */
1715
1736
  int multiline;
1716
- /** Can the scalar be expessed in the flow plain style? */
1737
+ /** Can the scalar be expressed in the flow plain style? */
1717
1738
  int flow_plain_allowed;
1718
1739
  /** Can the scalar be expressed in the block plain style? */
1719
1740
  int block_plain_allowed;
@@ -1740,14 +1761,7 @@ typedef struct yaml_emitter_s {
1740
1761
  int closed;
1741
1762
 
1742
1763
  /** The information associated with the document nodes. */
1743
- struct {
1744
- /** The number of references. */
1745
- int references;
1746
- /** The anchor id. */
1747
- int anchor;
1748
- /** If the node has been emitted? */
1749
- int serialized;
1750
- } *anchors;
1764
+ yaml_anchors_t *anchors;
1751
1765
 
1752
1766
  /** The last assigned anchor id. */
1753
1767
  int last_anchor_id;
@@ -1936,10 +1950,10 @@ yaml_emitter_close(yaml_emitter_t *emitter);
1936
1950
  /**
1937
1951
  * Emit a YAML document.
1938
1952
  *
1939
- * The documen object may be generated using the yaml_parser_load() function
1953
+ * The document object may be generated using the yaml_parser_load() function
1940
1954
  * or the yaml_document_initialize() function. The emitter takes the
1941
- * responsibility for the document object and destoys its content after
1942
- * it is emitted. The document object is destroyedeven if the function fails.
1955
+ * responsibility for the document object and destroys its content after
1956
+ * it is emitted. The document object is destroyed even if the function fails.
1943
1957
  *
1944
1958
  * @param[in,out] emitter An emitter object.
1945
1959
  * @param[in,out] document A document object.
@@ -2,8 +2,8 @@
2
2
  #include RUBY_EXTCONF_H
3
3
  #endif
4
4
 
5
- #if HAVE_CONFIG_H
6
- #include <config.h>
5
+ #ifdef HAVE_CONFIG_H
6
+ #include "config.h"
7
7
  #endif
8
8
 
9
9
  #include <yaml.h>
@@ -175,14 +175,14 @@ yaml_string_join(
175
175
  * Check the octet at the specified position.
176
176
  */
177
177
 
178
- #define CHECK_AT(string,octet,offset) \
178
+ #define CHECK_AT(string,octet,offset) \
179
179
  ((string).pointer[offset] == (yaml_char_t)(octet))
180
180
 
181
181
  /*
182
182
  * Check the current octet in the buffer.
183
183
  */
184
184
 
185
- #define CHECK(string,octet) CHECK_AT((string),(octet),0)
185
+ #define CHECK(string,octet) (CHECK_AT((string),(octet),0))
186
186
 
187
187
  /*
188
188
  * Check if the character at the specified position is an alphabetical
@@ -35,9 +35,11 @@ module Psych
35
35
 
36
36
  constants.each do |const|
37
37
  konst = const_get const
38
- define_method(const.to_s.downcase) do
39
- load konst
40
- end
38
+ class_eval <<~RUBY
39
+ def #{const.to_s.downcase}
40
+ load #{konst.inspect}
41
+ end
42
+ RUBY
41
43
  end
42
44
 
43
45
  private
@@ -69,7 +71,7 @@ module Psych
69
71
  rescue
70
72
  nil
71
73
  end
72
- }.compact]
74
+ }.compact].freeze
73
75
 
74
76
  class Restricted < ClassLoader
75
77
  def initialize classes, symbols
data/lib/psych/handler.rb CHANGED
@@ -119,7 +119,7 @@ module Psych
119
119
  # +tag+ is an associated tag or nil
120
120
  # +plain+ is a boolean value
121
121
  # +quoted+ is a boolean value
122
- # +style+ is an integer idicating the string style
122
+ # +style+ is an integer indicating the string style
123
123
  #
124
124
  # See the constants in Psych::Nodes::Scalar for the possible values of
125
125
  # +style+
@@ -46,8 +46,8 @@ module Psych
46
46
  # Convert this node to Ruby.
47
47
  #
48
48
  # See also Psych::Visitors::ToRuby
49
- def to_ruby
50
- Visitors::ToRuby.create.accept(self)
49
+ def to_ruby(symbolize_names: false, freeze: false)
50
+ Visitors::ToRuby.create(symbolize_names: symbolize_names, freeze: freeze).accept(self)
51
51
  end
52
52
  alias :transform :to_ruby
53
53
 
@@ -50,7 +50,7 @@ module Psych
50
50
  # +tag+ is an associated tag or nil
51
51
  # +plain+ is a boolean value
52
52
  # +quoted+ is a boolean value
53
- # +style+ is an integer idicating the string style
53
+ # +style+ is an integer indicating the string style
54
54
  #
55
55
  # == See Also
56
56
  #
@@ -14,16 +14,15 @@ module Psych
14
14
  |\.(nan|NaN|NAN)(?# not a number))$/x
15
15
 
16
16
  # Taken from http://yaml.org/type/int.html
17
- INTEGER = /^(?:[-+]?0b[0-1_]+ (?# base 2)
18
- |[-+]?0[0-7_]+ (?# base 8)
19
- |[-+]?(?:0|[1-9][0-9_]*) (?# base 10)
20
- |[-+]?0x[0-9a-fA-F_]+ (?# base 16))$/x
17
+ INTEGER = /^(?:[-+]?0b[0-1_,]+ (?# base 2)
18
+ |[-+]?0[0-7_,]+ (?# base 8)
19
+ |[-+]?(?:0|[1-9][0-9_,]*) (?# base 10)
20
+ |[-+]?0x[0-9a-fA-F_,]+ (?# base 16))$/x
21
21
 
22
22
  attr_reader :class_loader
23
23
 
24
24
  # Create a new scanner
25
25
  def initialize class_loader
26
- @string_cache = {}
27
26
  @symbol_cache = {}
28
27
  @class_loader = class_loader
29
28
  end
@@ -31,81 +30,70 @@ module Psych
31
30
  # Tokenize +string+ returning the Ruby object
32
31
  def tokenize string
33
32
  return nil if string.empty?
34
- return string if @string_cache.key?(string)
35
33
  return @symbol_cache[string] if @symbol_cache.key?(string)
36
34
 
37
- case string
38
35
  # Check for a String type, being careful not to get caught by hash keys, hex values, and
39
36
  # special floats (e.g., -.inf).
40
- when /^[^\d\.:-]?[A-Za-z_\s!@#\$%\^&\*\(\)\{\}\<\>\|\/\\~;=]+/, /\n/
41
- if string.length > 5
42
- @string_cache[string] = true
43
- return string
44
- end
37
+ if string.match?(%r{^[^\d.:-]?[[:alpha:]_\s!@#$%\^&*(){}<>|/\\~;=]+}) || string.match?(/\n/)
38
+ return string if string.length > 5
45
39
 
46
- case string
47
- when /^[^ytonf~]/i
48
- @string_cache[string] = true
40
+ if string.match?(/^[^ytonf~]/i)
49
41
  string
50
- when '~', /^null$/i
42
+ elsif string == '~' || string.match?(/^null$/i)
51
43
  nil
52
- when /^(yes|true|on)$/i
44
+ elsif string.match?(/^(yes|true|on)$/i)
53
45
  true
54
- when /^(no|false|off)$/i
46
+ elsif string.match?(/^(no|false|off)$/i)
55
47
  false
56
48
  else
57
- @string_cache[string] = true
58
49
  string
59
50
  end
60
- when TIME
51
+ elsif string.match?(TIME)
61
52
  begin
62
53
  parse_time string
63
54
  rescue ArgumentError
64
55
  string
65
56
  end
66
- when /^\d{4}-(?:1[012]|0\d|\d)-(?:[12]\d|3[01]|0\d|\d)$/
57
+ elsif string.match?(/^\d{4}-(?:1[012]|0\d|\d)-(?:[12]\d|3[01]|0\d|\d)$/)
67
58
  require 'date'
68
59
  begin
69
- class_loader.date.strptime(string, '%Y-%m-%d')
60
+ class_loader.date.strptime(string, '%F', Date::GREGORIAN)
70
61
  rescue ArgumentError
71
62
  string
72
63
  end
73
- when /^\.inf$/i
64
+ elsif string.match?(/^\.inf$/i)
74
65
  Float::INFINITY
75
- when /^-\.inf$/i
66
+ elsif string.match?(/^-\.inf$/i)
76
67
  -Float::INFINITY
77
- when /^\.nan$/i
68
+ elsif string.match?(/^\.nan$/i)
78
69
  Float::NAN
79
- when /^:./
70
+ elsif string.match?(/^:./)
80
71
  if string =~ /^:(["'])(.*)\1/
81
72
  @symbol_cache[string] = class_loader.symbolize($2.sub(/^:/, ''))
82
73
  else
83
74
  @symbol_cache[string] = class_loader.symbolize(string.sub(/^:/, ''))
84
75
  end
85
- when /^[-+]?[0-9][0-9_]*(:[0-5]?[0-9]){1,2}$/
76
+ elsif string.match?(/^[-+]?[0-9][0-9_]*(:[0-5]?[0-9]){1,2}$/)
86
77
  i = 0
87
78
  string.split(':').each_with_index do |n,e|
88
79
  i += (n.to_i * 60 ** (e - 2).abs)
89
80
  end
90
81
  i
91
- when /^[-+]?[0-9][0-9_]*(:[0-5]?[0-9]){1,2}\.[0-9_]*$/
82
+ elsif string.match?(/^[-+]?[0-9][0-9_]*(:[0-5]?[0-9]){1,2}\.[0-9_]*$/)
92
83
  i = 0
93
84
  string.split(':').each_with_index do |n,e|
94
85
  i += (n.to_f * 60 ** (e - 2).abs)
95
86
  end
96
87
  i
97
- when FLOAT
98
- if string =~ /\A[-+]?\.\Z/
99
- @string_cache[string] = true
88
+ elsif string.match?(FLOAT)
89
+ if string.match?(/\A[-+]?\.\Z/)
100
90
  string
101
91
  else
102
92
  Float(string.gsub(/[,_]|\.([Ee]|$)/, '\1'))
103
93
  end
94
+ elsif string.match?(INTEGER)
95
+ parse_int string
104
96
  else
105
- int = parse_int string.gsub(/[,_]/, '')
106
- return int if int
107
-
108
- @string_cache[string] = true
109
97
  string
110
98
  end
111
99
  end
@@ -113,8 +101,7 @@ module Psych
113
101
  ###
114
102
  # Parse and return an int from +string+
115
103
  def parse_int string
116
- return unless INTEGER === string
117
- Integer(string)
104
+ Integer(string.gsub(/[,_]/, ''))
118
105
  end
119
106
 
120
107
  ###