yarp 0.12.0 → 0.13.0

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.
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
- }