mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* ext/strscan/strscan.c (strscan_do_scan): should set kcode option before match. [ruby-dev:29914]
* test/strscan/test_stringscanner.rb: test it. * re.c: export kcode_set_option and kcode_reset_option (with "rb_" prefix). * intern.h: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@11524 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									d158c31683
								
							
						
					
					
						commit
						2785c7c05f
					
				
					 5 changed files with 46 additions and 17 deletions
				
			
		
							
								
								
									
										12
									
								
								ChangeLog
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								ChangeLog
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,3 +1,15 @@
 | 
			
		|||
Wed Jan 10 18:57:57 2007  Minero Aoki  <aamine@loveruby.net>
 | 
			
		||||
 | 
			
		||||
	* ext/strscan/strscan.c (strscan_do_scan): should set kcode option
 | 
			
		||||
	  before match. [ruby-dev:29914]
 | 
			
		||||
 | 
			
		||||
	* test/strscan/test_stringscanner.rb: test it.
 | 
			
		||||
 | 
			
		||||
	* re.c: export kcode_set_option and kcode_reset_option (with "rb_"
 | 
			
		||||
	  prefix).
 | 
			
		||||
 | 
			
		||||
	* intern.h: ditto.
 | 
			
		||||
 | 
			
		||||
Tue Jan  9 17:45:17 2007  NAKAMURA Usaku  <usa@ruby-lang.org>
 | 
			
		||||
 | 
			
		||||
	* file.c (rb_find_file): should not call fpath_check() with NULL.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -403,6 +403,7 @@ strscan_do_scan(VALUE self, VALUE regex, int succptr, int getstr, int headonly)
 | 
			
		|||
    if (S_RESTLEN(p) < 0) {
 | 
			
		||||
        return Qnil;
 | 
			
		||||
    }
 | 
			
		||||
    rb_kcode_set_option(regex);
 | 
			
		||||
    if (headonly) {
 | 
			
		||||
        ret = re_match(RREGEXP(regex)->ptr,
 | 
			
		||||
                       CURPTR(p), S_RESTLEN(p),
 | 
			
		||||
| 
						 | 
				
			
			@ -416,6 +417,7 @@ strscan_do_scan(VALUE self, VALUE regex, int succptr, int getstr, int headonly)
 | 
			
		|||
                        S_RESTLEN(p),
 | 
			
		||||
                        &(p->regs));
 | 
			
		||||
    }
 | 
			
		||||
    rb_kcode_reset_option();
 | 
			
		||||
 | 
			
		||||
    if (ret == -2) rb_raise(ScanError, "regexp buffer overflow");
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								intern.h
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								intern.h
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -370,6 +370,8 @@ VALUE rb_reg_match2 _((VALUE));
 | 
			
		|||
int rb_reg_options _((VALUE));
 | 
			
		||||
void rb_set_kcode _((const char*));
 | 
			
		||||
const char* rb_get_kcode _((void));
 | 
			
		||||
void rb_kcode_set_option _((VALUE));
 | 
			
		||||
void rb_kcode_reset_option _((void));
 | 
			
		||||
/* ruby.c */
 | 
			
		||||
RUBY_EXTERN VALUE rb_argv;
 | 
			
		||||
RUBY_EXTERN VALUE rb_argv0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										34
									
								
								re.c
									
										
									
									
									
								
							
							
						
						
									
										34
									
								
								re.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -200,8 +200,8 @@ kcode_none(re)
 | 
			
		|||
 | 
			
		||||
static int curr_kcode;
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
kcode_set_option(re)
 | 
			
		||||
void
 | 
			
		||||
rb_kcode_set_option(re)
 | 
			
		||||
    VALUE re;
 | 
			
		||||
{
 | 
			
		||||
    if (!FL_TEST(re, KCODE_FIXED)) return;
 | 
			
		||||
| 
						 | 
				
			
			@ -224,8 +224,8 @@ kcode_set_option(re)
 | 
			
		|||
    }
 | 
			
		||||
}	  
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
kcode_reset_option()
 | 
			
		||||
void
 | 
			
		||||
