summaryrefslogtreecommitdiff
path: root/regex.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-03-27 03:16:23 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-03-27 03:16:23 +0000
commit576f18654d2f17384af99b7688cc92d8c009b25f (patch)
tree3be4572cf4810a5bfabe277b9f8f463a5bd0c89e /regex.c
parent313579f507fc48dd4e5f122f33f5178b2fd535a7 (diff)
* 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
Diffstat (limited to 'regex.c')
-rw-r--r--regex.c66
1 files changed, 32 insertions, 34 deletions
diff --git a/regex.c b/regex.c
index c81c140..90f86f4 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;