yarp 0.12.0 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +29 -8
  3. data/CONTRIBUTING.md +2 -2
  4. data/Makefile +5 -5
  5. data/README.md +11 -12
  6. data/config.yml +6 -2
  7. data/docs/build_system.md +21 -21
  8. data/docs/building.md +4 -4
  9. data/docs/configuration.md +25 -21
  10. data/docs/design.md +2 -2
  11. data/docs/encoding.md +17 -17
  12. data/docs/fuzzing.md +4 -4
  13. data/docs/heredocs.md +3 -3
  14. data/docs/mapping.md +94 -94
  15. data/docs/ripper.md +4 -4
  16. data/docs/ruby_api.md +11 -11
  17. data/docs/serialization.md +17 -16
  18. data/docs/testing.md +6 -6
  19. data/ext/prism/api_node.c +4725 -0
  20. data/ext/{yarp → prism}/api_pack.c +82 -82
  21. data/ext/{yarp → prism}/extconf.rb +13 -13
  22. data/ext/{yarp → prism}/extension.c +175 -168
  23. data/ext/prism/extension.h +18 -0
  24. data/include/prism/ast.h +1932 -0
  25. data/include/prism/defines.h +45 -0
  26. data/include/prism/diagnostic.h +231 -0
  27. data/include/{yarp/enc/yp_encoding.h → prism/enc/pm_encoding.h} +40 -40
  28. data/include/prism/node.h +41 -0
  29. data/include/prism/pack.h +141 -0
  30. data/include/{yarp → prism}/parser.h +143 -142
  31. data/include/prism/regexp.h +19 -0
  32. data/include/prism/unescape.h +48 -0
  33. data/include/prism/util/pm_buffer.h +51 -0
  34. data/include/{yarp/util/yp_char.h → prism/util/pm_char.h} +20 -20
  35. data/include/{yarp/util/yp_constant_pool.h → prism/util/pm_constant_pool.h} +26 -22
  36. data/include/{yarp/util/yp_list.h → prism/util/pm_list.h} +21 -21
  37. data/include/prism/util/pm_memchr.h +14 -0
  38. data/include/{yarp/util/yp_newline_list.h → prism/util/pm_newline_list.h} +11 -11
  39. data/include/prism/util/pm_state_stack.h +24 -0
  40. data/include/{yarp/util/yp_string.h → prism/util/pm_string.h} +20 -20
  41. data/include/prism/util/pm_string_list.h +25 -0
  42. data/include/{yarp/util/yp_strpbrk.h → prism/util/pm_strpbrk.h} +7 -7
  43. data/include/prism/version.h +4 -0
  44. data/include/prism.h +82 -0
  45. data/lib/prism/compiler.rb +465 -0
  46. data/lib/prism/debug.rb +157 -0
  47. data/lib/{yarp/desugar_visitor.rb → prism/desugar_compiler.rb} +4 -2
  48. data/lib/prism/dispatcher.rb +2051 -0
  49. data/lib/prism/dsl.rb +750 -0
  50. data/lib/{yarp → prism}/ffi.rb +66 -67
  51. data/lib/{yarp → prism}/lex_compat.rb +40 -43
  52. data/lib/{yarp/mutation_visitor.rb → prism/mutation_compiler.rb} +3 -3
  53. data/lib/{yarp → prism}/node.rb +2012 -2593
  54. data/lib/prism/node_ext.rb +55 -0
  55. data/lib/prism/node_inspector.rb +68 -0
  56. data/lib/{yarp → prism}/pack.rb +1 -1
  57. data/lib/{yarp → prism}/parse_result/comments.rb +1 -1
  58. data/lib/{yarp → prism}/parse_result/newlines.rb +1 -1
  59. data/lib/prism/parse_result.rb +266 -0
  60. data/lib/{yarp → prism}/pattern.rb +14 -14
  61. data/lib/{yarp → prism}/ripper_compat.rb +5 -5
  62. data/lib/{yarp → prism}/serialize.rb +12 -7
  63. data/lib/prism/visitor.rb +470 -0
  64. data/lib/prism.rb +64 -0
  65. data/lib/yarp.rb +2 -614
  66. data/src/diagnostic.c +213 -208
  67. data/src/enc/pm_big5.c +52 -0
  68. data/src/enc/pm_euc_jp.c +58 -0
  69. data/src/enc/{yp_gbk.c → pm_gbk.c} +16 -16
  70. data/src/enc/pm_shift_jis.c +56 -0
  71. data/src/enc/{yp_tables.c → pm_tables.c} +69 -69
  72. data/src/enc/{yp_unicode.c → pm_unicode.c} +40 -40
  73. data/src/enc/pm_windows_31j.c +56 -0
  74. data/src/node.c +1293 -1233
  75. data/src/pack.c +247 -247
  76. data/src/prettyprint.c +1479 -1479
  77. data/src/{yarp.c → prism.c} +5205 -5083
  78. data/src/regexp.c +132 -132
  79. data/src/serialize.c +1121 -1121
  80. data/src/token_type.c +169 -167
  81. data/src/unescape.c +106 -87
  82. data/src/util/pm_buffer.c +103 -0
  83. data/src/util/{yp_char.c → pm_char.c} +72 -72
  84. data/src/util/{yp_constant_pool.c → pm_constant_pool.c} +85 -64
  85. data/src/util/{yp_list.c → pm_list.c} +10 -10
  86. data/src/util/{yp_memchr.c → pm_memchr.c} +6 -4
  87. data/src/util/{yp_newline_list.c → pm_newline_list.c} +21 -21
  88. data/src/util/{yp_state_stack.c → pm_state_stack.c} +4 -4
  89. data/src/util/{yp_string.c → pm_string.c} +38 -38
  90. data/src/util/pm_string_list.c +29 -0
  91. data/src/util/{yp_strncasecmp.c → pm_strncasecmp.c} +1 -1
  92. data/src/util/{yp_strpbrk.c → pm_strpbrk.c} +8 -8
  93. data/yarp.gemspec +68 -59
  94. metadata +70 -61
  95. data/ext/yarp/api_node.c +0 -4728
  96. data/ext/yarp/extension.h +0 -18
  97. data/include/yarp/ast.h +0 -1929
  98. data/include/yarp/defines.h +0 -45
  99. data/include/yarp/diagnostic.h +0 -226
  100. data/include/yarp/node.h +0 -42
  101. data/include/yarp/pack.h +0 -141
  102. data/include/yarp/regexp.h +0 -19
  103. data/include/yarp/unescape.h +0 -44
  104. data/include/yarp/util/yp_buffer.h +0 -51
  105. data/include/yarp/util/yp_memchr.h +0 -14
  106. data/include/yarp/util/yp_state_stack.h +0 -24
  107. data/include/yarp/util/yp_string_list.h +0 -25
  108. data/include/yarp/version.h +0 -4
  109. data/include/yarp.h +0 -82
  110. data/src/enc/yp_big5.c +0 -52
  111. data/src/enc/yp_euc_jp.c +0 -58
  112. data/src/enc/yp_shift_jis.c +0 -56
  113. data/src/enc/yp_windows_31j.c +0 -56
  114. data/src/util/yp_buffer.c +0 -101
  115. data/src/util/yp_string_list.c +0 -29
