diff options
Diffstat (limited to 'libregexp.c')
-rw-r--r-- | libregexp.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/libregexp.c b/libregexp.c index b455bf2..bbb5e9d 100644 --- a/libregexp.c +++ b/libregexp.c @@ -569,7 +569,8 @@ int lre_parse_escape(const uint8_t **pp, int allow_utf16) } } break; - case '0' ... '7': + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': c -= '0'; if (allow_utf16 == 2) { /* only accept \0 not followed by digit */ @@ -1410,7 +1411,9 @@ static int re_parse_term(REParseState *s, BOOL is_backward_dir) } } goto normal_char; - case '1' ... '9': + case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': + case '9': { const uint8_t *q = ++p; @@ -1434,7 +1437,7 @@ static int re_parse_term(REParseState *s, BOOL is_backward_dir) } goto normal_char; } - return re_parse_error(s, "back reference out of range in reguar expression"); + return re_parse_error(s, "back reference out of range in regular expression"); } emit_back_reference: last_atom_start = s->byte_code.size; @@ -2533,6 +2536,17 @@ int lre_get_flags(const uint8_t *bc_buf) return bc_buf[RE_HEADER_FLAGS]; } +/* Return NULL if no group names. Otherwise, return a pointer to + 'capture_count - 1' zero terminated UTF-8 strings. */ +const char *lre_get_groupnames(const uint8_t *bc_buf) +{ + uint32_t re_bytecode_len; + if ((lre_get_flags(bc_buf) & LRE_FLAG_NAMED_GROUPS) == 0) + return NULL; + re_bytecode_len = get_u32(bc_buf + 3); + return (const char *)(bc_buf + 7 + re_bytecode_len); +} + #ifdef TEST BOOL lre_check_stack_overflow(void *opaque, size_t alloca_size) |