[#12715] [BUG] Process::Status — Koji Arai <JCA02266@...>
新井です。
新井です。
新井です。
まつもと ゆきひろです
まつもと ゆきひろです
新井です。
[#12753] Named Array Ref — " たけ (tk)" <ggb03124@...>
名前付きに配列参照というのは出来ませんでしょうか?。
[#12763] NameError (Re: [ruby-list:29101] Re: nil.to_f) — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
Yukihiro Matsumotoさんの
まつもと ゆきひろです
Yukihiro Matsumotoさんの
まつもと ゆきひろです
Yukihiro Matsumotoさんの
まつもと ゆきひろです
Yukihiro Matsumotoさんの
まつもと ゆきひろです
あおきです。
前田です。
まつもと ゆきひろです
[#12766] String#scan — IWAMURO Motonori <iwa@...>
岩室です。
[#12776] rb_obj_is_instance_of — "K.Kosako" <kosako@...>
nilにinstance_of?を行った結果が、
[#12795] recursive malloc / fork deadlock / thread deadlock — "Akinori MUSHA" <knu@...>
添付のスクリプトで、いくつかのプラットフォームで問題が発生する
まつもと ゆきひろです
なかだです。
まつもと ゆきひろです
なかだです。
まつもと ゆきひろです
なかだです。
まつもと ゆきひろです
なかだです。
まつもと ゆきひろです
なかだです。
まつもと ゆきひろです
ごとうゆうぞうです。
まつもと ゆきひろです
ごとうゆうぞうです。
ごとうゆうぞうです。
完全に理解せずに書いています。
安達@沖データと申します。
ごとうゆうぞうです。
In message <20010412151116K.gotoyuzo@does.notwork.org>
安達@沖データです。
ごとうゆうぞうです。
ごとうゆうぞうです。
At Mon, 16 Apr 2001 02:07:52 +0900,
In <867l0w29np.wl@archon.local.idaemons.org>
まつもと ゆきひろです
わたなべです。
新井です。
なかだです。
[#12803] File::Stat.new — Shugo Maeda <shugo@...>
前田です。
[#12810] comflict xmalloc ruby1.6.3 and readline on MacOS X — "SHIROYAMA Takayuki -" <psi@...>
[#12814] Tempfile — keiju@... (Keiju ISHITSUKA)
けいじゅ@日本ラショナルソフトウェアです.
[#12830] 1.6.4 preview — "Akinori MUSHA" <knu@...>
そろそろ FreeBSD 4.3-RELEASE 前の ports のフリーズが迫っている
まつもと ゆきひろです
もりきゅうです。
[#12853] jcode.rb and user defined charachter — TAKAHASHI Masayoshi <maki@...>
高橋征義です。
[#12882] File::stat.size — WATANABE Tetsuya <tetsu@...>
渡辺哲也です。
[#12885] cvs acount [Re: new irb version 0.7.1-beta] — keiju@... (石塚圭樹)
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
[#12887] parse error in rt/rtparser.rb — Kazuhiro NISHIYAMA <zn@...>
直接 ./filter/rt.rb を実行したときは大丈夫なのに、
[#12921] ObjectSpace.each_object(Symbol) — keiju@... (Keiju ISHITSUKA)
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
中尾@富士通です。
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
[#12936] finalizer で print されない — Kazuhiro NISHIYAMA <zn@...>
何故か proc に || をつけていると print されません。
In <20010413221154.5B81.ZN@mbf.nifty.com>
まつもと ゆきひろです
In <987175210.094330.13000.nullmailer@ev.netlab.zetabits.com>
[#12946] ruby 1.6.4 cannot build on emx — HGF01572@...
長沢です。
[#12949] case-insensitive String comparison — nobu.nakada@...
なかだです。
まつもと ゆきひろです
[#12993] regex.c emits a false error? — "Akinori MUSHA" <knu@...>
1.6.4 preview2 で、 /[\da-f]/ が
[#13014] rubicon failed with ruby1.6.4-preview2 on alpha — akira yamada / やまだあきら <akira@...>
[#13017] pack template "P" — nobu.nakada@...
なかだです。
[#13021] Re: [rubyist:0523] Re:Re:finalizer での例外 — Koji Arai <JCA02266@...>
新井です。
[#13025] enhancing dir_config() — "Akinori MUSHA" <knu@...>
dir_config() をちょっと改良してみました。
[#13053] [bug?] CGI::Session::MemoryStore (ruby-1.6.x, ruby-1.7.x) — akira yamada / やまだあきら <akira@...>
[#13055] Config::MAKEFILE_CONFIG — nobu.nakada@...
なかだです。
[#13057] Re: [bug?] cgi/session.rb (ruby-1.6.x, ruby-1.7.x) (PR#44) — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
[#13071] irb-0.7.3 & irb-tools-0.7.1 imported and merged — "Akinori MUSHA" <knu@...>
irb-0.7.3 と irb-tools-0.7.1 をインポートし、 HEAD と ruby_1_6 に
けいじゅ@日本ラショナルソフトウェアです.
At Fri, 4 May 2001 04:07:44 +0900,
[ruby-dev:12949] case-insensitive String comparison
なかだです。
$= がいまいち使いづらいし、たしか非推奨という話もあったような
気がするので、文字ケースを区別しない 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はできる。
中田 伸悦