data/include/yarp.h DELETED
@@ -1,82 +0,0 @@
1
- #ifndef YARP_H
2
- #define YARP_H
3
-
4
- #include "yarp/defines.h"
5
- #include "yarp/ast.h"
6
- #include "yarp/diagnostic.h"
7
- #include "yarp/node.h"
8
- #include "yarp/pack.h"
9
- #include "yarp/parser.h"
10
- #include "yarp/regexp.h"
11
- #include "yarp/unescape.h"
12
- #include "yarp/util/yp_buffer.h"
13
- #include "yarp/util/yp_char.h"
14
- #include "yarp/util/yp_memchr.h"
15
- #include "yarp/util/yp_strpbrk.h"
16
- #include "yarp/version.h"
17
-
18
- #include <assert.h>
19
- #include <errno.h>
20
- #include <stdarg.h>
21
- #include <stdbool.h>
22
- #include <stdint.h>
23
- #include <stdio.h>
24
- #include <stdlib.h>
25
- #include <string.h>
26
-
27
- #ifndef _WIN32
28
- #include <strings.h>
29
- #endif
30
-
31
- void yp_serialize_content(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer);
32
-
33
- void yp_print_node(yp_parser_t *parser, yp_node_t *node);
34
-
35
- void yp_parser_metadata(yp_parser_t *parser, const char *metadata);
36
-
37
- // Generate a scope node from the given node.
38
- void yp_scope_node_init(yp_node_t *node, yp_scope_node_t *dest);
39
-
40
- // The YARP version and the serialization format.
41
- YP_EXPORTED_FUNCTION const char * yp_version(void);
42
-
43
- // Initialize a parser with the given start and end pointers.
44
- YP_EXPORTED_FUNCTION void yp_parser_init(yp_parser_t *parser, const uint8_t *source, size_t size, const char *filepath);
45
-
46
- // Register a callback that will be called whenever YARP changes the encoding it
47
- // is using to parse based on the magic comment.
48
- YP_EXPORTED_FUNCTION void yp_parser_register_encoding_changed_callback(yp_parser_t *parser, yp_encoding_changed_callback_t callback);
49
-
50
- // Register a callback that will be called when YARP encounters a magic comment
51
- // with an encoding referenced that it doesn't understand. The callback should
52
- // return NULL if it also doesn't understand the encoding or it should return a
53
- // pointer to a yp_encoding_t struct that contains the functions necessary to
54
- // parse identifiers.
55
- YP_EXPORTED_FUNCTION void yp_parser_register_encoding_decode_callback(yp_parser_t *parser, yp_encoding_decode_callback_t callback);
56
-
57
- // Free any memory associated with the given parser.
58
- YP_EXPORTED_FUNCTION void yp_parser_free(yp_parser_t *parser);
59
-
60
- // Parse the Ruby source associated with the given parser and return the tree.
61
- YP_EXPORTED_FUNCTION yp_node_t * yp_parse(yp_parser_t *parser);
62
-
63
- // Pretty-prints the AST represented by the given node to the given buffer.
64
- YP_EXPORTED_FUNCTION void yp_prettyprint(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer);
65
-
66
- // Serialize the AST represented by the given node to the given buffer.
67
- YP_EXPORTED_FUNCTION void yp_serialize(yp_parser_t *parser, yp_node_t *node, yp_buffer_t *buffer);
68
-
69
- // Parse the given source to the AST and serialize the AST to the given buffer.
70
- YP_EXPORTED_FUNCTION void yp_parse_serialize(const uint8_t *source, size_t size, yp_buffer_t *buffer, const char *metadata);
71
-
72
- // Lex the given source and serialize to the given buffer.
73
- YP_EXPORTED_FUNCTION void yp_lex_serialize(const uint8_t *source, size_t size, const char *filepath, yp_buffer_t *buffer);
74
-
75
- // Parse and serialize both the AST and the tokens represented by the given
76
- // source to the given buffer.
77
- YP_EXPORTED_FUNCTION void yp_parse_lex_serialize(const uint8_t *source, size_t size, yp_buffer_t *buffer, const char *metadata);
78
-
79
- // Returns a string representation of the given token type.
80
- YP_EXPORTED_FUNCTION const char * yp_token_type_to_str(yp_token_type_t token_type);
81
-
82
- #endif
data/src/enc/yp_big5.c DELETED
@@ -1,52 +0,0 @@
1
- #include "yarp/enc/yp_encoding.h"
2
-
3
- static size_t
4
- yp_encoding_big5_char_width(const uint8_t *b, ptrdiff_t n) {
5
- // These are the single byte characters.
6
- if (*b < 0x80) {
7
- return 1;
8
- }
9
-
10
- // These are the double byte characters.
11
- if ((n > 1) && (b[0] >= 0xA1 && b[0] <= 0xFE) && (b[1] >= 0x40 && b[1] <= 0xFE)) {
12
- return 2;
13
- }
14
-
15
- return 0;
16
- }
17
-
18
- static size_t
19
- yp_encoding_big5_alpha_char(const uint8_t *b, ptrdiff_t n) {
20
- if (yp_encoding_big5_char_width(b, n) == 1) {
21
- return yp_encoding_ascii_alpha_char(b, n);
22
- } else {
23
- return 0;
24
- }
25
- }
26
-
27
- static size_t
28
- yp_encoding_big5_alnum_char(const uint8_t *b, ptrdiff_t n) {
29
- if (yp_encoding_big5_char_width(b, n) == 1) {
30
- return yp_encoding_ascii_alnum_char(b, n);
31
- } else {
32
- return 0;
33
- }
34
- }
35
-
36
- static bool
37
- yp_encoding_big5_isupper_char(const uint8_t *b, ptrdiff_t n) {
38
- if (yp_encoding_big5_char_width(b, n) == 1) {
39
- return yp_encoding_ascii_isupper_char(b, n);
40
- } else {
41
- return false;
42
- }
43
- }
44
-
45
- yp_encoding_t yp_encoding_big5 = {
46
- .name = "big5",
47
- .char_width = yp_encoding_big5_char_width,
48
- .alnum_char = yp_encoding_big5_alnum_char,
49
- .alpha_char = yp_encoding_big5_alpha_char,
50
- .isupper_char = yp_encoding_big5_isupper_char,
51
- .multibyte = true
52
- };
data/src/enc/yp_euc_jp.c DELETED
@@ -1,58 +0,0 @@
1
- #include "yarp/enc/yp_encoding.h"
2
-
3
- static size_t
4
- yp_encoding_euc_jp_char_width(const uint8_t *b, ptrdiff_t n) {
5
- // These are the single byte characters.
6
- if (*b < 0x80) {
7
- return 1;
8
- }
9
-
10
- // These are the double byte characters.
11
- if (
12
- (n > 1) &&
13
- (
14
- ((b[0] == 0x8E) && (b[1] >= 0xA1 && b[1] <= 0xFE)) ||
15
- ((b[0] >= 0xA1 && b[0] <= 0xFE) && (b[1] >= 0xA1 && b[1] <= 0xFE))
16
- )
17
- ) {
18
- return 2;
19
- }
20
-
21
- return 0;
22
- }
23
-
24
- static size_t
25
- yp_encoding_euc_jp_alpha_char(const uint8_t *b, ptrdiff_t n) {
26
- if (yp_encoding_euc_jp_char_width(b, n) == 1) {
27
- return yp_encoding_ascii_alpha_char(b, n);
28
- } else {
29
- return 0;
30
- }
31
- }
32
-
33
- static size_t
34
- yp_encoding_euc_jp_alnum_char(const uint8_t *b, ptrdiff_t n) {
35
- if (yp_encoding_euc_jp_char_width(b, n) == 1) {
36
- return yp_encoding_ascii_alnum_char(b, n);
37
- } else {
38
- return 0;
39
- }
40
- }
41
-
42
- static bool
43
- yp_encoding_euc_jp_isupper_char(const uint8_t *b, ptrdiff_t n) {
44
- if (yp_encoding_euc_jp_char_width(b, n) == 1) {
45
- return yp_encoding_ascii_isupper_char(b, n);
46
- } else {
47
- return 0;
48
- }
49
- }
50
-
51
- yp_encoding_t yp_encoding_euc_jp = {
52
- .name = "euc-jp",
53
- .char_width = yp_encoding_euc_jp_char_width,
54
- .alnum_char = yp_encoding_euc_jp_alnum_char,
55
- .alpha_char = yp_encoding_euc_jp_alpha_char,
56
- .isupper_char = yp_encoding_euc_jp_isupper_char,
57
- .multibyte = true
58
- };
@@ -1,56 +0,0 @@
1
- #include "yarp/enc/yp_encoding.h"
2
-
3
- static size_t
4
- yp_encoding_shift_jis_char_width(const uint8_t *b, ptrdiff_t n) {
5
- // These are the single byte characters.
6
- if (*b < 0x80 || (*b >= 0xA1 && *b <= 0xDF)) {
7
- return 1;
8
- }
9
-
10
- // These are the double byte characters.
11
- if (
12
- (n > 1) &&
13
- ((b[0] >= 0x81 && b[0] <= 0x9F) || (b[0] >= 0xE0 && b[0] <= 0xFC)) &&
14
- (b[1] >= 0x40 && b[1] <= 0xFC)
15
- ) {
16
- return 2;
17
- }
18
-
19
- return 0;
20
- }
21
-
22
- static size_t
23
- yp_encoding_shift_jis_alpha_char(const uint8_t *b, ptrdiff_t n) {
24
- if (yp_encoding_shift_jis_char_width(b, n) == 1) {
25
- return yp_encoding_ascii_alpha_char(b, n);
26
- } else {
27
- return 0;
28
- }
29
- }
30
-
31
- static size_t
32
- yp_encoding_shift_jis_alnum_char(const uint8_t *b, ptrdiff_t n) {
33
- if (yp_encoding_shift_jis_char_width(b, n) == 1) {
34
- return yp_encoding_ascii_alnum_char(b, n);
35
- } else {
36
- return 0;
37
- }
38
- }
39
-
40
- static bool
41
- yp_encoding_shift_jis_isupper_char(const uint8_t *b, ptrdiff_t n) {
42
- if (yp_encoding_shift_jis_char_width(b, n) == 1) {
43
- return yp_encoding_ascii_isupper_char(b, n);
44
- } else {
45
- return 0;
46
- }
47
- }
48
-
49
- yp_encoding_t yp_encoding_shift_jis = {
50
- .name = "shift_jis",
51
- .char_width = yp_encoding_shift_jis_char_width,
52
- .alnum_char = yp_encoding_shift_jis_alnum_char,
53
- .alpha_char = yp_encoding_shift_jis_alpha_char,
54
- .isupper_char = yp_encoding_shift_jis_isupper_char,
55
- .multibyte = true
56
- };
@@ -1,56 +0,0 @@
1
- #include "yarp/enc/yp_encoding.h"
2
-
3
- static size_t
4
- yp_encoding_windows_31j_char_width(const uint8_t *b, ptrdiff_t n) {
5
- // These are the single byte characters.
6
- if (*b < 0x80 || (*b >= 0xA1 && *b <= 0xDF)) {
7
- return 1;
8
- }
9
-
10
- // These are the double byte characters.
11
- if (
12
- (n > 1) &&
13
- ((b[0] >= 0x81 && b[0] <= 0x9F) || (b[0] >= 0xE0 && b[0] <= 0xFC)) &&
14
- (b[1] >= 0x40 && b[1] <= 0xFC)
15
- ) {
16
- return 2;
17
- }
18
-
19
- return 0;
20
- }
21
-
22
- static size_t
23
- yp_encoding_windows_31j_alpha_char(const uint8_t *b, ptrdiff_t n) {
24
- if (yp_encoding_windows_31j_char_width(b, n) == 1) {
25
- return yp_encoding_ascii_alpha_char(b, n);
26
- } else {
27
- return 0;
28
- }
29
- }
30
-
31
- static size_t
32
- yp_encoding_windows_31j_alnum_char(const uint8_t *b, ptrdiff_t n) {
33
- if (yp_encoding_windows_31j_char_width(b, n) == 1) {
34
- return yp_encoding_ascii_alnum_char(b, n);
35
- } else {
36
- return 0;
37
- }
38
- }
39
-
40
- static bool
41
- yp_encoding_windows_31j_isupper_char(const uint8_t *b, ptrdiff_t n) {
42
- if (yp_encoding_windows_31j_char_width(b, n) == 1) {
43
- return yp_encoding_ascii_isupper_char(b, n);
44
- } else {
45
- return false;
46
- }
47
- }
48
-
49
- yp_encoding_t yp_encoding_windows_31j = {
50
- .name = "windows-31j",
51
- .char_width = yp_encoding_windows_31j_char_width,
52
- .alnum_char = yp_encoding_windows_31j_alnum_char,
53
- .alpha_char = yp_encoding_windows_31j_alpha_char,
54
- .isupper_char = yp_encoding_windows_31j_isupper_char,
55
- .multibyte = true
56
- };
data/src/util/yp_buffer.c DELETED
@@ -1,101 +0,0 @@
1
- #include "yarp/util/yp_buffer.h"
2
-
3
- #define YP_BUFFER_INITIAL_SIZE 1024
4
-
5
- // Return the size of the yp_buffer_t struct.
6
- size_t
7
- yp_buffer_sizeof(void) {
8
- return sizeof(yp_buffer_t);
9
- }
10
-
11
- // Initialize a yp_buffer_t with its default values.
12
- bool
13
- yp_buffer_init(yp_buffer_t *buffer) {
14
- buffer->length = 0;
15
- buffer->capacity = YP_BUFFER_INITIAL_SIZE;
16
-
17
- buffer->value = (char *) malloc(YP_BUFFER_INITIAL_SIZE);
18
- return buffer->value != NULL;
19
- }
20
-
21
- // Return the value of the buffer.
22
- char *
23
- yp_buffer_value(yp_buffer_t *buffer) {
24
- return buffer->value;
25
- }
26
-
27
- // Return the length of the buffer.
28
- size_t
29
- yp_buffer_length(yp_buffer_t *buffer) {
30
- return buffer->length;
31
- }
32
-
33
- // Append the given amount of space to the buffer.
34
- static inline void
35
- yp_buffer_append_length(yp_buffer_t *buffer, size_t length) {
36
- size_t next_length = buffer->length + length;
37
-
38
- if (next_length > buffer->capacity) {
39
- do {
40
- buffer->capacity *= 2;
41
- } while (next_length > buffer->capacity);
42
-
43
- buffer->value = realloc(buffer->value, buffer->capacity);
44
- }
45
-
46
- buffer->length = next_length;
47
- }
48
-
49
- // Append a generic pointer to memory to the buffer.
50
- static inline void
51
- yp_buffer_append(yp_buffer_t *buffer, const void *source, size_t length) {
52
- yp_buffer_append_length(buffer, length);
53
- memcpy(buffer->value + (buffer->length - length), source, length);
54
- }
55
-
56
- // Append the given amount of space as zeroes to the buffer.
57
- void
58
- yp_buffer_append_zeroes(yp_buffer_t *buffer, size_t length) {
59
- yp_buffer_append_length(buffer, length);
60
- memset(buffer->value + (buffer->length - length), 0, length);
61
- }
62
-
63
- // Append a string to the buffer.
64
- void
65
- yp_buffer_append_str(yp_buffer_t *buffer, const char *value, size_t length) {
66
- yp_buffer_append(buffer, value, length);
67
- }
68
-
69
- // Append a list of bytes to the buffer.
70
- void
71
- yp_buffer_append_bytes(yp_buffer_t *buffer, const uint8_t *value, size_t length) {
72
- yp_buffer_append(buffer, (const char *) value, length);
73
- }
74
-
75
- // Append a single byte to the buffer.
76
- void
77
- yp_buffer_append_u8(yp_buffer_t *buffer, uint8_t value) {
78
- const void *source = &value;
79
- yp_buffer_append(buffer, source, sizeof(uint8_t));
80
- }
81
-
82
- // Append a 32-bit unsigned integer to the buffer.
83
- void
84
- yp_buffer_append_u32(yp_buffer_t *buffer, uint32_t value) {
85
- if (value < 128) {
86
- yp_buffer_append_u8(buffer, (uint8_t) value);
87
- } else {
88
- uint32_t n = value;
89
- while (n >= 128) {
90
- yp_buffer_append_u8(buffer, (uint8_t) (n | 128));
91
- n >>= 7;
92
- }
93
- yp_buffer_append_u8(buffer, (uint8_t) n);
94
- }
95
- }
96
-
97
- // Free the memory associated with the buffer.
98
- void
99
- yp_buffer_free(yp_buffer_t *buffer) {
100
- free(buffer->value);
101
- }
@@ -1,29 +0,0 @@
1
- #include "yarp/util/yp_string_list.h"
2
-
3
- // Initialize a yp_string_list_t with its default values.
4
- void
5
- yp_string_list_init(yp_string_list_t *string_list) {
6
- string_list->strings = (yp_string_t *) malloc(sizeof(yp_string_t));
7
- string_list->length = 0;
8
- string_list->capacity = 1;
9
- }
10
-
11
- // Append a yp_string_t to the given string list.
12
- void
13
- yp_string_list_append(yp_string_list_t *string_list, yp_string_t *string) {
14
- if (string_list->length + 1 > string_list->capacity) {
15
- yp_string_t *original_string = string_list->strings;
16
- string_list->capacity *= 2;
17
- string_list->strings = (yp_string_t *) malloc(string_list->capacity * sizeof(yp_string_t));
18
- memcpy(string_list->strings, original_string, (string_list->length) * sizeof(yp_string_t));
19
- free(original_string);
20
- }
21
-
22
- string_list->strings[string_list->length++] = *string;
23
- }
24
-
25
- // Free the memory associated with the string list.
26
- void
27
- yp_string_list_free(yp_string_list_t *string_list) {
28
- free(string_list->strings);
29
- }