ruby-changes:17146
From: naruse <ko1@a...>
Date: Mon, 30 Aug 2010 15:01:22 +0900 (JST)
Subject: [ruby-changes:17146] Ruby:r29146 (trunk): * string.c (tr_setup_table): initialize negating table when
naruse 2010-08-30 15:01:14 +0900 (Mon, 30 Aug 2010) New Revision: 29146 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=29146 Log: * string.c (tr_setup_table): initialize negating table when negating string is given. [ruby-core:31851] * string.c (tr_find): add a sentence for the time when target characters include negating one. * string.c (rb_str_count): move definition. Modified files: trunk/ChangeLog trunk/string.c trunk/test/ruby/test_string.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 29145) +++ ChangeLog (revision 29146) @@ -1,3 +1,13 @@ +Mon Aug 30 15:00:13 2010 NARUSE, Yui <naruse@r...> + + * string.c (tr_setup_table): initialize negating table when + negating string is given. [ruby-core:31851] + + * string.c (tr_find): add a sentence for the time when + target characters include negating one. + + * string.c (rb_str_count): move definition. + Mon Aug 30 07:32:41 2010 Tanaka Akira <akr@f...> * ext/pathname/pathname.c (path_.executable_p): Pathname#.executable? Index: string.c =================================================================== --- string.c (revision 29145) +++ string.c (revision 29146) @@ -5090,6 +5090,10 @@ if (RSTRING_LEN(str) > 1 && rb_enc_ascget(tr.p, tr.pend, &l, enc) == '^') { cflag = 1; tr.p += l; + + table = rb_hash_new(); + ptable = *ctablep; + *ctablep = table; } if (first) { for (i=0; i<256; i++) { @@ -5109,11 +5113,7 @@ if (!table) { table = rb_hash_new(); - if (cflag) { - ptable = *ctablep; - *ctablep = table; - } - else { + if (!cflag) { ptable = *tablep; *tablep = table; } @@ -5138,11 +5138,15 @@ else { VALUE v = UINT2NUM(c); - if (del && !NIL_P(rb_hash_lookup(del, v))) { - if (!nodel || NIL_P(rb_hash_lookup(nodel, v))) { + if (del) { + if (!NIL_P(rb_hash_lookup(del, v)) && + (!nodel || NIL_P(rb_hash_lookup(nodel, v)))) { return TRUE; } } + else if (!nodel || NIL_P(rb_hash_lookup(nodel, v))) { + return TRUE; + } return FALSE; } } @@ -5443,16 +5447,15 @@ i = 0; while (s < send) { unsigned int c; - int clen; if (ascompat && (c = *(unsigned char*)s) < 0x80) { - clen = 1; if (table[c]) { i++; } s++; } else { + int clen; c = rb_enc_codepoint_len(s, send, &clen, enc); if (tr_find(c, table, del, nodel)) { i++; Index: test/ruby/test_string.rb =================================================================== --- test/ruby/test_string.rb (revision 29145) +++ test/ruby/test_string.rb (revision 29146) @@ -479,6 +479,8 @@ assert_equal(4, a.count(S("hello"), S("^l"))) assert_equal(4, a.count(S("ej-m"))) assert_equal(0, S("y").count(S("a\\-z"))) + assert_equal(5, "abc\u{3042 3044 3046}".count("^a")) + assert_equal(5, "abc\u{3042 3044 3046}".count("^\u3042")) assert_raise(ArgumentError) { "foo".count } end @@ -498,6 +500,9 @@ assert_equal(true, "a\u0101".delete("\u0101").ascii_only?) assert_equal(true, "a\u3041".delete("\u3041").ascii_only?) assert_equal(false, "a\u3041\u3042".tr("\u3041", "a").ascii_only?) + + assert_equal("a", "abc\u{3042 3044 3046}".delete("^a")) + assert_equal("\u3042", "abc\u{3042 3044 3046}".delete("^\u3042")) end def test_delete! -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/