qr_reader-native 0.0.1

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 (95) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE-mruby.txt +22 -0
  3. data/LICENSE-spinel.txt +19 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.md +61 -0
  6. data/ext/qr_reader_native/SPINEL_VERSION +1 -0
  7. data/ext/qr_reader_native/extconf.rb +8 -0
  8. data/ext/qr_reader_native/mruby/error.h +13 -0
  9. data/ext/qr_reader_native/mruby/internal.h +145 -0
  10. data/ext/qr_reader_native/mruby/string.h +22 -0
  11. data/ext/qr_reader_native/mruby.h +93 -0
  12. data/ext/qr_reader_native/mruby_shim.h +118 -0
  13. data/ext/qr_reader_native/qr_reader_native.c +13513 -0
  14. data/ext/qr_reader_native/qr_reader_native.h +29 -0
  15. data/ext/qr_reader_native/qr_reader_native_ext.c +598 -0
  16. data/ext/qr_reader_native/re_cased.h +71 -0
  17. data/ext/qr_reader_native/re_compile.c +5784 -0
  18. data/ext/qr_reader_native/re_ctype.h +3540 -0
  19. data/ext/qr_reader_native/re_exec.c +2190 -0
  20. data/ext/qr_reader_native/re_internal.h +671 -0
  21. data/ext/qr_reader_native/re_prop.h +4629 -0
  22. data/ext/qr_reader_native/re_spinel.c +363 -0
  23. data/ext/qr_reader_native/re_spinel.h +22 -0
  24. data/ext/qr_reader_native/re_spinel_utf8.inc +97 -0
  25. data/ext/qr_reader_native/re_utf8.c +156 -0
  26. data/ext/qr_reader_native/sp_alloc.c +1447 -0
  27. data/ext/qr_reader_native/sp_alloc.h +1196 -0
  28. data/ext/qr_reader_native/sp_argf.h +33 -0
  29. data/ext/qr_reader_native/sp_array.c +1052 -0
  30. data/ext/qr_reader_native/sp_array.h +456 -0
  31. data/ext/qr_reader_native/sp_bigint.c +5826 -0
  32. data/ext/qr_reader_native/sp_bigint.h +117 -0
  33. data/ext/qr_reader_native/sp_cold.c +5259 -0
  34. data/ext/qr_reader_native/sp_compat.h +402 -0
  35. data/ext/qr_reader_native/sp_core.c +818 -0
  36. data/ext/qr_reader_native/sp_core.h +56 -0
  37. data/ext/qr_reader_native/sp_crypto.c +877 -0
  38. data/ext/qr_reader_native/sp_crypto.h +169 -0
  39. data/ext/qr_reader_native/sp_dtoa.c +1533 -0
  40. data/ext/qr_reader_native/sp_dtoa.h +29 -0
  41. data/ext/qr_reader_native/sp_encoding_names.h +172 -0
  42. data/ext/qr_reader_native/sp_enum.h +86 -0
  43. data/ext/qr_reader_native/sp_exc.c +1185 -0
  44. data/ext/qr_reader_native/sp_exc.h +186 -0
  45. data/ext/qr_reader_native/sp_exc_ctx.h +56 -0
  46. data/ext/qr_reader_native/sp_fiber.c +889 -0
  47. data/ext/qr_reader_native/sp_fiber.h +162 -0
  48. data/ext/qr_reader_native/sp_fiber_ctx.h +84 -0
  49. data/ext/qr_reader_native/sp_format.c +695 -0
  50. data/ext/qr_reader_native/sp_format.h +83 -0
  51. data/ext/qr_reader_native/sp_gc.c +1793 -0
  52. data/ext/qr_reader_native/sp_gc.h +762 -0
  53. data/ext/qr_reader_native/sp_hash.c +131 -0
  54. data/ext/qr_reader_native/sp_hash.h +131 -0
  55. data/ext/qr_reader_native/sp_inspect.c +215 -0
  56. data/ext/qr_reader_native/sp_inspect.h +128 -0
  57. data/ext/qr_reader_native/sp_io.c +1676 -0
  58. data/ext/qr_reader_native/sp_io.h +272 -0
  59. data/ext/qr_reader_native/sp_iobuffer.c +1014 -0
  60. data/ext/qr_reader_native/sp_iobuffer.h +167 -0
  61. data/ext/qr_reader_native/sp_marshal.c +487 -0
  62. data/ext/qr_reader_native/sp_marshal.h +60 -0
  63. data/ext/qr_reader_native/sp_net.c +1029 -0
  64. data/ext/qr_reader_native/sp_net.h +205 -0
  65. data/ext/qr_reader_native/sp_pack.c +1254 -0
  66. data/ext/qr_reader_native/sp_poly_cold.c +1220 -0
  67. data/ext/qr_reader_native/sp_proc.c +410 -0
  68. data/ext/qr_reader_native/sp_proc.h +327 -0
  69. data/ext/qr_reader_native/sp_process.c +547 -0
  70. data/ext/qr_reader_native/sp_process_status.c +211 -0
  71. data/ext/qr_reader_native/sp_process_status.h +66 -0
  72. data/ext/qr_reader_native/sp_random.c +287 -0
  73. data/ext/qr_reader_native/sp_random.h +52 -0
  74. data/ext/qr_reader_native/sp_range.h +144 -0
  75. data/ext/qr_reader_native/sp_re.c +1379 -0
  76. data/ext/qr_reader_native/sp_re.h +186 -0
  77. data/ext/qr_reader_native/sp_re_names.h +59 -0
  78. data/ext/qr_reader_native/sp_sched.c +4044 -0
  79. data/ext/qr_reader_native/sp_sched.h +295 -0
  80. data/ext/qr_reader_native/sp_slab.c +1507 -0
  81. data/ext/qr_reader_native/sp_str.c +1462 -0
  82. data/ext/qr_reader_native/sp_str.h +306 -0
  83. data/ext/qr_reader_native/sp_str_crypt.c +23 -0
  84. data/ext/qr_reader_native/sp_string.c +92 -0
  85. data/ext/qr_reader_native/sp_string.h +253 -0
  86. data/ext/qr_reader_native/sp_system.c +78 -0
  87. data/ext/qr_reader_native/sp_system.h +18 -0
  88. data/ext/qr_reader_native/sp_time.c +860 -0
  89. data/ext/qr_reader_native/sp_time.h +100 -0
  90. data/ext/qr_reader_native/sp_types.h +292 -0
  91. data/ext/qr_reader_native/spinel_rt.h +19017 -0
  92. data/ext/qr_reader_native/unicase.c +399 -0
  93. data/ext/qr_reader_native/unicase.h +901 -0
  94. data/lib/qr_reader/native.rb +6 -0
  95. metadata +153 -0