rb_kcode_reset_option()
 | 
			
		||||
{
 | 
			
		||||
    if (reg_kcode == curr_kcode) return;
 | 
			
		||||
    switch (reg_kcode) {
 | 
			
		||||
| 
						 | 
				
			
			@ -253,9 +253,9 @@ rb_reg_mbclen2(c, re)
 | 
			
		|||
 | 
			
		||||
    if (!FL_TEST(re, KCODE_FIXED))
 | 
			
		||||
	return mbclen(c);
 | 
			
		||||
    kcode_set_option(re);
 | 
			
		||||
    rb_kcode_set_option(re);
 | 
			
		||||
    len = mbclen(c);
 | 
			
		||||
    kcode_reset_option();
 | 
			
		||||
    rb_kcode_reset_option();
 | 
			
		||||
    return len;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -486,11 +486,11 @@ rb_reg_to_s(re)
 | 
			
		|||
	}
 | 
			
		||||
	if (*ptr == ':' && ptr[len-1] == ')') {
 | 
			
		||||
	    Regexp *rp;
 | 
			
		||||
	    kcode_set_option(re);
 | 
			
		||||
	    rb_kcode_set_option(re);
 | 
			
		||||
	    rp = ALLOC(Regexp);
 | 
			
		||||
	    MEMZERO((char *)rp, Regexp, 1);
 | 
			
		||||
	    err = re_compile_pattern(++ptr, len -= 2, rp) != 0;
 | 
			
		||||
	    kcode_reset_option();
 | 
			
		||||
	    rb_kcode_reset_option();
 | 
			
		||||
	    re_free_pattern(rp);
 | 
			
		||||
	}
 | 
			
		||||
	if (err) {
 | 
			
		||||
| 
						 | 
				
			
			@ -849,7 +849,7 @@ rb_reg_prepare_re(re)
 | 
			
		|||
	char *err;
 | 
			
		||||
 | 
			
		||||
	if (FL_TEST(re, KCODE_FIXED))
 | 
			
		||||
	    kcode_set_option(re);
 | 
			
		||||
	    rb_kcode_set_option(re);
 | 
			
		||||
	rb_reg_check(re);
 | 
			
		||||
	RREGEXP(re)->ptr->fastmap_accurate = 0;
 | 
			
		||||
	err = re_compile_pattern(RREGEXP(re)->str, RREGEXP(re)->len, RREGEXP(re)->ptr);
 | 
			
		||||
| 
						 | 
				
			
			@ -870,9 +870,9 @@ rb_reg_adjust_startpos(re, str, pos, reverse)
 | 
			
		|||
    if (may_need_recompile) rb_reg_prepare_re(re);
 | 
			
		||||
 | 
			
		||||
    if (FL_TEST(re, KCODE_FIXED))
 | 
			
		||||
	kcode_set_option(re);
 | 
			
		||||
	rb_kcode_set_option(re);
 | 
			
		||||
    else if (reg_kcode != curr_kcode)
 | 
			
		||||
	kcode_reset_option();
 | 
			
		||||
	rb_kcode_reset_option();
 | 
			
		||||
 | 
			
		||||
    if (reverse) {
 | 
			
		||||
	range = -pos;
 | 
			
		||||
| 
						 | 
				
			
			@ -904,9 +904,9 @@ rb_reg_search(re, str, pos, reverse)
 | 
			
		|||
    if (may_need_recompile) rb_reg_prepare_re(re);
 | 
			
		||||
 | 
			
		||||
    if (FL_TEST(re, KCODE_FIXED))
 | 
			
		||||
	kcode_set_option(re);
 | 
			
		||||
	rb_kcode_set_option(re);
 | 
			
		||||
    else if (reg_kcode != curr_kcode)
 | 
			
		||||
	kcode_reset_option();
 | 
			
		||||
	rb_kcode_reset_option();
 | 
			
		||||
 | 
			
		||||
    if (reverse) {
 | 
			
		||||
	range = -pos;
 | 
			
		||||
| 
						 | 
				
			
			@ -918,7 +918,7 @@ rb_reg_search(re, str, pos, reverse)
 | 
			
		|||
		       pos, range, ®s);
 | 
			
		||||
 | 
			
		||||
    if (FL_TEST(re, KCODE_FIXED))
 | 
			
		||||
	kcode_reset_option();
 | 
			
		||||
	rb_kcode_reset_option();
 | 
			
		||||
 | 
			
		||||
    if (result == -2) {
 | 
			
		||||
	rb_reg_raise(RREGEXP(re)->str, RREGEXP(re)->len,
 | 
			
		||||
| 
						 | 
				
			
			@ -1364,7 +1364,7 @@ rb_reg_initialize(obj, s, len, options)
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    if (options & ~0xf) {
 | 
			
		||||
	kcode_set_option((VALUE)re);
 | 
			
		||||
	rb_kcode_set_option((VALUE)re);
 | 
			
		||||
    }
 | 
			
		||||
    if (ruby_ignorecase) {
 | 
			
		||||
	options |= RE_OPTION_IGNORECASE;
 | 
			
		||||
| 
						 | 
				
			
			@ -1376,7 +1376,7 @@ rb_reg_initialize(obj, s, len, options)
 | 
			
		|||
    re->str[len] = '\0';
 | 
			
		||||
    re->len = len;
 | 
			
		||||
    if (options & ~0xf) {
 | 
			
		||||
	kcode_reset_option();
 | 
			
		||||
	rb_kcode_reset_option();
 | 
			
		||||
    }
 | 
			
		||||
    if (ruby_in_compile) FL_SET(obj, REG_LITERAL);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1839,7 +1839,7 @@ rb_reg_s_quote(argc, argv)
 | 
			
		|||
    }
 | 
			
		||||
    StringValue(str);
 | 
			
		||||
    str = rb_reg_quote(str);
 | 
			
		||||
    kcode_reset_option();
 | 
			
		||||
    rb_kcode_reset_option();
 | 
			
		||||
    return str;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -247,6 +247,19 @@ class TestStringScanner < Test::Unit::TestCase
 | 
			
		|||
    s = StringScanner.new("")
 | 
			
		||||
    assert_equal "", s.scan(//)
 | 
			
		||||
    assert_equal "", s.scan(//)
 | 
			
		||||
 | 
			
		||||
    # [ruby-dev:29914]
 | 
			
		||||
    %w( NONE EUC SJIS UTF8 ).each do |kcode|
 | 
			
		||||
      begin
 | 
			
		||||
        $KCODE = kcode
 | 
			
		||||
        assert_equal "a", StringScanner.new("a:b").scan(/[^\x01\:]+/n)
 | 
			
		||||
        assert_equal "a", StringScanner.new("a:b").scan(/[^\x01\:]+/e)
 | 
			
		||||
        assert_equal "a", StringScanner.new("a:b").scan(/[^\x01\:]+/s)
 | 
			
		||||
        assert_equal "a", StringScanner.new("a:b").scan(/[^\x01\:]+/u)
 | 
			
		||||
      ensure
 | 
			
		||||
        $KCODE = 'NONE'
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_skip
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue