prism 1.9.0 → 2.0.0.rc1

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 (238) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +84 -0
  3. data/Makefile +41 -12
  4. data/README.md +35 -97
  5. data/config.yml +174 -161
  6. data/docs/build_system.md +2 -2
  7. data/docs/configuration.md +5 -4
  8. data/docs/encoding.md +2 -2
  9. data/docs/fuzzing.md +4 -11
  10. data/docs/javascript.md +19 -4
  11. data/docs/mapping.md +1 -1
  12. data/docs/releasing.md +77 -5
  13. data/docs/relocation.md +2 -4
  14. data/docs/serialization.md +21 -24
  15. data/docs/testing.md +46 -29
  16. data/ext/prism/api_node.c +1461 -1401
  17. data/ext/prism/extconf.rb +3 -4
  18. data/ext/prism/extension.c +778 -422
  19. data/ext/prism/extension.h +3 -3
  20. data/include/prism/arena.h +37 -0
  21. data/include/prism/ast.h +2727 -610
  22. data/include/prism/buffer.h +52 -0
  23. data/include/prism/comments.h +55 -0
  24. data/include/prism/compiler/accel.h +24 -0
  25. data/include/prism/compiler/align.h +36 -0
  26. data/include/prism/compiler/assume.h +25 -0
  27. data/include/prism/compiler/exported.h +24 -0
  28. data/include/prism/compiler/fallthrough.h +22 -0
  29. data/include/prism/compiler/filesystem.h +32 -0
  30. data/include/prism/compiler/flex_array.h +19 -0
  31. data/include/prism/compiler/force_inline.h +21 -0
  32. data/include/prism/compiler/format.h +25 -0
  33. data/include/prism/compiler/inline.h +17 -0
  34. data/include/prism/compiler/nodiscard.h +22 -0
  35. data/include/prism/compiler/nonnull.h +18 -0
  36. data/include/prism/compiler/unused.h +18 -0
  37. data/include/prism/constant_pool.h +81 -0
  38. data/include/prism/diagnostic.h +38 -403
  39. data/include/prism/errors_format.h +53 -0
  40. data/include/prism/excludes.h +29 -0
  41. data/include/prism/integer.h +41 -0
  42. data/include/prism/internal/allocator.h +68 -0
  43. data/include/prism/internal/allocator_debug.h +88 -0
  44. data/include/prism/internal/arena.h +108 -0
  45. data/include/prism/internal/bit.h +42 -0
  46. data/include/prism/internal/buffer.h +91 -0
  47. data/include/prism/internal/char.h +145 -0
  48. data/include/prism/internal/comments.h +53 -0
  49. data/include/prism/internal/constant_pool.h +152 -0
  50. data/include/prism/internal/diagnostic.h +389 -0
  51. data/include/prism/{encoding.h → internal/encoding.h} +27 -68
  52. data/include/prism/internal/integer.h +68 -0
  53. data/include/prism/internal/isinf.h +16 -0
  54. data/include/prism/internal/line_offset_list.h +34 -0
  55. data/include/prism/{util/pm_list.h → internal/list.h} +11 -52
  56. data/include/prism/internal/magic_comments.h +23 -0
  57. data/include/prism/internal/memchr.h +15 -0
  58. data/include/prism/internal/node.h +38 -0
  59. data/include/prism/internal/options.h +232 -0
  60. data/include/prism/internal/parser.h +984 -0
  61. data/include/prism/internal/regexp.h +26 -0
  62. data/include/prism/internal/serialize.h +39 -0
  63. data/include/prism/internal/source.h +72 -0
  64. data/include/prism/{static_literals.h → internal/static_literals.h} +26 -47
  65. data/include/prism/internal/stringy.h +35 -0
  66. data/include/prism/{util/pm_strncasecmp.h → internal/strncasecmp.h} +3 -17
  67. data/include/prism/{util/pm_strpbrk.h → internal/strpbrk.h} +7 -20
  68. data/include/prism/internal/tokens.h +11 -0
  69. data/include/prism/json.h +32 -0
  70. data/include/prism/line_offset_list.h +61 -0
  71. data/include/prism/magic_comments.h +35 -0
  72. data/include/prism/node.h +18 -53
  73. data/include/prism/options.h +146 -280
  74. data/include/prism/parser.h +336 -868
  75. data/include/prism/prettyprint.h +6 -9
  76. data/include/prism/serialize.h +115 -0
  77. data/include/prism/source.h +155 -0
  78. data/include/prism/stream.h +28 -0
  79. data/include/prism/string_query.h +63 -0
  80. data/include/prism/stringy.h +72 -0
  81. data/include/prism/version.h +12 -3
  82. data/include/prism.h +43 -320
  83. data/lib/prism/compiler.rb +319 -305
  84. data/lib/prism/desugar_compiler.rb +105 -34
  85. data/lib/prism/dispatcher.rb +646 -473
  86. data/lib/prism/dot_visitor.rb +592 -511
  87. data/lib/prism/dsl.rb +391 -25
  88. data/lib/prism/ffi.rb +252 -90
  89. data/lib/prism/inspect_visitor.rb +357 -325
  90. data/lib/prism/lex_compat.rb +254 -212
  91. data/lib/prism/mutation_compiler.rb +313 -305
  92. data/lib/prism/node.rb +20268 -7030
  93. data/lib/prism/node_ext.rb +180 -187
  94. data/lib/prism/node_find.rb +215 -0
  95. data/lib/prism/parse_result/errors.rb +7 -1
  96. data/lib/prism/parse_result/newlines.rb +276 -8
  97. data/lib/prism/parse_result.rb +453 -139
  98. data/lib/prism/pattern.rb +65 -20
  99. data/lib/prism/reflection.rb +23 -12
  100. data/lib/prism/relocation.rb +149 -87
  101. data/lib/prism/serialize.rb +3443 -535
  102. data/lib/prism/string_query.rb +16 -1
  103. data/lib/prism/translation/parser/builder.rb +10 -2
  104. data/lib/prism/translation/parser/compiler.rb +44 -52
  105. data/lib/prism/translation/parser/lexer.rb +41 -92
  106. data/lib/prism/translation/parser.rb +1 -1
  107. data/lib/prism/translation/parser_current.rb +1 -1
  108. data/lib/prism/translation/ripper/lexer.rb +8 -10
  109. data/lib/prism/translation/ripper/sexp.rb +2 -10
  110. data/lib/prism/translation/ripper/shim.rb +2 -0
  111. data/lib/prism/translation/ripper.rb +967 -209
  112. data/lib/prism/translation/ruby_parser.rb +73 -316
  113. data/lib/prism/translation.rb +2 -0
  114. data/lib/prism/visitor.rb +632 -5
  115. data/lib/prism.rb +79 -9
  116. data/prism.gemspec +122 -60
  117. data/rbi/generated/prism/compiler.rbi +489 -0
  118. data/rbi/generated/prism/desugar_compiler.rbi +306 -0
  119. data/rbi/generated/prism/dispatcher.rbi +1138 -0
  120. data/rbi/generated/prism/dot_visitor.rbi +618 -0
  121. data/rbi/generated/prism/dsl.rbi +751 -0
  122. data/rbi/generated/prism/inspect_visitor.rbi +503 -0
  123. data/rbi/generated/prism/lex_compat.rbi +162 -0
  124. data/rbi/generated/prism/mutation_compiler.rbi +464 -0
  125. data/rbi/generated/prism/node.rbi +13681 -0
  126. data/rbi/generated/prism/node_ext.rbi +259 -0
  127. data/rbi/generated/prism/node_find.rbi +79 -0
  128. data/rbi/generated/prism/parse_result/errors.rbi +21 -0
  129. data/rbi/generated/prism/parse_result/newlines.rbi +208 -0
  130. data/rbi/generated/prism/parse_result.rbi +764 -0
  131. data/rbi/generated/prism/pattern.rbi +134 -0
  132. data/rbi/generated/prism/reflection.rbi +89 -0
  133. data/rbi/generated/prism/relocation.rbi +329 -0
  134. data/rbi/generated/prism/serialize.rbi +181 -0
  135. data/rbi/generated/prism/string_query.rbi +36 -0
  136. data/rbi/generated/prism/translation.rbi +7 -0
  137. data/rbi/generated/prism/visitor.rbi +650 -0
  138. data/rbi/generated/prism.rbi +86 -0
  139. data/rbi/prism/translation/parser_versions.rbi +5 -0
  140. data/rbi/rubyvm/node_find.rbi +14 -0
  141. data/sig/generated/prism/compiler.rbs +492 -0
  142. data/sig/generated/prism/desugar_compiler.rbs +305 -0
  143. data/sig/generated/prism/dispatcher.rbs +1292 -0
  144. data/sig/generated/prism/dot_visitor.rbs +635 -0
  145. data/sig/generated/prism/dsl.rbs +928 -0
  146. data/sig/generated/prism/inspect_visitor.rbs +509 -0
  147. data/sig/generated/prism/lex_compat.rbs +166 -0
  148. data/sig/{prism → generated/prism}/mutation_compiler.rbs +309 -4
  149. data/sig/generated/prism/node.rbs +20160 -0
  150. data/sig/generated/prism/node_ext.rbs +290 -0
  151. data/sig/generated/prism/node_find.rbs +90 -0
  152. data/sig/generated/prism/parse_result/errors.rbs +22 -0
  153. data/sig/generated/prism/parse_result/newlines.rbs +223 -0
  154. data/sig/generated/prism/parse_result.rbs +859 -0
  155. data/sig/generated/prism/pattern.rbs +156 -0
  156. data/sig/generated/prism/reflection.rbs +101 -0
  157. data/sig/generated/prism/relocation.rbs +428 -0
  158. data/sig/generated/prism/serialize.rbs +195 -0
  159. data/sig/generated/prism/string_query.rbs +36 -0
  160. data/sig/generated/prism/translation.rbs +8 -0
  161. data/sig/generated/prism/visitor.rbs +1111 -0
  162. data/sig/generated/prism.rbs +84 -0
  163. data/sig/manifest.yaml +2 -0
  164. data/src/arena.c +117 -0
  165. data/src/{util/pm_buffer.c → buffer.c} +44 -21
  166. data/src/{util/pm_char.c → char.c} +28 -57
  167. data/src/comments.c +454 -0
  168. data/src/constant_pool.c +406 -0
  169. data/src/diagnostic.c +97 -65
  170. data/src/encoding.c +8 -3
  171. data/src/errors_format.c +519 -0
  172. data/src/{util/pm_integer.c → integer.c} +33 -22
  173. data/src/json.c +5733 -0
  174. data/src/line_offset_list.c +100 -0
  175. data/src/list.c +24 -0
  176. data/src/{util/pm_memchr.c → memchr.c} +8 -6
  177. data/src/node.c +3504 -7674
  178. data/src/options.c +162 -49
  179. data/src/parser.c +349 -0
  180. data/src/prettyprint.c +421 -354
  181. data/src/prism.c +8030 -6970
  182. data/src/regexp.c +961 -45
  183. data/src/serialize.c +459 -424
  184. data/src/source.c +518 -0
  185. data/src/static_literals.c +111 -43
  186. data/src/string_query.c +166 -0
  187. data/src/stringy.c +91 -0
  188. data/src/{util/pm_strncasecmp.c → strncasecmp.c} +5 -4
  189. data/src/strpbrk.c +447 -0
  190. data/src/{token_type.c → tokens.c} +39 -18
  191. metadata +122 -61
  192. data/ext/prism/api_pack.c +0 -276
  193. data/include/prism/defines.h +0 -260
  194. data/include/prism/pack.h +0 -163
  195. data/include/prism/regexp.h +0 -43
  196. data/include/prism/util/pm_buffer.h +0 -236
  197. data/include/prism/util/pm_char.h +0 -204
  198. data/include/prism/util/pm_constant_pool.h +0 -218
  199. data/include/prism/util/pm_integer.h +0 -130
  200. data/include/prism/util/pm_memchr.h +0 -29
  201. data/include/prism/util/pm_newline_list.h +0 -113
  202. data/include/prism/util/pm_string.h +0 -200
  203. data/lib/prism/pack.rb +0 -230
  204. data/lib/prism/parse_result/comments.rb +0 -188
  205. data/rbi/prism/compiler.rbi +0 -12
  206. data/rbi/prism/dsl.rbi +0 -524
  207. data/rbi/prism/inspect_visitor.rbi +0 -12
  208. data/rbi/prism/node.rbi +0 -8750
  209. data/rbi/prism/node_ext.rbi +0 -107
  210. data/rbi/prism/parse_result.rbi +0 -404
  211. data/rbi/prism/reflection.rbi +0 -58
  212. data/rbi/prism/string_query.rbi +0 -12
  213. data/rbi/prism/visitor.rbi +0 -473
  214. data/rbi/prism.rbi +0 -63
  215. data/sig/prism/compiler.rbs +0 -9
  216. data/sig/prism/dispatcher.rbs +0 -19
  217. data/sig/prism/dot_visitor.rbs +0 -6
  218. data/sig/prism/dsl.rbs +0 -351
  219. data/sig/prism/inspect_visitor.rbs +0 -22
  220. data/sig/prism/lex_compat.rbs +0 -10
  221. data/sig/prism/node.rbs +0 -4042
  222. data/sig/prism/node_ext.rbs +0 -149
  223. data/sig/prism/pack.rbs +0 -43
  224. data/sig/prism/parse_result/comments.rbs +0 -38
  225. data/sig/prism/parse_result.rbs +0 -197
  226. data/sig/prism/pattern.rbs +0 -13
  227. data/sig/prism/reflection.rbs +0 -50
  228. data/sig/prism/relocation.rbs +0 -185
  229. data/sig/prism/serialize.rbs +0 -8
  230. data/sig/prism/string_query.rbs +0 -11
  231. data/sig/prism/visitor.rbs +0 -169
  232. data/sig/prism.rbs +0 -272
  233. data/src/pack.c +0 -509
  234. data/src/util/pm_constant_pool.c +0 -342
  235. data/src/util/pm_list.c +0 -49
  236. data/src/util/pm_newline_list.c +0 -125
  237. data/src/util/pm_string.c +0 -381
  238. data/src/util/pm_strpbrk.c +0 -206
