diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-03-27 03:16:23 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-03-27 03:16:23 +0000 |
commit | 576f18654d2f17384af99b7688cc92d8c009b25f (patch) | |
tree | 3be4572cf4810a5bfabe277b9f8f463a5bd0c89e | |
parent | 313579f507fc48dd4e5f122f33f5178b2fd535a7 (diff) | |
download | ruby-576f18654d2f17384af99b7688cc92d8c009b25f.tar.gz |
* 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
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | regex.c | 66 |
2 files changed, 39 insertions, 34 deletions
@@ -1,3 +1,10 @@ +Thu Mar 27 12:10:15 2003 Tanaka Akira <akr@m17n.org> + + * 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 <nobu.nokada@softhome.net> * string.c (rb_str_capitalize_bang): check length before upcase @@ -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; |