diff options
Diffstat (limited to 'ext/mbstring/oniguruma/regparse.c')
-rw-r--r-- | ext/mbstring/oniguruma/regparse.c | 114 |
1 files changed, 58 insertions, 56 deletions
diff --git a/ext/mbstring/oniguruma/regparse.c b/ext/mbstring/oniguruma/regparse.c index 01131300c6..bf72300caa 100644 --- a/ext/mbstring/oniguruma/regparse.c +++ b/ext/mbstring/oniguruma/regparse.c @@ -262,6 +262,14 @@ strdup_with_null(OnigEncoding enc, UChar* s, UChar* end) p += ONIGENC_MBC_ENC_LEN(enc, p); \ } while (0) +#define PINC_S do { \ + p += ONIGENC_MBC_ENC_LEN(enc, p); \ +} while (0) +#define PFETCH_S(c) do { \ + c = ONIGENC_MBC_TO_CODE(enc, p, end); \ + p += ONIGENC_MBC_ENC_LEN(enc, p); \ +} while (0) + #define PPEEK (p < end ? ONIGENC_MBC_TO_CODE(enc, p, end) : PEND_VALUE) #define PPEEK_IS(c) (PPEEK == (OnigCodePoint )c) @@ -2404,22 +2412,21 @@ fetch_escaped_value(UChar** src, UChar* end, ScanEnv* env) OnigCodePoint c; OnigEncoding enc = env->enc; UChar* p = *src; - PFETCH_READY; if (PEND) return ONIGERR_END_PATTERN_AT_ESCAPE; - PFETCH(c); + PFETCH_S(c); switch (c) { case 'M': if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_ESC_CAPITAL_M_BAR_META)) { if (PEND) return ONIGERR_END_PATTERN_AT_META; - PFETCH(c); + PFETCH_S(c); if (c != '-') return ONIGERR_META_CODE_SYNTAX; if (PEND) return ONIGERR_END_PATTERN_AT_META; - PFETCH(c); + PFETCH_S(c); if (c == MC_ESC(env->syntax)) { - v = fetch_escaped_value(&p, end, env); - if (v < 0) return v; + v = fetch_escaped_value(&p, end, env); + if (v < 0) return v; c = (OnigCodePoint )v; } c = ((c & 0xff) | 0x80); @@ -2431,7 +2438,7 @@ fetch_escaped_value(UChar** src, UChar* end, ScanEnv* env) case 'C': if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_ESC_CAPITAL_C_BAR_CONTROL)) { if (PEND) return ONIGERR_END_PATTERN_AT_CONTROL; - PFETCH(c); + PFETCH_S(c); if (c != '-') return ONIGERR_CONTROL_CODE_SYNTAX; goto control; } @@ -2442,9 +2449,9 @@ fetch_escaped_value(UChar** src, UChar* end, ScanEnv* env) if (IS_SYNTAX_OP(env->syntax, ONIG_SYN_OP_ESC_C_CONTROL)) { control: if (PEND) return ONIGERR_END_PATTERN_AT_CONTROL; - PFETCH(c); + PFETCH_S(c); if (c == '?') { - c = 0177; + c = 0177; } else { if (c == MC_ESC(env->syntax)) { @@ -2452,7 +2459,7 @@ fetch_escaped_value(UChar** src, UChar* end, ScanEnv* env) if (v < 0) return v; c = (OnigCodePoint )v; } - c &= 0x9f; + c &= 0x9f; } break; } @@ -2546,11 +2553,11 @@ fetch_name_with_level(OnigCodePoint start_code, UChar** src, UChar* end, if (is_num != 0) { if (ONIGENC_IS_CODE_DIGIT(enc, c)) { - is_num = 1; + is_num = 1; } else { - r = ONIGERR_INVALID_GROUP_NAME; - is_num = 0; + r = ONIGERR_INVALID_GROUP_NAME; + is_num = 0; } } else if (!ONIGENC_IS_CODE_WORD(enc, c)) { @@ -2617,7 +2624,6 @@ fetch_name(OnigCodePoint start_code, UChar** src, UChar* end, UChar *name_end; UChar *pnum_head; UChar *p = *src; - PFETCH_READY; *rback_num = 0; @@ -2632,27 +2638,27 @@ fetch_name(OnigCodePoint start_code, UChar** src, UChar* end, return ONIGERR_EMPTY_GROUP_NAME; } else { - PFETCH(c); + PFETCH_S(c); if (c == end_code) return ONIGERR_EMPTY_GROUP_NAME; if (ONIGENC_IS_CODE_DIGIT(enc, c)) { if (ref == 1) - is_num = 1; + is_num = 1; else { - r = ONIGERR_INVALID_GROUP_NAME; - is_num = 0; + r = ONIGERR_INVALID_GROUP_NAME; + is_num = 0; } } else if (c == '-') { if (ref == 1) { - is_num = 2; - sign = -1; - pnum_head = p; + is_num = 2; + sign = -1; + pnum_head = p; } else { - r = ONIGERR_INVALID_GROUP_NAME; - is_num = 0; + r = ONIGERR_INVALID_GROUP_NAME; + is_num = 0; } } else if (!ONIGENC_IS_CODE_WORD(enc, c)) { @@ -2663,29 +2669,28 @@ fetch_name(OnigCodePoint start_code, UChar** src, UChar* end, if (r == 0) { while (!PEND) { name_end = p; - PFETCH(c); + PFETCH_S(c); if (c == end_code || c == ')') { - if (is_num == 2) r = ONIGERR_INVALID_GROUP_NAME; - break; + if (is_num == 2) r = ONIGERR_INVALID_GROUP_NAME; + break; } if (is_num != 0) { - if (ONIGENC_IS_CODE_DIGIT(enc, c)) { - is_num = 1; - } - else { - if (!ONIGENC_IS_CODE_WORD(enc, c)) - r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME; - else - r = ONIGERR_INVALID_GROUP_NAME; - - is_num = 0; - } + if (ONIGENC_IS_CODE_DIGIT(enc, c)) { + is_num = 1; + } + else { + if (!ONIGENC_IS_CODE_WORD(enc, c)) + r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME; + else + r = ONIGERR_INVALID_GROUP_NAME; + is_num = 0; + } } else { - if (!ONIGENC_IS_CODE_WORD(enc, c)) { - r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME; - } + if (!ONIGENC_IS_CODE_WORD(enc, c)) { + r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME; + } } } @@ -2698,8 +2703,8 @@ fetch_name(OnigCodePoint start_code, UChar** src, UChar* end, *rback_num = onig_scan_unsigned_number(&pnum_head, name_end, enc); if (*rback_num < 0) return ONIGERR_TOO_BIG_NUMBER; else if (*rback_num == 0) { - r = ONIGERR_INVALID_GROUP_NAME; - goto err; + r = ONIGERR_INVALID_GROUP_NAME; + goto err; } *rback_num *= sign; @@ -2712,9 +2717,9 @@ fetch_name(OnigCodePoint start_code, UChar** src, UChar* end, else { while (!PEND) { name_end = p; - PFETCH(c); + PFETCH_S(c); if (c == end_code || c == ')') - break; + break; } if (PEND) name_end = end; @@ -3935,10 +3940,9 @@ parse_posix_bracket(CClassNode* cc, UChar** src, UChar* end, ScanEnv* env) OnigCodePoint c; OnigEncoding enc = env->enc; UChar *p = *src; - PFETCH_READY; if (PPEEK_IS('^')) { - PINC; + PINC_S; not = 1; } else @@ -3951,12 +3955,12 @@ parse_posix_bracket(CClassNode* cc, UChar** src, UChar* end, ScanEnv* env) if (onigenc_with_ascii_strncmp(enc, p, end, pb->name, pb->len) == 0) { p = (UChar* )onigenc_step(enc, p, end, pb->len); if (onigenc_with_ascii_strncmp(enc, p, end, (UChar* )":]", 2) != 0) - return ONIGERR_INVALID_POSIX_BRACKET_TYPE; + return ONIGERR_INVALID_POSIX_BRACKET_TYPE; r = add_ctype_to_cc(cc, pb->ctype, not, env); if (r != 0) return r; - PINC; PINC; + PINC_S; PINC_S; *src = p; return 0; } @@ -3966,15 +3970,15 @@ parse_posix_bracket(CClassNode* cc, UChar** src, UChar* end, ScanEnv* env) c = 0; i = 0; while (!PEND && ((c = PPEEK) != ':') && c != ']') { - PINC; + PINC_S; if (++i > POSIX_BRACKET_CHECK_LIMIT_LENGTH) break; } if (c == ':' && ! PEND) { - PINC; + PINC_S; if (! PEND) { - PFETCH(c); + PFETCH_S(c); if (c == ']') - return ONIGERR_INVALID_POSIX_BRACKET_TYPE; + return ONIGERR_INVALID_POSIX_BRACKET_TYPE; } } @@ -3988,14 +3992,13 @@ fetch_char_property_to_ctype(UChar** src, UChar* end, ScanEnv* env) OnigCodePoint c; OnigEncoding enc = env->enc; UChar *prev, *start, *p = *src; - PFETCH_READY; r = 0; start = prev = p; while (!PEND) { prev = p; - PFETCH(c); + PFETCH_S(c); if (c == '}') { r = ONIGENC_PROPERTY_NAME_TO_CTYPE(enc, start, prev); if (r < 0) break; @@ -4153,7 +4156,6 @@ code_exist_check(OnigCodePoint c, UChar* from, UChar* end, int ignore_escaped, OnigCodePoint code; OnigEncoding enc = env->enc; UChar* p = from; - PFETCH_READY; in_esc = 0; while (! PEND) { @@ -4161,7 +4163,7 @@ code_exist_check(OnigCodePoint c, UChar* from, UChar* end, int ignore_escaped, in_esc = 0; } else { - PFETCH(code); + PFETCH_S(code); if (code == c) return 1; if (code == MC_ESC(env->syntax)) in_esc = 1; } |