From 12196ee24fce0e601106036e67526819cac07291 Mon Sep 17 00:00:00 2001 From: matz Date: Tue, 16 Sep 2003 17:37:34 +0000 Subject: [PATCH] * regex.c (re_compile_pattern): should not translate character class range edge. [ruby-list:38393] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4557 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ lib/open3.rb | 9 ++++++--- regex.c | 30 ++++++++++++++++++++---------- 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index cd8096e5fe..986322ce01 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,11 @@ Mon Sep 16 22:25:06 2003 NAKAMURA, Hiroshi * test/csv/test_csv.rb: add negative tests of row_sep. +Tue Sep 16 18:02:36 2003 Yukihiro Matsumoto + + * regex.c (re_compile_pattern): should not translate character + class range edge. [ruby-list:38393] + Tue Sep 16 16:47:56 2003 WATANABE Hirofumi * MANIFEST: add test/csv/mac.csv. diff --git a/lib/open3.rb b/lib/open3.rb index a6e6c5d62b..569c8968b4 100644 --- a/lib/open3.rb +++ b/lib/open3.rb @@ -1,11 +1,14 @@ +# open3.rb: Spawn a program like popen, but with stderr, too. You might also +# want to use this if you want to bypass the shell. (By passing multiple args, +# with IO#popen does not allow) +# # Usage: # require "open3" # -# in, out, err = Open3.popen3('nroff -man') +# stdin, stdout, stderr = Open3.popen3('nroff -man') # or # include Open3 -# in, out, err = popen3('nroff -man') -# +# stdin, stdout, stderr = popen3('nroff -man') module Open3 #[stdin, stdout, stderr] = popen3(command); diff --git a/regex.c b/regex.c index e9f382f0a4..fea8bf9f7e 100644 --- a/regex.c +++ b/regex.c @@ -1464,7 +1464,7 @@ re_compile_pattern(pattern, size, bufp) if (range && had_char_class) { FREE_AND_RETURN(stackb, "invalid regular expression; can't use character class as an end value of range"); } - PATFETCH(c); + PATFETCH_RAW(c); if (c == ']') { if (p == p0 + 1) { @@ -1608,7 +1608,7 @@ re_compile_pattern(pattern, size, bufp) FREE_AND_RETURN(stackb, "invalid regular expression; re can't end '[[:'"); for (;;) { - PATFETCH (c); + PATFETCH_RAW(c); if (c == ':' || c == ']' || p == pend || c1 == CHAR_CLASS_MAX_LENGTH) break; @@ -1680,8 +1680,14 @@ re_compile_pattern(pattern, size, bufp) range = 0; if (had_mbchar == 0) { - for (;last<=c;last++) - SET_LIST_BIT(last); + if (TRANSLATE_P()) { + for (;last<=c;last++) + SET_LIST_BIT(translate[last]); + } + else { + for (;last<=c;last++) + SET_LIST_BIT(last); + } } else if (had_mbchar == 2) { set_list_bits(last, c, b); @@ -1693,16 +1699,20 @@ re_compile_pattern(pattern, size, bufp) } else if (p[0] == '-' && p[1] != ']') { last = c; - PATFETCH(c1); + PATFETCH_RAW(c1); range = 1; goto range_retry; } - else if (had_mbchar == 0 && (!current_mbctype || !had_num_literal)) { - SET_LIST_BIT(c); - had_num_literal = 0; + else { + if (TRANSLATE_P()) c = (unsigned char)translate[c]; + if (had_mbchar == 0 && (!current_mbctype || !had_num_literal)) { + SET_LIST_BIT(c); + had_num_literal = 0; + } + else { + set_list_bits(c, c, b); + } } - else - set_list_bits(c, c, b); had_mbchar = 0; }