herb 0.11.1 → 0.11.2

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 (247) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +4 -2
  3. data/config.yml +6 -0
  4. data/ext/herb/extconf.rb +8 -31
  5. data/ext/herb/nodes.c +75 -75
  6. data/ext/herb/parser_options_helpers.c +26 -0
  7. data/lib/herb/analysis/partial_index.rb +1 -1
  8. data/lib/herb/analysis/partial_resolution.rb +27 -0
  9. data/lib/herb/ast/helpers.rb +1 -1
  10. data/lib/herb/configuration.rb +11 -1
  11. data/lib/herb/dev/classifier.rb +1 -1
  12. data/lib/herb/engine/compiler.rb +5 -8
  13. data/lib/herb/engine/slots/dynamics_compiler.rb +53 -14
  14. data/lib/herb/engine/slots/subtree_compiler.rb +1 -1
  15. data/lib/herb/engine/slots/visitor.rb +32 -4
  16. data/lib/herb/engine/visitors/instrumentation_visitor.rb +18 -6
  17. data/lib/herb/parser_options.rb +6 -3
  18. data/lib/herb/project.rb +19 -8
  19. data/lib/herb/version.rb +1 -1
  20. data/lib/herb.rb +1 -1
  21. data/sig/herb/analysis/partial_resolution.rbs +8 -0
  22. data/sig/herb/configuration.rbs +3 -0
  23. data/sig/herb/engine/slots/dynamics_compiler.rbs +24 -7
  24. data/sig/herb/engine/slots/visitor.rbs +14 -0
  25. data/sig/herb/engine/visitors/instrumentation_visitor.rbs +5 -1
  26. data/sig/herb/parser_options.rbs +6 -4
  27. data/sig/herb.rbs +2 -2
  28. data/src/analyze/action_view/attribute_extraction_helpers.c +40 -21
  29. data/src/analyze/action_view/generated_handlers.c +36 -36
  30. data/src/analyze/action_view/image_tag.c +7 -3
  31. data/src/analyze/action_view/javascript_include_tag.c +6 -3
  32. data/src/analyze/action_view/link_to.c +23 -23
  33. data/src/analyze/action_view/registry.c +7 -3
  34. data/src/analyze/action_view/tag_helper_node_builders.c +6 -13
  35. data/src/analyze/action_view/tag_helpers.c +139 -90
  36. data/src/analyze/action_view/turbo_frame_tag.c +5 -4
  37. data/src/analyze/analyze.c +35 -19
  38. data/src/analyze/analyze_helpers.c +161 -188
  39. data/src/analyze/analyzed_ruby.c +8 -7
  40. data/src/analyze/control_type.c +29 -22
  41. data/src/analyze/herb_directives.c +16 -20
  42. data/src/analyze/iteration_nodes.c +69 -24
  43. data/src/analyze/parse_errors.c +32 -22
  44. data/src/analyze/postfix_conditionals.c +23 -13
  45. data/src/analyze/prism_annotate.c +29 -28
  46. data/src/analyze/render_nodes.c +51 -41
  47. data/src/analyze/strict_locals.c +14 -15
  48. data/src/analyze/ternary_conditionals.c +14 -10
  49. data/src/herb.c +10 -8
  50. data/src/include/analyze/action_view/tag_helper_handler.h +1 -1
  51. data/src/include/analyze/action_view/tag_helper_node_builders.h +1 -0
  52. data/src/include/analyze/action_view/tag_helpers.h +1 -1
  53. data/src/include/analyze/analyze.h +3 -2
  54. data/src/include/analyze/analyzed_ruby.h +4 -2
  55. data/src/include/analyze/helpers.h +6 -6
  56. data/src/include/herb.h +3 -2
  57. data/src/include/parser/parser_options.h +5 -0
  58. data/src/include/prism/prism_context.h +12 -12
  59. data/src/include/prism/prism_helpers.h +30 -0
  60. data/src/include/prism_version.h +11 -0
  61. data/src/include/version.h +1 -1
  62. data/src/parser/parser_helpers.c +1 -2
  63. data/src/parser.c +6 -7
  64. data/src/parser_options_defaults.c +1 -0
  65. data/src/prism/prism_helpers.c +84 -50
  66. data/src/prism/ruby_parser.c +20 -20
  67. data/templates/ext/herb/nodes.c.erb +5 -5
  68. data/templates/ext/herb/parser_options_helpers.c.erb +33 -0
  69. data/templates/java/nodes.c.erb +6 -6
  70. data/templates/java/parser_options_helpers.c.erb +41 -2
  71. data/templates/java/parser_options_helpers.h.erb +2 -1
  72. data/templates/javascript/packages/node/extension/nodes.cpp.erb +5 -5
  73. data/templates/javascript/packages/node/extension/parser_options_helpers.cpp.erb +34 -2
  74. data/templates/javascript/packages/node/extension/parser_options_helpers.h.erb +1 -1
  75. data/templates/lib/herb/parser_options.rb.erb +1 -1
  76. data/templates/rust/src/prism/generated_deserialize.rs.erb +90 -44
  77. data/templates/rust/src/prism/generated_prettyprint.rs.erb +18 -27
  78. data/templates/src/analyze/action_view/generated_handlers.c.erb +23 -22
  79. data/templates/src/include/parser/parser_options.h.erb +10 -0
  80. data/templates/src/include/prism_version.h.erb +17 -0
  81. data/templates/src/parser_options_defaults.c.erb +1 -1
  82. data/templates/template.rb +17 -2
  83. data/templates/wasm/nodes.cpp.erb +5 -5
  84. data/templates/wasm/parser_options_helpers.cpp.erb +24 -0
  85. data/vendor/prism/Rakefile +76 -7
  86. data/vendor/prism/config.yml +174 -161
  87. data/vendor/prism/include/prism/arena.h +45 -0
  88. data/vendor/prism/include/prism/arena.hpp +42 -0
  89. data/vendor/prism/include/prism/ast.h +2738 -611
  90. data/vendor/prism/include/prism/ast.hpp +641 -0
  91. data/vendor/prism/include/prism/buffer.h +60 -0
  92. data/vendor/prism/include/prism/buffer.hpp +55 -0
  93. data/vendor/prism/include/prism/comments.h +72 -0
  94. data/vendor/prism/include/prism/compiler/accel.h +26 -0
  95. data/vendor/prism/include/prism/compiler/align.h +36 -0
  96. data/vendor/prism/include/prism/compiler/assume.h +25 -0
  97. data/vendor/prism/include/prism/compiler/branch.h +26 -0
  98. data/vendor/prism/include/prism/compiler/bswap.h +46 -0
  99. data/vendor/prism/include/prism/compiler/cplusplus.hpp +16 -0
  100. data/vendor/prism/include/prism/compiler/endianness.h +34 -0
  101. data/vendor/prism/include/prism/compiler/exceptions.hpp +17 -0
  102. data/vendor/prism/include/prism/compiler/exported.h +24 -0
  103. data/vendor/prism/include/prism/compiler/fallthrough.h +22 -0
  104. data/vendor/prism/include/prism/compiler/filesystem.h +32 -0
  105. data/vendor/prism/include/prism/compiler/flex_array.h +19 -0
  106. data/vendor/prism/include/prism/compiler/force_inline.h +21 -0
  107. data/vendor/prism/include/prism/compiler/format.h +27 -0
  108. data/vendor/prism/include/prism/compiler/inline.h +17 -0
  109. data/vendor/prism/include/prism/compiler/lifetimebound.hpp +25 -0
  110. data/vendor/prism/include/prism/compiler/nodiscard.h +22 -0
  111. data/vendor/prism/include/prism/compiler/nonnull.h +18 -0
  112. data/vendor/prism/include/prism/compiler/unused.h +18 -0
  113. data/vendor/prism/include/prism/constant_pool.h +106 -0
  114. data/vendor/prism/include/prism/diagnostic.h +55 -402
  115. data/vendor/prism/include/prism/errors_format.h +61 -0
  116. data/vendor/prism/include/prism/excludes.h +29 -0
  117. data/vendor/prism/include/prism/integer.h +41 -0
  118. data/vendor/prism/include/prism/internal/allocator.h +68 -0
  119. data/vendor/prism/include/prism/internal/allocator_debug.h +88 -0
  120. data/vendor/prism/include/prism/internal/arena.h +108 -0
  121. data/vendor/prism/include/prism/internal/bit.h +42 -0
  122. data/vendor/prism/include/prism/internal/buffer.h +94 -0
  123. data/vendor/prism/include/prism/internal/char.h +145 -0
  124. data/vendor/prism/include/prism/internal/comments.h +54 -0
  125. data/vendor/prism/include/prism/internal/constant_pool.h +152 -0
  126. data/vendor/prism/include/prism/internal/diagnostic.h +389 -0
  127. data/vendor/prism/include/prism/{encoding.h → internal/encoding.h} +27 -68
  128. data/vendor/prism/include/prism/internal/integer.h +68 -0
  129. data/vendor/prism/include/prism/internal/isinf.h +16 -0
  130. data/vendor/prism/include/prism/internal/line_offset_list.h +34 -0
  131. data/vendor/prism/include/prism/{util/pm_list.h → internal/list.h} +11 -52
  132. data/vendor/prism/include/prism/internal/magic_comments.h +23 -0
  133. data/vendor/prism/include/prism/internal/memchr.h +15 -0
  134. data/vendor/prism/include/prism/internal/node.h +42 -0
  135. data/vendor/prism/include/prism/internal/options.h +232 -0
  136. data/vendor/prism/include/prism/internal/parser.h +1015 -0
  137. data/vendor/prism/include/prism/internal/regexp.h +26 -0
  138. data/vendor/prism/include/prism/internal/serialize.h +39 -0
  139. data/vendor/prism/include/prism/internal/source.h +72 -0
  140. data/vendor/prism/include/prism/internal/static_literals.h +60 -0
  141. data/vendor/prism/include/prism/internal/stringy.h +30 -0
  142. data/vendor/prism/include/prism/{util/pm_strncasecmp.h → internal/strncasecmp.h} +3 -17
  143. data/vendor/prism/include/prism/{util/pm_strpbrk.h → internal/strpbrk.h} +7 -20
  144. data/vendor/prism/include/prism/internal/tokens.h +11 -0
  145. data/vendor/prism/include/prism/internal/xxh3.h +16 -0
  146. data/vendor/prism/include/prism/json.h +40 -0
  147. data/vendor/prism/include/prism/line_offset_list.h +69 -0
  148. data/vendor/prism/include/prism/magic_comments.h +53 -0
  149. data/vendor/prism/include/prism/node.h +59 -49
  150. data/vendor/prism/include/prism/node.hpp +272 -0
  151. data/vendor/prism/include/prism/node_type.hpp +38 -0
  152. data/vendor/prism/include/prism/options.h +154 -279
  153. data/vendor/prism/include/prism/options.hpp +43 -0
  154. data/vendor/prism/include/prism/parser.h +367 -870
  155. data/vendor/prism/include/prism/parser.hpp +274 -0
  156. data/vendor/prism/include/prism/prettyprint.h +14 -9
  157. data/vendor/prism/include/prism/serialize.h +123 -0
  158. data/vendor/prism/include/prism/source.h +163 -0
  159. data/vendor/prism/include/prism/stream.h +36 -0
  160. data/vendor/prism/include/prism/string_query.h +82 -0
  161. data/vendor/prism/include/prism/stringy.h +61 -0
  162. data/vendor/prism/include/prism/stringy.hpp +31 -0
  163. data/vendor/prism/include/prism/version.h +20 -3
  164. data/vendor/prism/include/prism.h +35 -320
  165. data/vendor/prism/include/prism.hpp +24 -0
  166. data/vendor/prism/src/arena.c +122 -0
  167. data/vendor/prism/src/{util/pm_buffer.c → buffer.c} +53 -21
  168. data/vendor/prism/src/{util/pm_char.c → char.c} +28 -57
  169. data/vendor/prism/src/comments.c +455 -0
  170. data/vendor/prism/src/constant_pool.c +406 -0
  171. data/vendor/prism/src/diagnostic.c +120 -68
  172. data/vendor/prism/src/encoding.c +8 -3
  173. data/vendor/prism/src/errors_format.c +519 -0
  174. data/vendor/prism/src/{util/pm_integer.c → integer.c} +38 -22
  175. data/vendor/prism/src/json.c +5733 -0
  176. data/vendor/prism/src/line_offset_list.c +100 -0
  177. data/vendor/prism/src/list.c +24 -0
  178. data/vendor/prism/src/{util/pm_memchr.c → memchr.c} +8 -6
  179. data/vendor/prism/src/node.c +3465 -7787
  180. data/vendor/prism/src/options.c +161 -54
  181. data/vendor/prism/src/parser.c +371 -0
  182. data/vendor/prism/src/prettyprint.c +421 -354
  183. data/vendor/prism/src/prism.c +8522 -7280
  184. data/vendor/prism/src/regexp.c +960 -45
  185. data/vendor/prism/src/serialize.c +2434 -2048
  186. data/vendor/prism/src/source.c +524 -0
  187. data/vendor/prism/src/static_literals.c +303 -360
  188. data/vendor/prism/src/string_query.c +180 -0
  189. data/vendor/prism/src/stringy.c +61 -0
  190. data/vendor/prism/src/{util/pm_strncasecmp.c → strncasecmp.c} +5 -4
  191. data/vendor/prism/src/strpbrk.c +447 -0
  192. data/vendor/prism/src/{token_type.c → tokens.c} +39 -18
  193. data/vendor/prism/src/xxh3.c +292 -0
  194. data/vendor/prism/templates/ext/prism/api_node.c.erb +58 -44
  195. data/vendor/prism/templates/include/prism/ast.h.erb +67 -17
  196. data/vendor/prism/templates/include/prism/ast.hpp.erb +31 -0
  197. data/vendor/prism/templates/include/prism/internal/diagnostic.h.erb +60 -0
  198. data/vendor/prism/templates/java/{org → api/src/main/java-templates/org/ruby_lang}/prism/AbstractNodeVisitor.java.erb +1 -1
  199. data/vendor/prism/templates/java/{org → api/src/main/java-templates/org/ruby_lang}/prism/Loader.java.erb +232 -133
  200. data/vendor/prism/templates/java/{org → api/src/main/java-templates/org/ruby_lang}/prism/Nodes.java.erb +62 -23
  201. data/vendor/prism/templates/javascript/src/deserialize.js.erb +153 -146
  202. data/vendor/prism/templates/javascript/src/nodes.js.erb +4 -9
  203. data/vendor/prism/templates/lib/prism/compiler.rb.erb +14 -5
  204. data/vendor/prism/templates/lib/prism/dispatcher.rb.erb +20 -12
  205. data/vendor/prism/templates/lib/prism/dot_visitor.rb.erb +37 -11
  206. data/vendor/prism/templates/lib/prism/dsl.rb.erb +43 -4
  207. data/vendor/prism/templates/lib/prism/inspect_visitor.rb.erb +26 -10
  208. data/vendor/prism/templates/lib/prism/mutation_compiler.rb.erb +5 -2
  209. data/vendor/prism/templates/lib/prism/node.rb.erb +283 -105
  210. data/vendor/prism/templates/lib/prism/reflection.rb.erb +11 -2
  211. data/vendor/prism/templates/lib/prism/serialize.rb.erb +291 -134
  212. data/vendor/prism/templates/lib/prism/visitor.rb.erb +18 -0
  213. data/vendor/prism/templates/src/diagnostic.c.erb +114 -63
  214. data/vendor/prism/templates/src/json.c.erb +130 -0
  215. data/vendor/prism/templates/src/node.c.erb +79 -236
  216. data/vendor/prism/templates/src/prettyprint.c.erb +24 -13
  217. data/vendor/prism/templates/src/serialize.c.erb +369 -183
  218. data/vendor/prism/templates/src/{token_type.c.erb → tokens.c.erb} +22 -11
  219. data/vendor/prism/templates/template.rb +193 -91
  220. metadata +100 -42
  221. data/vendor/prism/include/prism/defines.h +0 -260
  222. data/vendor/prism/include/prism/pack.h +0 -163
  223. data/vendor/prism/include/prism/regexp.h +0 -43
  224. data/vendor/prism/include/prism/static_literals.h +0 -121
  225. data/vendor/prism/include/prism/util/pm_buffer.h +0 -236
  226. data/vendor/prism/include/prism/util/pm_char.h +0 -204
  227. data/vendor/prism/include/prism/util/pm_constant_pool.h +0 -218
  228. data/vendor/prism/include/prism/util/pm_integer.h +0 -130
  229. data/vendor/prism/include/prism/util/pm_memchr.h +0 -29
  230. data/vendor/prism/include/prism/util/pm_newline_list.h +0 -113
  231. data/vendor/prism/include/prism/util/pm_string.h +0 -200
  232. data/vendor/prism/src/pack.c +0 -509
  233. data/vendor/prism/src/util/pm_constant_pool.c +0 -342
  234. data/vendor/prism/src/util/pm_list.c +0 -49
  235. data/vendor/prism/src/util/pm_newline_list.c +0 -125
  236. data/vendor/prism/src/util/pm_string.c +0 -381
  237. data/vendor/prism/src/util/pm_strpbrk.c +0 -206
  238. data/vendor/prism/templates/include/prism/diagnostic.h.erb +0 -130
  239. data/vendor/prism/templates/rbi/prism/dsl.rbi.erb +0 -68
  240. data/vendor/prism/templates/rbi/prism/node.rbi.erb +0 -167
  241. data/vendor/prism/templates/rbi/prism/visitor.rbi.erb +0 -18
  242. data/vendor/prism/templates/sig/prism/_private/dot_visitor.rbs.erb +0 -45
  243. data/vendor/prism/templates/sig/prism/dsl.rbs.erb +0 -31
  244. data/vendor/prism/templates/sig/prism/mutation_compiler.rbs.erb +0 -7
  245. data/vendor/prism/templates/sig/prism/node.rbs.erb +0 -136
  246. data/vendor/prism/templates/sig/prism/visitor.rbs.erb +0 -17
  247. data/vendor/prism/templates/sig/prism.rbs.erb +0 -92
@@ -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