[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]