data/src/pack.c DELETED
@@ -1,509 +0,0 @@
1
- #include "prism/pack.h"
2
-
3
- // We optionally support parsing String#pack templates. For systems that don't
4
- // want or need this functionality, it can be turned off with the
5
- // PRISM_EXCLUDE_PACK define.
6
- #ifdef PRISM_EXCLUDE_PACK
7
-
8
- void pm_pack_parse(void) {}
9
-
10
- #else
11
-
12
- #include <stdbool.h>
13
- #include <errno.h>
14
-
15
- static uintmax_t
16
- strtoumaxc(const char **format) {
17
- uintmax_t value = 0;
18
- while (**format >= '0' && **format <= '9') {
19
- if (value > UINTMAX_MAX / 10) {
20
- errno = ERANGE;
21
- }
22
- value = value * 10 + ((uintmax_t) (**format - '0'));
23
- (*format)++;
24
- }
25
- return value;
26
- }
27
-
28
- PRISM_EXPORTED_FUNCTION pm_pack_result
29
- pm_pack_parse(
30
- pm_pack_variant variant,
31
- const char **format,
32
- const char *format_end,
33
- pm_pack_type *type,
34
- pm_pack_signed *signed_type,
35
- pm_pack_endian *endian,
36
- pm_pack_size *size,
37
- pm_pack_length_type *length_type,
38
- uint64_t *length,
39
- pm_pack_encoding *encoding
40
- ) {
41
- if (*encoding == PM_PACK_ENCODING_START) {
42
- *encoding = PM_PACK_ENCODING_US_ASCII;
43
- }
44
-
45
- if (*format == format_end) {
46
- *type = PM_PACK_END;
47
- *signed_type = PM_PACK_SIGNED_NA;
48
- *endian = PM_PACK_ENDIAN_NA;
49
- *size = PM_PACK_SIZE_NA;
50
- *length_type = PM_PACK_LENGTH_NA;
51
- return PM_PACK_OK;
52
- }
53
-
54
- *length_type = PM_PACK_LENGTH_FIXED;
55
- *length = 1;
56
- bool length_changed_allowed = true;
57
-
58
- char directive = **format;
59
- (*format)++;
60
- switch (directive) {
61
- case ' ':
62
- case '\t':
63
- case '\n':
64
- case '\v':
65
- case '\f':
66
- case '\r':
67
- *type = PM_PACK_SPACE;
68
- *signed_type = PM_PACK_SIGNED_NA;
69
- *endian = PM_PACK_ENDIAN_NA;
70
- *size = PM_PACK_SIZE_NA;
71
- *length_type = PM_PACK_LENGTH_NA;
72
- *length = 0;
73
- return PM_PACK_OK;
74
- case '#':
75
- while ((*format < format_end) && (**format != '\n')) {
76
- (*format)++;
77
- }
78
- *type = PM_PACK_COMMENT;
79
- *signed_type = PM_PACK_SIGNED_NA;
80
- *endian = PM_PACK_ENDIAN_NA;
81
- *size = PM_PACK_SIZE_NA;
82
- *length_type = PM_PACK_LENGTH_NA;
83
- *length = 0;
84
- return PM_PACK_OK;
85
- case 'C':
86
- *type = PM_PACK_INTEGER;
87
- *signed_type = PM_PACK_UNSIGNED;
88
- *endian = PM_PACK_AGNOSTIC_ENDIAN;
89
- *size = PM_PACK_SIZE_8;
90
- break;
91
- case 'S':
92
- *type = PM_PACK_INTEGER;
93
- *signed_type = PM_PACK_UNSIGNED;
94
- *endian = PM_PACK_NATIVE_ENDIAN;
95
- *size = PM_PACK_SIZE_16;
96
- break;
97
- case 'L':
98
- *type = PM_PACK_INTEGER;
99
- *signed_type = PM_PACK_UNSIGNED;
100
- *endian = PM_PACK_NATIVE_ENDIAN;
101
- *size = PM_PACK_SIZE_32;
102
- break;
103
- case 'Q':
104
- *type = PM_PACK_INTEGER;
105
- *signed_type = PM_PACK_UNSIGNED;
106
- *endian = PM_PACK_NATIVE_ENDIAN;
107
- *size = PM_PACK_SIZE_64;
108
- break;
109
- case 'J':
110
- *type = PM_PACK_INTEGER;
111
- *signed_type = PM_PACK_UNSIGNED;
112
- *endian = PM_PACK_NATIVE_ENDIAN;
113
- *size = PM_PACK_SIZE_P;
114
- break;
115
- case 'c':
116
- *type = PM_PACK_INTEGER;
117
- *signed_type = PM_PACK_SIGNED;
118
- *endian = PM_PACK_AGNOSTIC_ENDIAN;
119
- *size = PM_PACK_SIZE_8;
120
- break;
121
- case 's':
122
- *type = PM_PACK_INTEGER;
123
- *signed_type = PM_PACK_SIGNED;
124
- *endian = PM_PACK_NATIVE_ENDIAN;
125
- *size = PM_PACK_SIZE_16;
126
- break;
127
- case 'l':
128
- *type = PM_PACK_INTEGER;
129
- *signed_type = PM_PACK_SIGNED;
130
- *endian = PM_PACK_NATIVE_ENDIAN;
131
- *size = PM_PACK_SIZE_32;
132
- break;
133
- case 'q':
134
- *type = PM_PACK_INTEGER;
135
- *signed_type = PM_PACK_SIGNED;
136
- *endian = PM_PACK_NATIVE_ENDIAN;
137
- *size = PM_PACK_SIZE_64;
138
- break;
139
- case 'j':
140
- *type = PM_PACK_INTEGER;
141
- *signed_type = PM_PACK_SIGNED;
142
- *endian = PM_PACK_NATIVE_ENDIAN;
143
- *size = PM_PACK_SIZE_P;
144
- break;
145
- case 'I':
146
- *type = PM_PACK_INTEGER;
147
- *signed_type = PM_PACK_UNSIGNED;
148
- *endian = PM_PACK_NATIVE_ENDIAN;
149
- *size = PM_PACK_SIZE_INT;
150
- break;
151
- case 'i':
152
- *type = PM_PACK_INTEGER;
153
- *signed_type = PM_PACK_SIGNED;
154
- *endian = PM_PACK_NATIVE_ENDIAN;
155
- *size = PM_PACK_SIZE_INT;
156
- break;
157
- case 'n':
158
- *type = PM_PACK_INTEGER;
159
- *signed_type = PM_PACK_UNSIGNED;
160
- *endian = PM_PACK_BIG_ENDIAN;
161
- *size = PM_PACK_SIZE_16;
162
- length_changed_allowed = false;
163
- break;
164
- case 'N':
165
- *type = PM_PACK_INTEGER;
166
- *signed_type = PM_PACK_UNSIGNED;
167
- *endian = PM_PACK_BIG_ENDIAN;
168
- *size = PM_PACK_SIZE_32;
169
- length_changed_allowed = false;
170
- break;
171
- case 'v':
172
- *type = PM_PACK_INTEGER;
173
- *signed_type = PM_PACK_UNSIGNED;
174
- *endian = PM_PACK_LITTLE_ENDIAN;
175
- *size = PM_PACK_SIZE_16;
176
- length_changed_allowed = false;
177
- break;
178
- case 'V':
179
- *type = PM_PACK_INTEGER;
180
- *signed_type = PM_PACK_UNSIGNED;
181
- *endian = PM_PACK_LITTLE_ENDIAN;
182
- *size = PM_PACK_SIZE_32;
183
- length_changed_allowed = false;
184
- break;
185
- case 'U':
186
- *type = PM_PACK_UTF8;
187
- *signed_type = PM_PACK_SIGNED_NA;
188
- *endian = PM_PACK_ENDIAN_NA;
189
- *size = PM_PACK_SIZE_NA;
190
- break;
191
- case 'w':
192
- *type = PM_PACK_BER;
193
- *signed_type = PM_PACK_SIGNED_NA;
194
- *endian = PM_PACK_ENDIAN_NA;
195
- *size = PM_PACK_SIZE_NA;
196
- break;
197
- case 'D':
198
- case 'd':
199
- *type = PM_PACK_FLOAT;
200
- *signed_type = PM_PACK_SIGNED_NA;
201
- *endian = PM_PACK_NATIVE_ENDIAN;
202
- *size = PM_PACK_SIZE_64;
203
- break;
204
- case 'F':
205
- case 'f':
206
- *type = PM_PACK_FLOAT;
207
- *signed_type = PM_PACK_SIGNED_NA;
208
- *endian = PM_PACK_NATIVE_ENDIAN;
209
- *size = PM_PACK_SIZE_32;
210
- break;
211
- case 'E':
212
- *type = PM_PACK_FLOAT;
213
- *signed_type = PM_PACK_SIGNED_NA;
214
- *endian = PM_PACK_LITTLE_ENDIAN;
215
- *size = PM_PACK_SIZE_64;
216
- break;
217
- case 'e':
218
- *type = PM_PACK_FLOAT;
219
- *signed_type = PM_PACK_SIGNED_NA;
220
- *endian = PM_PACK_LITTLE_ENDIAN;
221
- *size = PM_PACK_SIZE_32;
222
- break;
223
- case 'G':
224
- *type = PM_PACK_FLOAT;
225
- *signed_type = PM_PACK_SIGNED_NA;
226
- *endian = PM_PACK_BIG_ENDIAN;
227
- *size = PM_PACK_SIZE_64;
228
- break;
229
- case 'g':
230
- *type = PM_PACK_FLOAT;
231
- *signed_type = PM_PACK_SIGNED_NA;
232
- *endian = PM_PACK_BIG_ENDIAN;
233
- *size = PM_PACK_SIZE_32;
234
- break;
235
- case 'A':
236
- *type = PM_PACK_STRING_SPACE_PADDED;
237
- *signed_type = PM_PACK_SIGNED_NA;
238
- *endian = PM_PACK_ENDIAN_NA;
239
- *size = PM_PACK_SIZE_NA;
240
- break;
241
- case 'a':
242
- *type = PM_PACK_STRING_NULL_PADDED;
243
- *signed_type = PM_PACK_SIGNED_NA;
244
- *endian = PM_PACK_ENDIAN_NA;
245
- *size = PM_PACK_SIZE_NA;
246
- break;
247
- case 'Z':
248
- *type = PM_PACK_STRING_NULL_TERMINATED;
249
- *signed_type = PM_PACK_SIGNED_NA;
250
- *endian = PM_PACK_ENDIAN_NA;
251
- *size = PM_PACK_SIZE_NA;
252
- break;
253
- case 'B':
254
- *type = PM_PACK_STRING_MSB;
255
- *signed_type = PM_PACK_SIGNED_NA;
256
- *endian = PM_PACK_ENDIAN_NA;
257
- *size = PM_PACK_SIZE_NA;
258
- break;
259
- case 'b':
260
- *type = PM_PACK_STRING_LSB;
261
- *signed_type = PM_PACK_SIGNED_NA;
262
- *endian = PM_PACK_ENDIAN_NA;
263
- *size = PM_PACK_SIZE_NA;
264
- break;
265
- case 'H':
266
- *type = PM_PACK_STRING_HEX_HIGH;
267
- *signed_type = PM_PACK_SIGNED_NA;
268
- *endian = PM_PACK_ENDIAN_NA;
269
- *size = PM_PACK_SIZE_NA;
270
- break;
271
- case 'h':
272
- *type = PM_PACK_STRING_HEX_LOW;
273
- *signed_type = PM_PACK_SIGNED_NA;
274
- *endian = PM_PACK_ENDIAN_NA;
275
- *size = PM_PACK_SIZE_NA;
276
- break;
277
- case 'u':
278
- *type = PM_PACK_STRING_UU;
279
- *signed_type = PM_PACK_SIGNED_NA;
280
- *endian = PM_PACK_ENDIAN_NA;
281
- *size = PM_PACK_SIZE_NA;
282
- break;
283
- case 'M':
284
- *type = PM_PACK_STRING_MIME;
285
- *signed_type = PM_PACK_SIGNED_NA;
286
- *endian = PM_PACK_ENDIAN_NA;
287
- *size = PM_PACK_SIZE_NA;
288
- break;
289
- case 'm':
290
- *type = PM_PACK_STRING_BASE64;
291
- *signed_type = PM_PACK_SIGNED_NA;
292
- *endian = PM_PACK_ENDIAN_NA;
293
- *size = PM_PACK_SIZE_NA;
294
- break;
295
- case 'P':
296
- *type = PM_PACK_STRING_FIXED;
297
- *signed_type = PM_PACK_SIGNED_NA;
298
- *endian = PM_PACK_ENDIAN_NA;
299
- *size = PM_PACK_SIZE_NA;
300
- break;
301
- case 'p':
302
- *type = PM_PACK_STRING_POINTER;
303
- *signed_type = PM_PACK_SIGNED_NA;
304
- *endian = PM_PACK_ENDIAN_NA;
305
- *size = PM_PACK_SIZE_NA;
306
- break;
307
- case '@':
308
- *type = PM_PACK_MOVE;
309
- *signed_type = PM_PACK_SIGNED_NA;
310
- *endian = PM_PACK_ENDIAN_NA;
311
- *size = PM_PACK_SIZE_NA;
312
- break;
313
- case 'X':
314
- *type = PM_PACK_BACK;
315
- *signed_type = PM_PACK_SIGNED_NA;
316
- *endian = PM_PACK_ENDIAN_NA;
317
- *size = PM_PACK_SIZE_NA;
318
- break;
319
- case 'x':
320
- *type = PM_PACK_NULL;
321
- *signed_type = PM_PACK_SIGNED_NA;
322
- *endian = PM_PACK_ENDIAN_NA;
323
- *size = PM_PACK_SIZE_NA;
324
- break;
325
- case '%':
326
- return PM_PACK_ERROR_UNSUPPORTED_DIRECTIVE;
327
- default:
328
- return PM_PACK_ERROR_UNKNOWN_DIRECTIVE;
329
- }
330
-
331
- bool explicit_endian = false;
332
-
333
- while (*format < format_end) {
334
- switch (**format) {
335
- case '_':
336
- case '!':
337
- (*format)++;
338
- if (*type != PM_PACK_INTEGER || !length_changed_allowed) {
339
- return PM_PACK_ERROR_BANG_NOT_ALLOWED;
340
- }
341
- switch (*size) {
342
- case PM_PACK_SIZE_SHORT:
343
- case PM_PACK_SIZE_INT:
344
- case PM_PACK_SIZE_LONG:
345
- case PM_PACK_SIZE_LONG_LONG:
346
- break;
347
- case PM_PACK_SIZE_16:
348
- *size = PM_PACK_SIZE_SHORT;
349
- break;
350
- case PM_PACK_SIZE_32:
351
- *size = PM_PACK_SIZE_LONG;
352
- break;
353
- case PM_PACK_SIZE_64:
354
- *size = PM_PACK_SIZE_LONG_LONG;
355
- break;
356
- case PM_PACK_SIZE_P:
357
- break;
358
- default:
359
- return PM_PACK_ERROR_BANG_NOT_ALLOWED;
360
- }
361
- break;
362
- case '<':
363
- (*format)++;
364
- if (explicit_endian) {
365
- return PM_PACK_ERROR_DOUBLE_ENDIAN;
366
- }
367
- *endian = PM_PACK_LITTLE_ENDIAN;
368
- explicit_endian = true;
369
- break;
370
- case '>':
371
- (*format)++;
372
- if (explicit_endian) {
373
- return PM_PACK_ERROR_DOUBLE_ENDIAN;
374
- }
375
- *endian = PM_PACK_BIG_ENDIAN;
376
- explicit_endian = true;
377
- break;
378
- default:
379
- goto exit_modifier_loop;
380
- }
381
- }
382
-
383
- exit_modifier_loop:
384
-
385
- if (variant == PM_PACK_VARIANT_UNPACK && *type == PM_PACK_MOVE) {
386
- *length = 0;
387
- }
388
-
389
- if (*format < format_end) {
390
- if (**format == '*') {
391
- switch (*type) {
392
- case PM_PACK_NULL:
393
- case PM_PACK_BACK:
394
- switch (variant) {
395
- case PM_PACK_VARIANT_PACK:
396
- *length_type = PM_PACK_LENGTH_FIXED;
397
- break;
398
- case PM_PACK_VARIANT_UNPACK:
399
- *length_type = PM_PACK_LENGTH_MAX;
400
- break;
401
- }
402
- *length = 0;
403
- break;
404
-
405
- case PM_PACK_MOVE:
406
- switch (variant) {
407
- case PM_PACK_VARIANT_PACK:
408
- *length_type = PM_PACK_LENGTH_FIXED;
409
- break;
410
- case PM_PACK_VARIANT_UNPACK:
411
- *length_type = PM_PACK_LENGTH_RELATIVE;
412
- break;
413
- }
414
- *length = 0;
415
- break;
416
-
417
- case PM_PACK_STRING_UU:
418
- *length_type = PM_PACK_LENGTH_FIXED;
419
- *length = 0;
420
- break;
421
-
422
- case PM_PACK_STRING_FIXED:
423
- switch (variant) {
424
- case PM_PACK_VARIANT_PACK:
425
- *length_type = PM_PACK_LENGTH_FIXED;
426
- *length = 1;
427
- break;
428
- case PM_PACK_VARIANT_UNPACK:
429
- *length_type = PM_PACK_LENGTH_MAX;
430
- *length = 0;
431
- break;
432
- }
433
- break;
434
-
435
- case PM_PACK_STRING_MIME:
436
- case PM_PACK_STRING_BASE64:
437
- *length_type = PM_PACK_LENGTH_FIXED;
438
- *length = 1;
439
- break;
440
-
441
- default:
442
- *length_type = PM_PACK_LENGTH_MAX;
443
- *length = 0;
444
- break;
445
- }
446
-
447
- (*format)++;
448
- } else if (**format >= '0' && **format <= '9') {
449
- errno = 0;
450
- *length_type = PM_PACK_LENGTH_FIXED;
451
- #if UINTMAX_MAX < UINT64_MAX
452
- #error "prism's design assumes uintmax_t is at least as large as uint64_t"
453
- #endif
454
- uintmax_t length_max = strtoumaxc(format);
455
- if (errno || length_max > UINT64_MAX) {
456
- return PM_PACK_ERROR_LENGTH_TOO_BIG;
457
- }
458
- *length = (uint64_t) length_max;
459
- }
460
- }
461
-
462
- switch (*type) {
463
- case PM_PACK_UTF8:
464
- /* if encoding is US-ASCII, upgrade to UTF-8 */
465
- if (*encoding == PM_PACK_ENCODING_US_ASCII) {
466
- *encoding = PM_PACK_ENCODING_UTF_8;
467
- }
468
- break;
469
- case PM_PACK_STRING_MIME:
470
- case PM_PACK_STRING_BASE64:
471
- case PM_PACK_STRING_UU:
472
- /* keep US-ASCII (do nothing) */
473
- break;
474
- default:
475
- /* fall back to BINARY */
476
- *encoding = PM_PACK_ENCODING_ASCII_8BIT;
477
- break;
478
- }
479
-
480
- return PM_PACK_OK;
481
- }
482
-
483
- PRISM_EXPORTED_FUNCTION size_t
484
- pm_size_to_native(pm_pack_size size) {
485
- switch (size) {
486
- case PM_PACK_SIZE_SHORT:
487
- return sizeof(short);
488
- case PM_PACK_SIZE_INT:
489
- return sizeof(int);
490
- case PM_PACK_SIZE_LONG:
491
- return sizeof(long);
492
- case PM_PACK_SIZE_LONG_LONG:
493
- return sizeof(long long);
494
- case PM_PACK_SIZE_8:
495
- return 1;
496
- case PM_PACK_SIZE_16:
497
- return 2;
498
- case PM_PACK_SIZE_32:
499
- return 4;
500
- case PM_PACK_SIZE_64:
501
- return 8;
502
- case PM_PACK_SIZE_P:
503
- return sizeof(void *);
504
- default:
505
- return 0;
506
- }
507
- }
508
-
509
- #endif