summaryrefslogtreecommitdiff
path: root/prism/regexp.c
diff options
context:
space:
mode:
authorKevin Newton <[email protected]>2024-06-04 12:05:48 -0400
committerKevin Newton <[email protected]>2024-06-05 14:40:03 -0400
commitad438623e8f4e90b7d6567c6c552be89d080dcca (patch)
tree49919529999290e3e56b47afb37c07b3d6bfeeae /prism/regexp.c
parentaa61d4237dad54e01c00f8cef4ba7f7cdffb8a80 (diff)
[ruby/prism] Switch regexp parsing to use a callback from named capture groups
https://github.com/ruby/prism/commit/29d80e486e
Diffstat (limited to 'prism/regexp.c')
-rw-r--r--prism/regexp.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/prism/regexp.c b/prism/regexp.c
index 6e0fdd295c..15bb7c2611 100644
--- a/prism/regexp.c
+++ b/prism/regexp.c
@@ -13,28 +13,32 @@ typedef struct {
/** A pointer to the end of the source that we are parsing. */
const uint8_t *end;
- /** A list of named captures that we've found. */
- pm_string_list_t *named_captures;
-
/** Whether the encoding has changed from the default. */
bool encoding_changed;
/** The encoding of the source. */
const pm_encoding_t *encoding;
+
+ /** The callback to call when a named capture group is found. */
+ pm_regexp_name_callback_t name_callback;
+
+ /** The data to pass to the name callback. */
+ void *name_data;
} pm_regexp_parser_t;
/**
* This initializes a new parser with the given source.
*/
static void
-pm_regexp_parser_init(pm_regexp_parser_t *parser, const uint8_t *start, const uint8_t *end, pm_string_list_t *named_captures, bool encoding_changed, const pm_encoding_t *encoding) {
+pm_regexp_parser_init(pm_regexp_parser_t *parser, const uint8_t *start, const uint8_t *end, bool encoding_changed, const pm_encoding_t *encoding, pm_regexp_name_callback_t name_callback, void *name_data) {
*parser = (pm_regexp_parser_t) {
.start = start,
.cursor = start,
.end = end,
- .named_captures = named_captures,
.encoding_changed = encoding_changed,
- .encoding = encoding
+ .encoding = encoding,
+ .name_callback = name_callback,
+ .name_data = name_data
};
}
@@ -45,7 +49,7 @@ static void
pm_regexp_parser_named_capture(pm_regexp_parser_t *parser, const uint8_t *start, const uint8_t *end) {
pm_string_t string;
pm_string_shared_init(&string, start, end);
- pm_string_list_append(parser->named_captures, &string);
+ parser->name_callback(&string, parser->name_data);
pm_string_free(&string);
}
@@ -646,8 +650,8 @@ pm_regexp_parse_pattern(pm_regexp_parser_t *parser) {
* groups.
*/
PRISM_EXPORTED_FUNCTION bool
-pm_regexp_named_capture_group_names(const uint8_t *source, size_t size, pm_string_list_t *named_captures, bool encoding_changed, const pm_encoding_t *encoding) {
+pm_regexp_parse(const uint8_t *source, size_t size, bool encoding_changed, const pm_encoding_t *encoding, pm_regexp_name_callback_t name_callback, void *name_data) {
pm_regexp_parser_t parser;
- pm_regexp_parser_init(&parser, source, source + size, named_captures, encoding_changed, encoding);
+ pm_regexp_parser_init(&parser, source, source + size, encoding_changed, encoding, name_callback, name_data);
return pm_regexp_parse_pattern(&parser);
}