@@ -0,0 +1,186 @@
1
+ #ifndef SP_RE_H
2
+ #define SP_RE_H
3
+ /* sp_re.h -- regexp wrappers + MatchData, compiled once in lib/sp_re.c.
4
+ *
5
+ * The regexp ENGINE (re_compile / re_exec / re_free) is the separate
6
+ * build/regexp/*.o library; this layer is spinel's Ruby-facing surface
7
+ * (Regexp#match, gsub/sub/scan/split, the $~/$1.. match registers, and
8
+ * MatchData). The match-register globals are per-process singletons: the
9
+ * generated TU reads them directly for $&/$1.. (codegen_expr.c) and marks
10
+ * them in its whole-program GC root hook, so they are extern here and
11
+ * defined once in lib/sp_re.c.
12
+ *
13
+ * Kept in spinel_rt.h (TU-coupled): the whole-program GC root hook
14
+ * sp_re_mark_globals, the startup-error handler (longjmps through a
15
+ * TU-local jmp_buf), and the hash-replacement gsub/sub variants (await
16
+ * the typed-hash batch). */
17
+ #include "sp_array.h" /* sp_StrArray / sp_PolyArray / sp_RbVal + heap */
18
+ #include "sp_str.h" /* string helpers used by the wrappers */
19
+
20
+ /* The engine's internal flag bits. re_internal.h is the port island's own
21
+ header and is not included here, so the three this side reads are named
22
+ again; sp_re_raw_flags() answers a pattern's set. */
23
+ #define SP_RE_F_IGNORECASE 1
24
+ #define SP_RE_F_DOTALL 4 /* Ruby's /m: dot matches newline */
25
+ #define SP_RE_F_EXTENDED 8
26
+
27
+ /* ---- regexp engine ABI (implemented in build/regexp/*.o) ---- */
28
+ typedef struct mrb_regexp_pattern mrb_regexp_pattern;
29
+ mrb_regexp_pattern* re_compile(const char *pattern, int64_t len, uint32_t flags);
30
+ void re_free(mrb_regexp_pattern *pat);
31
+ int re_exec(const mrb_regexp_pattern *pat, const char *str, int64_t len, int64_t start, int *captures, int captures_size, int binary);
32
+ /* named-capture introspection (lib/regexp/re_compile.c) */
33
+ int re_num_named(const mrb_regexp_pattern *pat);
34
+ const char *re_named_name(const mrb_regexp_pattern *pat, int i, int *group_out);
35
+ int re_named_group(const mrb_regexp_pattern *pat, const char *name);
36
+
37
+ /* `caps` holds ncap*2 positions and lives in the SAME block as the struct, so
38
+ a MatchData costs what its match needs rather than what the widest one
39
+ would: it was a fixed caps[64], which is 256 bytes whether the pattern has
40
+ thirty groups or none, and every MatchData paid it. A 1-group match is 40
41
+ bytes now against 280. Nothing takes sizeof() of this outside sp_md_alloc(),
42
+ which is what a flexible array member costs. */
43
+ typedef struct { const char *source; int ncap; const mrb_regexp_pattern *pat; int caps[]; } sp_MatchData;
44
+
45
+ /* ---- match-register state (read by the generated TU and marked by its GC root
46
+ hook). Per-thread in Ruby, so SP_TLS in the threaded build: each worker keeps
47
+ the registers of the green thread it runs. The generated TU is compiled with
48
+ the matching -DSP_THREADS so the storage class agrees. Plain globals
49
+ otherwise. (The GC hook marking only the current worker's registers is
50
+ generalized to all workers when N>1 lands.) ---- */
51
+ extern SP_TLS const char *sp_re_captures[10];
52
+ extern SP_TLS int sp_re_caps[64];
53
+ extern SP_TLS const char *sp_re_last_str;
54
+ extern SP_TLS const mrb_regexp_pattern *sp_re_last_pat;
55
+ extern SP_TLS const char *sp_re_match_str;
56
+ extern SP_TLS const char *sp_re_match_pre;
57
+ extern SP_TLS const char *sp_re_match_post;
58
+ /* Whether the last sub / gsub (regex or string pattern) found a match: the
59
+ bang forms answer nil when NO SUBSTITUTION was made, which is not the same
60
+ as the text being unchanged (`"cats".sub!(/s$/, "s")` matches and answers
61
+ the string). The emitter clears it before the call and reads it after. */
62
+ extern SP_TLS int sp_re_sub_matched;
63
+ const char *sp_re_pre_match(void); /* $` , built on demand */
64
+ const char *sp_re_post_match(void); /* $' , built on demand */
65
+ extern const char *sp_re_startup_err;
66
+
67
+ /* Stop-the-world support: push this worker's live match-register strings as GC
68
+ roots (for the collector to mark while the worker is parked). See sp_re.c. */
69
+ void sp_re_push_match_roots(void);
70
+
71
+ /* ---- wrappers (lib/sp_re.c) ---- */
72
+ const char *sp_re_last_paren_match(void);
73
+ void sp_re_set_captures(const char *str, int *caps, int ncaps);
74
+ extern int sp_re_track_last; /* gsub / sub / scan record `$~` (sp_re.c) */
75
+ void sp_re_clear_last_match(void);
76
+ void sp_re_set_last_match(const mrb_regexp_pattern *pat, const char *str, const int *caps, int n);
77
+ void sp_re_set_lit_match(const char *str, sp_int beg, sp_int end);
78
+ sp_int sp_re_match(mrb_regexp_pattern *pat, const char *str);
79
+ sp_int sp_re_match_at(mrb_regexp_pattern *pat, const char *str, sp_int pos);
80
+ sp_int sp_re_match_next(mrb_regexp_pattern *pat, const char *str, sp_int pos);
81
+ sp_int sp_re_rindex(mrb_regexp_pattern *pat, const char *str);
82
+ sp_StrArray *sp_re_rpartition(mrb_regexp_pattern *pat, const char *str);
83
+ sp_bool sp_re_match_p(mrb_regexp_pattern *pat, const char *str);
84
+ sp_bool sp_re_match_p_at(mrb_regexp_pattern *pat, const char *str, sp_int pos);
85
+ sp_bool sp_re_case_eq(mrb_regexp_pattern *pat, sp_RbVal v);
86
+ /* poly-operand match forms: either side may carry the pattern (#3961) */
87
+ mrb_regexp_pattern *sp_poly_as_pattern(sp_RbVal v);
88
+ sp_bool sp_poly_match_p(sp_RbVal a, sp_RbVal b);
89
+ sp_bool sp_poly_match_p_at(sp_RbVal a, sp_RbVal b, sp_int pos);
90
+ sp_MatchData *sp_poly_match_data(sp_RbVal a, sp_RbVal b);
91
+ sp_int sp_poly_match_index(sp_RbVal a, sp_RbVal b);
92
+ void sp_re_expand_rep(const mrb_regexp_pattern *pat, char **out_io, size_t *olen_io, size_t *cap_io, const char *rep, size_t rlen, const char *src, int *caps, int ncaps);
93
+ const char *sp_re_gsub(mrb_regexp_pattern *pat, const char *str, const char *rep);
94
+ const char *sp_re_sub(mrb_regexp_pattern *pat, const char *str, const char *rep);
95
+ sp_StrArray *sp_re_scan(mrb_regexp_pattern *pat, const char *str);
96
+ sp_StrArray *sp_re_split(mrb_regexp_pattern *pat, const char *str);
97
+ sp_StrArray *sp_re_split_limit(mrb_regexp_pattern *pat, const char *str, sp_int limit);
98
+ sp_int sp_re_rindex_opt(mrb_regexp_pattern *pat, const char *str);
99
+ sp_RbVal sp_re_rindex_poly(mrb_regexp_pattern *pat, const char *str);
100
+ sp_RbVal sp_re_index_poly(mrb_regexp_pattern *pat, const char *str);
101
+ const char *sp_str_splice_re(mrb_regexp_pattern *pat, const char *s, const char *val);
102
+ const char *sp_str_slice_re(mrb_regexp_pattern *pat, const char *s, const char **rest_out);
103
+ const char *sp_re_alt_join(const char *a, const char *b); /* `a|b`, NUL-safe */
104
+ const char *sp_re_source(void *pat);
105
+ uint32_t sp_re_source_len(void *pat); /* its byte length (may hold a NUL) */
106
+ sp_bool sp_re_src_linear_time(const char *src); /* Regexp.linear_time? on a source string */
107
+ const char *sp_re_inspect_str(void *pat);
108
+ const char *sp_re_to_s_str(void *pat);
109
+ sp_int sp_re_options(void *pat);
110
+ sp_int sp_re_hash(void *pat);
111
+ sp_bool sp_re_eq(void *a, void *b);
112
+ sp_bool sp_re_casefold_p(void *pat);
113
+ uint32_t sp_re_raw_flags(void *pat);
114
+ uint32_t sp_re_opts_to_flags(sp_int o);
115
+ const char *sp_MatchData_inspect(sp_MatchData *m);
116
+ const char *re_group_name(const mrb_regexp_pattern *pat, int group);
117
+ sp_int sp_re_index_from_opt(mrb_regexp_pattern *pat, const char *str, sp_int start);
118
+ sp_int sp_re_byteindex_opt(mrb_regexp_pattern *pat, const char *str, sp_int start);
119
+ sp_int sp_re_byterindex_opt(mrb_regexp_pattern *pat, const char *str, sp_int start);
120
+ sp_int sp_re_rindex_from_opt(mrb_regexp_pattern *pat, const char *str, sp_int start);
121
+ sp_RbVal sp_re_match_poly(mrb_regexp_pattern *pat, const char *str);
122
+ const char *sp_re_named_capture(const mrb_regexp_pattern *pat, const char *name);
123
+ const char *sp_re_escape(const char *src);
124
+ mrb_regexp_pattern *sp_re_union_array(sp_PolyArray *a);
125
+ sp_PolyArray *sp_re_scan_poly(mrb_regexp_pattern *pat, const char *str);
126
+ sp_PolyArray *sp_re_match_data(mrb_regexp_pattern *pat, const char *str);
127
+ void sp_MatchData_scan(void *p);
128
+ sp_MatchData *sp_re_matchdata(mrb_regexp_pattern *pat, const char *str);
129
+ sp_MatchData *sp_re_last_matchdata(void); /* $~ from the TLS match registers */
130
+ /* Saved match registers of one method frame: `$~` is frame-local in Ruby, so a
131
+ method that performs a match restores its caller's on the way out (#3629).
132
+ The emitter declares one with a cleanup attribute, so every ordinary exit
133
+ path -- including an early `return` -- puts the caller's registers back. */
134
+ typedef struct {
135
+ const char *captures[10];
136
+ int caps[64];
137
+ const char *last_str, *match_str, *match_pre, *match_post;
138
+ int last_ncap;
139
+ const mrb_regexp_pattern *last_pat;
140
+ int last_lit;
141
+ int pp_span[2];
142
+ } sp_re_frame;
143
+ void sp_re_frame_push(sp_re_frame *f);
144
+ void sp_re_frame_pop(sp_re_frame *f);
145
+ sp_MatchData *sp_re_matchdata_at(mrb_regexp_pattern *pat, const char *str, sp_int cpos);
146
+ const char *sp_MatchData_aref(sp_MatchData *m, sp_int i);
147
+ const char *sp_MatchData_aref_name(sp_MatchData *m, const char *name);
148
+ sp_StrArray *sp_MatchData_names(sp_MatchData *m);
149
+ const char *sp_MatchData_string(sp_MatchData *m);
150
+ sp_StrArray *sp_Regexp_names(const mrb_regexp_pattern *pat);
151
+ /* named-group metadata (lib/regexp/re_compile.c), for the generated TU's
152
+ inline Regexp#named_captures construction */
153
+ int re_num_named(const mrb_regexp_pattern *pat);
154
+ const char *re_named_name(const mrb_regexp_pattern *pat, int i, int *group_out);
155
+ sp_int sp_MatchData_length(sp_MatchData *m);
156
+ sp_bool sp_MatchData_eq(sp_MatchData *a, sp_MatchData *b);
157
+ sp_int sp_MatchData_hash(sp_MatchData *m);
158
+ sp_PolyArray *sp_MatchData_aref_len(sp_MatchData *m, sp_int start, sp_int len);
159
+ sp_PolyArray *sp_MatchData_aref_range(sp_MatchData *m, sp_int beg, sp_int end, int excl);
160
+ sp_int sp_md_char_off(sp_MatchData *m, int byteoff);
161
+ sp_int sp_MatchData_begin(sp_MatchData *m, sp_int i);
162
+ sp_int sp_MatchData_end(sp_MatchData *m, sp_int i);
163
+ sp_IntArray *sp_MatchData_offset(sp_MatchData *m, sp_int i);
164
+ sp_int sp_MatchData_bytebegin(sp_MatchData *m, sp_int i);
165
+ sp_int sp_MatchData_byteend(sp_MatchData *m, sp_int i);
166
+ sp_IntArray *sp_MatchData_byteoffset(sp_MatchData *m, sp_int i);
167
+ sp_int sp_MatchData_begin_name(sp_MatchData *m, const char *name);
168
+ sp_int sp_MatchData_end_name(sp_MatchData *m, const char *name);
169
+ sp_IntArray *sp_MatchData_offset_name(sp_MatchData *m, const char *name);
170
+ sp_int sp_MatchData_bytebegin_name(sp_MatchData *m, const char *name);
171
+ sp_int sp_MatchData_byteend_name(sp_MatchData *m, const char *name);
172
+ sp_IntArray *sp_MatchData_byteoffset_name(sp_MatchData *m, const char *name);
173
+ const char *sp_MatchData_to_s(sp_MatchData *m);
174
+ sp_PolyArray *sp_MatchData_captures(sp_MatchData *m);
175
+ sp_PolyArray *sp_MatchData_to_a(sp_MatchData *m);
176
+ const char *sp_MatchData_pre_match(sp_MatchData *m);
177
+ const char *sp_MatchData_post_match(sp_MatchData *m);
178
+ void sp_re_default_error_handler(const char *msg);
179
+
180
+ /* ---- sp_str_re_match_p_at relocated from spinel_rt.h (0 optcarrot uses).
181
+ Lives here (not sp_str.h) because spinel_rt.h includes sp_re.h before
182
+ sp_str.h -- placing it in sp_str.h would see mrb_regexp_pattern
183
+ undeclared on that first (nested) pass. ---- */
184
+ sp_bool sp_str_re_match_p_at(mrb_regexp_pattern *pat, const char *str, sp_int cpos);
185
+
186
+ #endif /* SP_RE_H */
@@ -0,0 +1,59 @@
1
+ /*
2
+ ** shim/sp_re_names.h - link names for the mrb_ functions the engine defines
3
+ **
4
+ ** The engine calls mruby's C API. re_spinel.c implements that API with
5
+ ** the C library, and its source spells each function with mruby's name.
6
+ ** A program that links real mruby as well as the spinel runtime must not
7
+ ** see two definitions of one name.
8
+ ** The engine files define more mrb_ functions of their own. This header
9
+ ** gives each mrb_ function that the engine objects define an sp_re_ prefix.
10
+ ** The copied mruby files stay unchanged, because every engine file
11
+ ** includes shim/mruby.h, and so this header, before it uses an mrb_ name.
12
+ ** Types (mrb_int, mrb_value, mrb_state, mrb_regexp_pattern) are not link
13
+ ** symbols, so they keep their names.
14
+ */
15
+ #ifndef SP_RE_SHIM_NAMES_H
16
+ #define SP_RE_SHIM_NAMES_H
17
+
18
+ #define mrb_calloc sp_re_mrb_calloc
19
+ #define mrb_exc_get_id sp_re_mrb_exc_get_id
20
+ #define mrb_exc_new_str sp_re_mrb_exc_new_str
21
+ #define mrb_exc_raise sp_re_mrb_exc_raise
22
+ #define mrb_format sp_re_mrb_format
23
+ #define mrb_free sp_re_mrb_free
24
+ #define mrb_malloc sp_re_mrb_malloc
25
+ #define mrb_malloc_simple sp_re_mrb_malloc_simple
26
+ #define mrb_re_case_fold sp_re_mrb_re_case_fold
27
+ #define mrb_re_class_ctype_match sp_re_mrb_re_class_ctype_match
28
+ #define mrb_re_compile sp_re_mrb_re_compile
29
+ #define mrb_re_ctype sp_re_mrb_re_ctype
30
+ #define mrb_re_ctype_span sp_re_mrb_re_ctype_span
31
+ #define mrb_re_exec sp_re_mrb_re_exec
32
+ #define mrb_re_flags_cat sp_re_mrb_re_flags_cat
33
+ #define mrb_re_free sp_re_mrb_re_free
34
+ #define mrb_re_is_word_char sp_re_mrb_re_is_word_char
35
+ /* This name is a function only in the RE_NO_UNICODE_* build (the
36
+ conditions shim/mruby.h turns into MRB_USE_ASCII_CTYPE); in the default
37
+ build re_internal.h defines it as a macro, which this one would clash with. */
38
+ #if defined(MRB_USE_ASCII_CTYPE) || defined(RE_NO_UNICODE_CASE) || defined(RE_NO_UNICODE_CTYPE)
39
+ #define mrb_re_needs_case_data sp_re_mrb_re_needs_case_data
40
+ #endif
41
+ #define mrb_re_rexec sp_re_mrb_re_rexec
42
+ #define mrb_realloc sp_re_mrb_realloc
43
+ #define mrb_realloc_simple sp_re_mrb_realloc_simple
44
+ #define mrb_str_cat sp_re_mrb_str_cat
45
+ #define mrb_str_new sp_re_mrb_str_new
46
+ #define mrb_str_new_cstr sp_re_mrb_str_new_cstr
47
+ #define mrb_str_resize sp_re_mrb_str_resize
48
+ #define mrb_temp_alloc sp_re_mrb_temp_alloc
49
+ #define mrb_uni_case_fold sp_re_mrb_uni_case_fold
50
+ #define mrb_uni_case_fold_range sp_re_mrb_uni_case_fold_range
51
+ #define mrb_uni_case_map sp_re_mrb_uni_case_map
52
+ #define mrb_uni_case_unfold sp_re_mrb_uni_case_unfold
53
+ #define mrb_uni_case_unfold_range sp_re_mrb_uni_case_unfold_range
54
+ #define mrb_utf8_char_head sp_re_mrb_utf8_char_head
55
+ #define mrb_utf8_decode sp_re_mrb_utf8_decode
56
+ #define mrb_utf8_to_buf sp_re_mrb_utf8_to_buf
57
+ #define mrb_utf8len sp_re_mrb_utf8len
58
+
59
+ #endif