From 576f18654d2f17384af99b7688cc92d8c009b25f Mon Sep 17 00:00:00 2001 From: akr Date: Thu, 27 Mar 2003 03:16:23 +0000 Subject: * regex.c (re_compile_pattern): fix [:name:] handling. /[\[:digit:]]/ was treated as /[[:digit:]]/. /[[:-@]/ was treated as /[\[:\-@]/. /[%-[:digit:]]/ was treated as /[%-\[:digit:]\]/. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3623 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ regex.c | 66 +++++++++++++++++++++++++++++++-------------------------------- 2 files changed, 39 insertions(+), 34 deletions(-) diff --git a/ChangeLog b/ChangeLog index dde29576c1..c882a94c34 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Thu Mar 27 12:10:15 2003 Tanaka Akira + + * regex.c (re_compile_pattern): fix [:name:] handling. + /[\[:digit:]]/ was treated as /[[:digit:]]/. + /[[:-@]/ was treated as /[\[:\-@]/. + /[%-[:digit:]]/ was treated as /[%-\[:digit:]\]/. + Thu Mar 27 03:26:40 2003 Nobuyoshi Nakada * string.c (rb_str_capitalize_bang): check length before upcase diff --git a/regex.c b/regex.c index c81c140acc..90f86f46c9 100644 --- a/regex.c +++ b/regex.c @@ -1593,32 +1593,7 @@ re_compile_pattern(pattern, size, bufp) break; } } - - /* Get a range. */ - if (range) { - if (last > c) - goto invalid_pattern; - - range = 0; - if (had_mbchar == 0) { - for (;last<=c;last++) - SET_LIST_BIT(last); - } - else if (had_mbchar == 2) { - set_list_bits(last, c, b); - } - else { - /* restriction: range between sbc and mbc */ - goto invalid_pattern; - } - } - else if (p[0] == '-' && p[1] != ']') { - last = c; - PATFETCH(c1); - range = 1; - goto range_retry; - } - else if (c == '[' && *p == ':') { + else if (c == '[' && *p == ':') { /* [:...:] */ /* Leave room for the null. */ char str[CHAR_CLASS_MAX_LENGTH + 1]; @@ -1638,9 +1613,9 @@ re_compile_pattern(pattern, size, bufp) } str[c1] = '\0'; - /* If isn't a word bracketed by `[:' and:`]': - undo the ending character, the letters, and leave - the leading `:' and `[' (but set bits for them). */ + /* If isn't a word bracketed by `[:' and `:]': + undo the ending character, the letters, and + the leading `:' and `['. */ if (c == ':' && *p == ']') { int ch; char is_alnum = STREQ(str, "alnum"); @@ -1684,18 +1659,41 @@ re_compile_pattern(pattern, size, bufp) SET_LIST_BIT(ch); } had_char_class = 1; + continue; } else { - c1++; + c1 += 2; while (c1--) PATUNFETCH; re_warning("character class has `[' without escape"); - SET_LIST_BIT(TRANSLATE_P()?translate['[']:'['); - SET_LIST_BIT(TRANSLATE_P()?translate[':']:':'); - had_char_class = 0; - last = ':'; + c = '['; } } + + /* Get a range. */ + if (range) { + if (last > c) + goto invalid_pattern; + + range = 0; + if (had_mbchar == 0) { + for (;last<=c;last++) + SET_LIST_BIT(last); + } + else if (had_mbchar == 2) { + set_list_bits(last, c, b); + } + else { + /* restriction: range between sbc and mbc */ + goto invalid_pattern; + } + } + else if (p[0] == '-' && p[1] != ']') { + last = c; + PATFETCH(c1); + range = 1; + goto range_retry; + } else if (had_mbchar == 0 && (!current_mbctype || !had_num_literal)) { SET_LIST_BIT(c); had_num_literal = 0; -- cgit v1.2.3