[#12763] NameError (Re: [ruby-list:29101] Re: nil.to_f) — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

24 messages 2001/04/04
[#12765] Re: NameError (Re: [ruby-list:29101] Re: nil.to_f) — "K.Kosako" <kosako@...> 2001/04/04

Yukihiro Matsumotoさんの

[#12767] Re: NameError (Re: [ruby-list:29101] Re: nil.to_f) — matz@... (Yukihiro Matsumoto) 2001/04/04

まつもと ゆきひろです

[#12787] Re: NameError (Re: [ruby-list:29101] Re: nil.to_f) — "K.Kosako" <kosako@...> 2001/04/06

Yukihiro Matsumotoさんの

[#12789] Re: NameError (Re: [ruby-list:29101] Re: nil.to_f) — matz@... (Yukihiro Matsumoto) 2001/04/06

まつもと ゆきひろです

[#12790] Re: NameError (Re: [ruby-list:29101] Re: nil.to_f) — "K.Kosako" <kosako@...> 2001/04/06

Yukihiro Matsumotoさんの

[#12792] Re: NameError (Re: [ruby-list:29101] Re: nil.to_f) — matz@... (Yukihiro Matsumoto) 2001/04/06

まつもと ゆきひろです

[#12838] Re: NameError (Re: [ruby-list:29101] Re: nil.to_f) — "K.Kosako" <kosako@...> 2001/04/10

Yukihiro Matsumotoさんの

[#12795] recursive malloc / fork deadlock / thread deadlock — "Akinori MUSHA" <knu@...>

 添付のスクリプトで、いくつかのプラットフォームで問題が発生する

43 messages 2001/04/07
[#12799] Re: recursive malloc / fork deadlock / thread deadlock — matz@... (Yukihiro Matsumoto) 2001/04/07

まつもと ゆきひろです

[#12801] Re: recursive malloc / fork deadlock / thread deadlock — nobu.nakada@... 2001/04/08

なかだです。

[#12802] Re: recursive malloc / fork deadlock / thread deadlock — matz@... (Yukihiro Matsumoto) 2001/04/09

まつもと ゆきひろです

[#12822] Re: recursive malloc / fork deadlock / thread deadlock — nobu.nakada@... 2001/04/09

なかだです。

[#12827] Re: recursive malloc / fork deadlock / thread deadlock — matz@... (Yukihiro Matsumoto) 2001/04/09

まつもと ゆきひろです

[#12836] Re: recursive malloc / fork deadlock / thread deadlock — nobu.nakada@... 2001/04/10

なかだです。

[#12840] Re: recursive malloc / fork deadlock / thread deadlock — matz@... (Yukihiro Matsumoto) 2001/04/10

まつもと ゆきひろです

[#12852] Re: recursive malloc / fork deadlock / thread deadlock — nobu.nakada@... 2001/04/10

なかだです。

[#12854] Re: recursive malloc / fork deadlock / thread deadlock — matz@... (Yukihiro Matsumoto) 2001/04/10

まつもと ゆきひろです

[#12857] Re: recursive malloc / fork deadlock / thread deadlock — nobu.nakada@... 2001/04/10

なかだです。

[#12859] Re: recursive malloc / fork deadlock / thread deadlock — matz@... (Yukihiro Matsumoto) 2001/04/10

まつもと ゆきひろです

[#12862] Re: recursive malloc / fork deadlock / thread deadlock — GOTOU Yuuzou <gotoyuzo@...> 2001/04/10

ごとうゆうぞうです。

[#12866] Re: recursive malloc / fork deadlock / thread deadlock — matz@... (Yukihiro Matsumoto) 2001/04/10

まつもと ゆきひろです

[#12878] Re: recursive malloc / fork deadlock / thread deadlock — GOTOU Yuuzou <gotoyuzo@...> 2001/04/11

ごとうゆうぞうです。

[#12888] Re: recursive malloc / fork deadlock / thread deadlock — GOTOU Yuuzou <gotoyuzo@...> 2001/04/11

ごとうゆうぞうです。

[#12892] Re: recursive malloc / fork deadlock / thread deadlock — Takahiro Kambe <taca@...> 2001/04/12

完全に理解せずに書いています。

[#12895] Re: recursive malloc / fork deadlock / thread deadlock — Jun Adachi <adachi@...> 2001/04/12

安達@沖データと申します。

[#12898] Re: recursive malloc / fork deadlock / thread deadlock — GOTOU Yuuzou <gotoyuzo@...> 2001/04/12

ごとうゆうぞうです。

[#12830] 1.6.4 preview — "Akinori MUSHA" <knu@...>

 そろそろ FreeBSD 4.3-RELEASE 前の ports のフリーズが迫っている

23 messages 2001/04/09
[#12844] Re: 1.6.4 preview — matz@... (Yukihiro Matsumoto) 2001/04/10

まつもと ゆきひろです

[#12921] ObjectSpace.each_object(Symbol) — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

23 messages 2001/04/13
[#12923] Re: ObjectSpace.each_object(Symbol) — matz@... (Yukihiro Matsumoto) 2001/04/13

まつもと ゆきひろです

[#12928] Re: ObjectSpace.each_object(Symbol) — Hisayasu Nakao <h-nakao@...> 2001/04/13

中尾@富士通です。

[#12929] Re: ObjectSpace.each_object(Symbol) — matz@... (Yukihiro Matsumoto) 2001/04/13

まつもと ゆきひろです

[#12934] Re: ObjectSpace.each_object(Symbol) — keiju@... (石塚圭樹) 2001/04/13

けいじゅ@日本ラショナルソフトウェアです.

[#12941] Re: ObjectSpace.each_object(Symbol) — matz@... (Yukihiro Matsumoto) 2001/04/13

まつもと ゆきひろです

[ruby-dev:12949] case-insensitive String comparison

From: nobu.nakada@...
Date: 2001-04-14 12:46:45 UTC
List: ruby-dev #12949
なかだです。

  $= がいまいち使いづらいし、たしか非推奨という話もあったような
気がするので、文字ケースを区別しない String というのはどうかな
と思って拡張ライブラリを試してみました。がやっぱり、比較の順序
で結果が違うとか Hash でうまくいかないとかあるので、パッチにし
てみました。まぁこれでもうまくいったりいかなかったりですが。

  "X".insensitive == "x"	# => true

  a = {"x".insensitive => 1}
  a["X"]			# => 1

  a = {"X".insensitive => 1}
  a["x"]			# => nil
  a["x".insensitive]		# => 1


Index: intern.h
===================================================================
RCS file: /cvs/ruby/src/ruby/intern.h,v
retrieving revision 1.45
diff -u -2 -p -r1.45 intern.h
--- intern.h	2001/03/28 08:43:24	1.45
+++ intern.h	2001/04/14 11:35:16
@@ -269,4 +269,5 @@ VALUE rb_length_by_each _((VALUE));
 /* re.c */
 int rb_memcmp _((char*,char*,long));
+int rb_memcasecmp _((char*,char*,long));
 VALUE rb_reg_nth_defined _((int, VALUE));
 VALUE rb_reg_nth_match _((int, VALUE));
@@ -330,4 +331,7 @@ void rb_str_associate _((VALUE, VALUE));
 VALUE rb_str_associated _((VALUE));
 void rb_str_setter _((VALUE, ID, VALUE*));
+VALUE rb_str_insensitive _((VALUE));
+VALUE rb_str_ignorecase_p _((VALUE));
+VALUE rb_str_ignorecase _((VALUE, VALUE));
 /* struct.c */
 VALUE rb_struct_new __((VALUE, ...));
Index: re.c
===================================================================
RCS file: /cvs/ruby/src/ruby/re.c,v
retrieving revision 1.40
diff -u -2 -p -r1.40 re.c
--- re.c	2001/02/08 09:19:17	1.40
+++ re.c	2001/04/13 08:23:57
@@ -72,19 +72,27 @@ static const char casetable[] = {
 
 int
-rb_memcmp(p1, p2, len)
+rb_memcasecmp(p1, p2, len)
     char *p1, *p2;
     long len;
 {
-    int tmp;
+    while (len--) {
+	int tmp = casetable[(unsigned)*p1++] - casetable[(unsigned)*p2++];
+	if (tmp)
+	    return tmp;
+    }
+    return 0;
+}
 
+int
+rb_memcmp(p1, p2, len)
+    char *p1, *p2;
+    long len;
+{
     if (!ruby_ignorecase) {
 	return memcmp(p1, p2, len);
     }
-
-    while (len--) {
-	if (tmp = casetable[(unsigned)*p1++] - casetable[(unsigned)*p2++])
-	    return tmp;
+    else {
+	return rb_memcasecmp(p1, p2, len);
     }
-    return 0;
 }
 
Index: string.c
===================================================================
RCS file: /cvs/ruby/src/ruby/string.c,v
retrieving revision 1.61
diff -u -2 -p -r1.61 string.c
--- string.c	2001/03/26 08:57:10	1.61
+++ string.c	2001/04/14 11:16:56
@@ -30,4 +30,15 @@ VALUE rb_cString;
 #define STR_NO_ORIG FL_USER2
 
+#define FL_IGNORECASE FL_USER3
+typedef int (*strcmp_t)_((char*,char*,long));
+#define STR_IGNORECASE_P(s) FL_TEST(s, FL_IGNORECASE)
+#define STR_IGNORECASE(x, s) (RSTRING(x)->basic.flags |= (RSTRING(s)->basic.flags & FL_IGNORECASE))
+#define STR_IGNORECASE_SET(s) (RSTRING(s)->basic.flags |= FL_IGNORECASE)
+#define STR_IGNORECASE_UNSET(s) (RSTRING(s)->basic.flags &= ~FL_IGNORECASE)
+#define STR_COMPARE(str1,str2) (\
+    ((RSTRING(str1)->basic.flags | RSTRING(str2)->basic.flags) & FL_IGNORECASE) \
+	? rb_memcasecmp : rb_memcmp)
+
+
 VALUE rb_fs;
 
@@ -90,4 +101,5 @@ rb_str_new3(str)
     str2->orig = str;
     OBJ_INFECT(str2, str);
+    STR_IGNORECASE(str2, str);
 
     return (VALUE)str2;
@@ -114,4 +126,5 @@ rb_str_new4(orig)
 	    str = rb_str_new3(RSTRING(orig)->orig);
 	}
+	STR_IGNORECASE(str, orig);
 	OBJ_FREEZE(str);
 	RBASIC(str)->klass = klass;
@@ -127,4 +140,5 @@ rb_str_new4(orig)
 	str->orig = 0;
 	OBJ_INFECT(str, orig);
+	STR_IGNORECASE(str, orig);
 	OBJ_FREEZE(str);
 
@@ -158,5 +172,6 @@ rb_str_become(str, str2)
     RSTRING(str2)->ptr = 0;	/* abandon str2 */
     RSTRING(str2)->len = 0;
-    if (OBJ_TAINTED(str2)) OBJ_TAINT(str);
+    OBJ_INFECT(str2, str);
+    STR_IGNORECASE(str2, str);
 }
 
@@ -227,4 +242,5 @@ rb_str_dup(str)
     }
     OBJ_INFECT(str2, str);
+    STR_IGNORECASE(str2, str);
     RBASIC(str2)->klass = klass;
     return str2;
@@ -315,7 +331,6 @@ rb_str_times(str, times)
     RSTRING(str2)->ptr[RSTRING(str2)->len] = '\0';
 
-    if (OBJ_TAINTED(str)) {
-	OBJ_TAINT(str2);
-    }
+    OBJ_INFECT(str2, str);
+    STR_IGNORECASE(str, str2);
 
     return str2;
@@ -494,4 +509,39 @@ rb_str_concat(str1, str2)
 }
 
+VALUE
+rb_str_insensitive(orig)
+    VALUE orig;
+{
+    VALUE str = rb_str_dup(orig);
+    STR_IGNORECASE_SET(str);
+    return str;
+}
+
+VALUE
+rb_str_ignorecase_p(str)
+    VALUE str;
+{
+    if (STR_IGNORECASE_P(str)) {
+	return Qtrue;
+    }
+    else {
+	return Qfalse;
+    }
+}
+
+VALUE
+rb_str_ignorecase(str, val)
+    VALUE str, val;
+{
+    if (RTEST(val)) {
+	STR_IGNORECASE_SET(str);
+	return Qtrue;
+    }
+    else {
+	STR_IGNORECASE_UNSET(str);
+	return Qfalse;
+    }
+}
+
 int
 rb_str_hash(str)
@@ -512,5 +562,5 @@ rb_str_hash(str)
     }
 #elif HASH_PERL
-    if (ruby_ignorecase) {
+    if (FL_TEST(str, STR_IGNORECASE) || ruby_ignorecase) {
 	while (len--) {
 	    key = key*33 + toupper(*p);
@@ -525,5 +575,5 @@ rb_str_hash(str)
     key = key + (key>>5);
 #else
-    if (ruby_ignorecase) {
+    if (STR_IGNORECASE_P(str) || ruby_ignorecase) {
 	while (len--) {
 	    key = key*65599 + toupper(*p);
@@ -560,5 +610,5 @@ rb_str_cmp(str1, str2)
 
     len = lesser(RSTRING(str1)->len, RSTRING(str2)->len);
-    retval = rb_memcmp(RSTRING(str1)->ptr, RSTRING(str2)->ptr, len);
+    retval = (*STR_COMPARE(str1, str2))(RSTRING(str1)->ptr, RSTRING(str2)->ptr, len);
     if (retval == 0) {
 	if (RSTRING(str1)->len == RSTRING(str2)->len) return 0;
@@ -634,4 +684,5 @@ rb_str_index(str, sub, offset)
     char *s, *e, *p;
     long len;
+    strcmp_t cmp;
 
     if (offset < 0) {
@@ -645,6 +696,7 @@ rb_str_index(str, sub, offset)
     if (len == 0) return offset;
     e = RSTRING(str)->ptr + RSTRING(str)->len - len + 1;
+    cmp = STR_COMPARE(str, sub);
     while (s < e) {
-	if (rb_memcmp(s, p, len) == 0) {
+	if ((*cmp)(s, p, len) == 0) {
 	    return (s-(RSTRING(str)->ptr));
 	}
@@ -749,6 +801,7 @@ rb_str_rindex(argc, argv, str)
 	t = RSTRING(sub)->ptr;
 	if (len) {
+	    strcmp_t cmp = STR_COMPARE(str, sub);
 	    while (sbeg <= s) {
-		if (rb_memcmp(s, t, len) == 0) {
+		if ((*cmp)(s, t, len) == 0) {
 		    return INT2NUM(s - RSTRING(str)->ptr);
 		}
@@ -817,4 +870,5 @@ rb_str_succ(orig)
     str = rb_str_new(RSTRING(orig)->ptr, RSTRING(orig)->len);
     OBJ_INFECT(str, orig);
+    STR_IGNORECASE(str, orig);
     if (RSTRING(str)->len == 0) return str;
 
@@ -1295,4 +1349,5 @@ str_gsub(argc, argv, str, bang)
 	NEWOBJ(dup, struct RString);
 	OBJSETUP(dup, rb_cString, T_STRING);
+	STR_IGNORECASE(dup, str);
 	OBJ_INFECT(dup, str);
 	str = (VALUE)dup;
@@ -2311,4 +2366,5 @@ rb_str_each_line(argc, argv, str)
     long len = RSTRING(str)->len;
     VALUE line;
+    strcmp_t cmp;
 
     if (rb_scan_args(argc, argv, "01", &rs) == 0) {
@@ -2332,4 +2388,5 @@ rb_str_each_line(argc, argv, str)
     }
 
+    cmp = STR_COMPARE(str, rs);
     for (s = p, p += rslen; p < pend; p++) {
 	if (rslen == 0 && *p == '\n') {
@@ -2339,6 +2396,8 @@ rb_str_each_line(argc, argv, str)
 	if (p[-1] == newline &&
 	    (rslen <= 1 ||
-	     rb_memcmp(RSTRING(rs)->ptr, p-rslen, rslen) == 0)) {
+	     (*cmp)(RSTRING(rs)->ptr, p-rslen, rslen) == 0)) {
 	    line = rb_str_new(s, p - s);
+	    STR_IGNORECASE(line, str);
+	    OBJ_INFECT(line, str);
 	    rb_yield(line);
 	    if (RSTRING(str)->ptr != ptr || RSTRING(str)->len != len)
@@ -2351,4 +2410,5 @@ rb_str_each_line(argc, argv, str)
         if (p > pend) p = pend;
 	line = rb_str_new(s, p - s);
+	STR_IGNORECASE(line, str);
 	OBJ_INFECT(line, str);
 	rb_yield(line);
@@ -2429,4 +2489,5 @@ rb_str_chomp_bang(argc, argv, str)
     char *p = RSTRING(str)->ptr;
     long len = RSTRING(str)->len;
+    strcmp_t cmp;
 
     if (rb_scan_args(argc, argv, "01", &rs) == 0) {
@@ -2452,7 +2513,8 @@ rb_str_chomp_bang(argc, argv, str)
     newline = RSTRING(rs)->ptr[rslen-1];
 
+    cmp = STR_COMPARE(str, rs);
     if (p[len-1] == newline &&
 	(rslen <= 1 ||
-	 rb_memcmp(RSTRING(rs)->ptr, p+len-rslen, rslen) == 0)) {
+	 (*cmp)(RSTRING(rs)->ptr, p+len-rslen, rslen) == 0)) {
 	rb_str_modify(str);
 	RSTRING(str)->len -= rslen;
@@ -2800,4 +2862,8 @@ Init_String()
     rb_define_method(rb_cString, "eql?", rb_str_equal, 1);
     rb_define_method(rb_cString, "hash", rb_str_hash_m, 0);
+    rb_define_method(rb_cString, "ignorecase?", rb_str_ignorecase_p, 0);
+    rb_define_method(rb_cString, "ignorecase", rb_str_ignorecase_p, 0);
+    rb_define_method(rb_cString, "ignorecase=", rb_str_ignorecase, 1);
+    rb_define_method(rb_cString, "insensitive", rb_str_insensitive, 0);
     rb_define_method(rb_cString, "+", rb_str_plus, 1);
     rb_define_method(rb_cString, "*", rb_str_times, 1);


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread

Prev Next