[#15846] Ruby M17N request — "K.Kosako" <kosako@...>

今書いているライブラリを、あらかじめRuby M17Nに対応させておこうとして、

62 messages 2002/02/04
[#15847] Re: Ruby M17N request — matz@... (Yukihiro Matsumoto) 2002/02/04

まつもと ゆきひろです

[#15854] Re: Ruby M17N request — "K.Kosako" <kosako@...> 2002/02/05

Yukihiro Matsumotoさんの<1012831868.125952.28017.nullmailer@ev.netlab.jp>から

[#16070] Re: Ruby M17N request — "K.Kosako" <kosako@...> 2002/02/25

<20020205045749.0AAA015B@helium.ruby-lang.org>から

[#16072] Re: Ruby M17N request — "Akinori MUSHA" <knu@...> 2002/02/25

At Mon, 25 Feb 2002 19:57:05 +0900,

[#16073] Re: Ruby M17N request — "Akinori MUSHA" <knu@...> 2002/02/25

At Mon, 25 Feb 2002 21:00:46 +0900,

[#16173] Re: Ruby M17N request — "Akinori MUSHA" <knu@...> 2002/03/02

At Mon, 25 Feb 2002 19:57:05 +0900,

[#16196] Oni Guruma imported into our repository — "Akinori MUSHA" <knu@...> 2002/03/04

At Sun, 3 Mar 2002 07:15:40 +0900,

[#16275] Re: Oni Guruma imported into our repository — matz@... (Yukihiro Matsumoto) 2002/03/08

まつもと ゆきひろです

[#16222] Re: Oni Guruma(Re: Ruby M17N request) — nobu.nakada@... 2002/03/05

なかだです。

[#16228] Re: Oni Guruma(Re: Ruby M17N request) — "K.Kosako" <kosako@...> 2002/03/06

nobu.nakada@nifty.ne.jpさんの

[#16237] Re: Oni Guruma(Re: Ruby M17N request) — nobu.nakada@... 2002/03/06

なかだです。

[#16241] Re: Oni Guruma(Re: Ruby M17N request) — "K.Kosako" <kosako@...> 2002/03/07

nobu.nakada@nifty.ne.jpさんの

[#16242] Re: Oni Guruma(Re: Ruby M17N request) — nobu.nakada@... 2002/03/07

なかだです。

[#16442] Re: Oni Guruma(Re: Ruby M17N request) — nobu.nakada@... 2002/03/17

なかだです。

[#15867] [BUG?] include after module definition and extend module — keiju@... (Keiju ISHITSUKA)

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

15 messages 2002/02/08
[#15869] Re: [BUG?] include after module definition and extend module — matz@... (Yukihiro Matsumoto) 2002/02/08

まつもと ゆきひろです

[#15932] Re: [BUG?] include after module definition and extend module — keiju@... (石塚圭樹) 2002/02/18

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

[#15938] Re: [BUG?] include after module definition and extend module — matz@... (Yukihiro Matsumoto) 2002/02/18

まつもと ゆきひろです

[#15914] making net/*.rb grok URI — "Akinori MUSHA" <knu@...>

 net/*.rb モジュール群をぜひとも標準添付となった URI クラスに

30 messages 2002/02/17
[#15915] Re: making net/*.rb grok URI — "Akinori MUSHA" <knu@...> 2002/02/17

At Mon, 18 Feb 2002 04:33:42 +0900,

[#15931] Re: making net/*.rb grok URI — Minero Aoki <aamine@...> 2002/02/18

あおきです。

[#15934] Re: making net/*.rb grok URI — "Akinori MUSHA" <knu@...> 2002/02/18

At Mon, 18 Feb 2002 15:24:22 +0900,

[#15937] Re: making net/*.rb grok URI — Minero Aoki <aamine@...> 2002/02/18

あおきです。

[#15958] Re: making net/*.rb grok URI — TAKAHASHI Masayoshi <maki@...> 2002/02/19

高橋征義です。

[#15978] Re: making net/*.rb grok URI — Tanaka Akira <akr@...17n.org> 2002/02/19

In article <200202190432.NAA18796@mx.inac.co.jp>,

[#16002] Re: making net/*.rb grok URI — TAKAHASHI Masayoshi <maki@...> 2002/02/20

高橋征義です。

[#16013] Re: making net/*.rb grok URI — Tanaka Akira <akr@...17n.org> 2002/02/20

In article <20020221020159R.maki@rubycolor.org>,

[#15988] Re: [rubyist:1097] Re: % 記法 — nobu.nakada@...

なかだです。

21 messages 2002/02/20
[#17594] Re: [rubyist:1097] Re: % 記法 — nobu.nakada@... 2002/06/26

なかだです。

[#16049] defined? autoload constant — Kazuhiro NISHIYAMA <zn@...>

西山和広です。

35 messages 2002/02/24
[#16058] Re: defined? autoload constant — matz@... (Yukihiro Matsumoto) 2002/02/25

まつもと ゆきひろです

[#16298] Re: defined? autoload constant — nobu.nakada@... 2002/03/09

なかだです。

[#16304] Re: defined? autoload constant — matz@... (Yukihiro Matsumoto) 2002/03/09

まつもと ゆきひろです

[#16375] Re: defined? autoload constant — keiju@... (石塚圭樹) 2002/03/14

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

[#16380] Re: defined? autoload constant — nobu.nakada@... 2002/03/14

なかだです。

[#16398] Re: defined? autoload constant — keiju@... (石塚圭樹) 2002/03/14

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

[#16399] Re: defined? autoload constant — nobu.nakada@... 2002/03/14

なかだです。

[#16400] Re: defined? autoload constant — keiju@... (石塚圭樹) 2002/03/14

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

[#16403] Re: defined? autoload constant — matz@... (Yukihiro Matsumoto) 2002/03/14

まつもと ゆきひろです

[#16407] Re: defined? autoload constant — nobu.nakada@... 2002/03/15

なかだです。

[#16409] Re: defined? autoload constant — matz@... (Yukihiro Matsumoto) 2002/03/15

まつもと ゆきひろです

[#16481] Re: defined? autoload constant — keiju@... (石塚圭樹) 2002/03/19

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

[#16482] Re: defined? autoload constant — matz@... (Yukihiro Matsumoto) 2002/03/19

まつもと ゆきひろです

[#16082] Array#select without block — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

14 messages 2002/02/25

[#16102] No trace_func event at if-elsif-else line — "NAKAMURA, Hiroshi" <nakahiro@...>

なひです。

21 messages 2002/02/26
[#16103] Re: No trace_func event at if-elsif-else line — matz@... (Yukihiro Matsumoto) 2002/02/26

まつもと ゆきひろです

[#16109] Re: No trace_func event at if-elsif-else line — "NAKAMURA, Hiroshi" <nakahiro@...> 2002/02/26

なひです。

[#16110] Re: No trace_func event at if-elsif-else line — matz@... (Yukihiro Matsumoto) 2002/02/26

まつもと ゆきひろです

[#16117] Re: No trace_func event at if-elsif-else line — "NAKAMURA, Hiroshi" <nakahiro@...> 2002/02/26

なひです。

[#16127] Re: No trace_func event at if-elsif-else line — matz@... (Yukihiro Matsumoto) 2002/02/26

まつもと ゆきひろです

[#16133] Re: No trace_func event at if-elsif-else line — "NAKAMURA, Hiroshi" <nakahiro@...> 2002/02/27

なひです。

[#16135] Re: No trace_func event at if-elsif-else line — matz@... (Yukihiro Matsumoto) 2002/02/27

まつもと ゆきひろです

[#16256] Rite debug API (was Re: No trace_func event at if-elsif-else line) — "NAKAMURA, Hiroshi" <nakahiro@...> 2002/03/07

なひです。どうせ一年も先の話なのでのんびりと。

[#16258] Re: Rite debug API (was Re: No trace_func event at if-elsif-else line) — matz@... (Yukihiro Matsumoto) 2002/03/07

まつもと ゆきひろです

[#16134] Defining (Python) Source Code Encoding — TAKAHASHI Masayoshi <maki@...>

高橋征義です。ruby-list の「localized document」ともやや関係あり?

13 messages 2002/02/27

[ruby-dev:16126] patch for gdbm, dbm and sdbm

From: Koji Arai <JCA02266@...>
Date: 2002-02-26 18:02:26 UTC
List: ruby-dev #16126
新井です。

gdbm, dbm, sdbm のパッチを書きました。(1.7 のみ。1.6 は無視)
変更点は、
  o sdbm にも SDBMError クラスを追加
  o closed_dbm/gdbm/sdbm も [SG]?DBMError に
  o 比較のために関数の記述順をそろえた(dbm_close とかの位置)
  o select メソッドを 1.7 仕様にした。
  o SDBM, DBM の delete を Hash 互換に(GDBM は既にそうしていた)
  o [GS]?DBM#delete のテストを修正
  o gdbm のイテレータでキーを dup してブロックの引数に渡しているが
    必要ない気がするのではずした(私が昔そうしたような気もする)。

余計な修正もしているのでパッチがちょっとでかいです。すみません。
# ChangeLog もなしです。重ね重ねすみません。

--
新井康司 (Koji Arai)


Index: ext/dbm/dbm.c
===================================================================
RCS file: /usr/local/cvsup/ruby/ruby/ext/dbm/dbm.c,v
retrieving revision 1.17
diff -u -p -u -r1.17 dbm.c
--- ext/dbm/dbm.c	24 May 2001 06:10:36 -0000	1.17
+++ ext/dbm/dbm.c	26 Feb 2002 17:25:11 -0000
@@ -32,7 +32,7 @@ struct dbmdata {
 static void
 closed_dbm()
 {
-    rb_raise(rb_eRuntimeError, "closed DBM file");
+    rb_raise(rb_eDBMError, "closed DBM file");
 }
 
 #define GetDBM(obj, dbmp) {\
@@ -51,7 +51,18 @@ free_dbm(dbmp)
     }
 }
 
-static VALUE fdbm_close _((VALUE));
+static VALUE
+fdbm_close(obj)
+    VALUE obj;
+{
+    struct dbmdata *dbmp;
+
+    GetDBM(obj, dbmp);
+    dbm_close(dbmp->di_dbm);
+    dbmp->di_dbm = 0;
+
+    return Qnil;
+}
 
 static VALUE
 fdbm_s_new(argc, argv, klass)
@@ -130,19 +141,6 @@ fdbm_s_open(argc, argv, klass)
 }
 
 static VALUE
-fdbm_close(obj)
-    VALUE obj;
-{
-    struct dbmdata *dbmp;
-
-    GetDBM(obj, dbmp);
-    dbm_close(dbmp->di_dbm);
-    dbmp->di_dbm = 0;
-
-    return Qnil;
-}
-
-static VALUE
 fdbm_fetch(obj, keystr, ifnone)
     VALUE obj, keystr, ifnone;
 {
@@ -230,12 +228,52 @@ fdbm_indexes(argc, argv, obj)
 }
 
 static VALUE
+fdbm_select(argc, argv, obj)
+    int argc;
+    VALUE *argv;
+    VALUE obj;
+{
+    VALUE new = rb_ary_new2(argc);
+    int i;
+
+    if (rb_block_given_p()) {
+        datum key, val;
+        DBM *dbm;
+        struct dbmdata *dbmp;
+        VALUE keystr, valstr;
+
+	if (argc > 0) {
+	    rb_raise(rb_eArgError, "wrong number arguments(%d for 0)", argc);
+	}
+        GetDBM(obj, dbmp);
+        dbm = dbmp->di_dbm;
+
+        for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) {
+            VALUE assoc;
+            val = dbm_fetch(dbm, key);
+            assoc = rb_assoc_new(rb_tainted_str_new(key.dptr, key.dsize),
+                                 rb_tainted_str_new(val.dptr, val.dsize));
+            if (RTEST(rb_yield(assoc)))
+                rb_ary_push(new, assoc);
+        }
+    }
+    else {
+        for (i=0; i<argc; i++) {
+            rb_ary_push(new, fdbm_fetch(obj, argv[i]));
+        }
+    }
+
+    return new;
+}
+
+static VALUE
 fdbm_delete(obj, keystr)
     VALUE obj, keystr;
 {
     datum key, value;
     struct dbmdata *dbmp;
     DBM *dbm;
+    VALUE valstr;
 
     rb_secure(4);
     StringValue(keystr);
@@ -247,10 +285,13 @@ fdbm_delete(obj, keystr)
 
     value = dbm_fetch(dbm, key);
     if (value.dptr == 0) {
-	if (rb_block_given_p()) rb_yield(keystr);
+	if (rb_block_given_p()) return rb_yield(keystr);
 	return Qnil;
     }
 
+    /* need to save value before dbm_delete() */
+    valstr = rb_tainted_str_new(value.dptr, value.dsize);
+
     if (dbm_delete(dbm, key)) {
 	dbmp->di_size = -1;
 	rb_raise(rb_eDBMError, "dbm_delete failed");
@@ -258,7 +299,7 @@ fdbm_delete(obj, keystr)
     else if (dbmp->di_size >= 0) {
 	dbmp->di_size--;
     }
-    return obj;
+    return valstr;
 }
 
 static VALUE
@@ -691,6 +732,7 @@ Init_dbm()
     rb_define_method(rb_cDBM, "index",  fdbm_index, 1);
     rb_define_method(rb_cDBM, "indexes",  fdbm_indexes, -1);
     rb_define_method(rb_cDBM, "indices",  fdbm_indexes, -1);
+    rb_define_method(rb_cDBM, "select",  fdbm_select, -1);
     rb_define_method(rb_cDBM, "length", fdbm_length, 0);
     rb_define_method(rb_cDBM, "size", fdbm_length, 0);
     rb_define_method(rb_cDBM, "empty?", fdbm_empty_p, 0);
Index: ext/dbm/testdbm.rb
===================================================================
RCS file: /usr/local/cvsup/ruby/ruby/ext/dbm/testdbm.rb,v
retrieving revision 1.1
diff -u -p -u -r1.1 testdbm.rb
--- ext/dbm/testdbm.rb	6 May 2001 15:02:36 -0000	1.1
+++ ext/dbm/testdbm.rb	26 Feb 2002 17:17:14 -0000
@@ -165,7 +165,7 @@ class TestDBM < RUNIT::TestCase
     assert_nil(dbm.close)
 
     # closed DBM file
-    assert_exception(RuntimeError) { dbm.close }
+    assert_exception(DBMError) { dbm.close }
   end
 
   def test_aref
@@ -245,6 +245,25 @@ class TestDBM < RUNIT::TestCase
     assert_equals(values.reverse, @dbm.indexes(*keys.reverse))
   end
 
+  def test_select
+    keys = %w(foo bar baz)
+    values = %w(FOO BAR BAZ)
+    @dbm[keys[0]], @dbm[keys[1]], @dbm[keys[2]] = values
+    assert_equals(values.reverse, @dbm.select(*keys.reverse))
+  end
+
+  def test_select_with_block
+    keys = %w(foo bar baz)
+    values = %w(FOO BAR BAZ)
+    @dbm[keys[0]], @dbm[keys[1]], @dbm[keys[2]] = values
+    ret = @dbm.select {|k,v|
+      assert_equals(k.upcase, v)
+      k != "bar"
+    }
+    assert_equals([['baz', 'BAZ'], ['foo', 'FOO']],
+		  ret.sort)
+  end
+
   def test_length
     num = 10
     assert_equals(0, @dbm.size)
@@ -377,7 +396,7 @@ class TestDBM < RUNIT::TestCase
 
     @dbm[keys[0]], @dbm[keys[1]], @dbm[keys[2]] = values
 
-    assert_equals(@dbm, @dbm.delete(key))
+    assert_equals('BAR', @dbm.delete(key))
     assert_nil(@dbm[key])
     assert_equals(2, @dbm.size)
 
@@ -394,12 +413,13 @@ class TestDBM < RUNIT::TestCase
   def test_delete_with_block
     key = 'no called block'
     @dbm[key] = 'foo'
-    assert_equals(@dbm, @dbm.delete(key) {|k| k.replace 'called block'})
+    assert_equals('foo', @dbm.delete(key) {|k| k.replace 'called block'})
     assert_equals('no called block', key)
     assert_equals(0, @dbm.size)
 
     key = 'no called block'
-    assert_nil(@dbm.delete(key) {|k| k.replace 'called block'})
+    assert_equals(:blockval,
+		  @dbm.delete(key) {|k| k.replace 'called block'; :blockval})
     assert_equals('called block', key)
     assert_equals(0, @dbm.size)
   end
Index: ext/gdbm/gdbm.c
===================================================================
RCS file: /usr/local/cvsup/ruby/ruby/ext/gdbm/gdbm.c,v
retrieving revision 1.21
diff -u -p -u -r1.21 gdbm.c
--- ext/gdbm/gdbm.c	13 Dec 2001 08:19:09 -0000	1.21
+++ ext/gdbm/gdbm.c	24 Feb 2002 20:04:14 -0000
@@ -14,11 +14,11 @@
 #include <fcntl.h>
 #include <errno.h>
 
-static VALUE cGDBM, rb_eGDBMError, rb_eGDBMFatalError;
+static VALUE rb_cGDBM, rb_eGDBMError, rb_eGDBMFatalError;
 
 #define MY_BLOCK_SIZE (2048)
 #define MY_FATAL_FUNC rb_gdbm_fatal
-void
+static void
 rb_gdbm_fatal(msg)
     char *msg;
 {
@@ -52,7 +52,18 @@ free_dbm(dbmp)
     }
 }
 
-static VALUE fgdbm_close _((VALUE));
+static VALUE
+fgdbm_close(obj)
+    VALUE obj;
+{
+    struct dbmdata *dbmp;
+
+    GetDBM(obj, dbmp);
+    gdbm_close(dbmp->di_dbm);
+    dbmp->di_dbm = 0;
+
+    return Qnil;
+}
 
 static VALUE
 fgdbm_s_new(argc, argv, klass)
@@ -141,19 +152,6 @@ fgdbm_s_open(argc, argv, klass)
 }
 
 static VALUE
-fgdbm_close(obj)
-    VALUE obj;
-{
-    struct dbmdata *dbmp;
-
-    GetDBM(obj, dbmp);
-    gdbm_close(dbmp->di_dbm);
-    dbmp->di_dbm = 0;
-
-    return Qnil;
-}
-
-static VALUE
 rb_gdbm_fetch(dbm, key)
     GDBM_FILE dbm;
     datum key;
@@ -219,7 +217,7 @@ rb_gdbm_firstkey(dbm)
     RSTRING(str)->ptr[RSTRING(str)->len] = '\0';
 
     OBJ_TAINT(str);
-    return (VALUE)str;
+    return str;
 }
 
 static VALUE
@@ -243,7 +241,7 @@ rb_gdbm_nextkey(dbm, keystr)
     RSTRING(str)->ptr[RSTRING(str)->len] = '\0';
 
     OBJ_TAINT(str);
-    return (VALUE)str;
+    return str;
 }
 
 static VALUE
@@ -327,6 +325,43 @@ fgdbm_indexes(argc, argv, obj)
 }
 
 static VALUE
+fgdbm_select(argc, argv, obj)
+    int argc;
+    VALUE *argv;
+    VALUE obj;
+{
+    VALUE new = rb_ary_new2(argc);
+    int i;
+
+    if (rb_block_given_p()) {
+        GDBM_FILE dbm;
+        struct dbmdata *dbmp;
+        VALUE keystr;
+
+	if (argc > 0) {
+	    rb_raise(rb_eArgError, "wrong number arguments(%d for 0)", argc);
+	}
+        GetDBM(obj, dbmp);
+        dbm = dbmp->di_dbm;
+
+        for (keystr = rb_gdbm_firstkey(dbm); RTEST(keystr);
+             keystr = rb_gdbm_nextkey(dbm, keystr)) {
+            VALUE assoc = rb_assoc_new(keystr, rb_gdbm_fetch2(dbm, keystr));
+
+            if (RTEST(rb_yield(assoc)))
+                rb_ary_push(new, assoc);
+        }
+    }
+    else {
+        for (i=0; i<argc; i++) {
+            rb_ary_push(new, rb_gdbm_fetch3(obj, argv[i]));
+        }
+    }
+
+    return new;
+}
+
+static VALUE
 rb_gdbm_delete(obj, keystr)
     VALUE obj, keystr;
 {
@@ -407,7 +442,7 @@ fgdbm_delete_if(obj)
          keystr = rb_gdbm_nextkey(dbm, keystr)) {
 
 	valstr = rb_gdbm_fetch2(dbm, keystr);
-        ret = rb_protect(rb_yield, rb_assoc_new(rb_str_dup(keystr), valstr), &status);
+        ret = rb_protect(rb_yield, rb_assoc_new(keystr, valstr), &status);
         if (status != 0) break;
 	if (RTEST(ret)) rb_ary_push(ary, keystr);
     }
@@ -625,7 +660,7 @@ fgdbm_each_key(obj)
     for (keystr = rb_gdbm_firstkey(dbm); RTEST(keystr);
          keystr = rb_gdbm_nextkey(dbm, keystr)) {
 
-        rb_yield(rb_str_dup(keystr));
+        rb_yield(keystr);
     }
     return obj;
 }
@@ -644,8 +679,7 @@ fgdbm_each_pair(obj)
     for (keystr = rb_gdbm_firstkey(dbm); RTEST(keystr);
          keystr = rb_gdbm_nextkey(dbm, keystr)) {
 
-        rb_yield(rb_assoc_new(rb_str_dup(keystr), 
-                              rb_gdbm_fetch2(dbm, keystr)));
+        rb_yield(rb_assoc_new(keystr, rb_gdbm_fetch2(dbm, keystr)));
     }
 
     return obj;
@@ -755,8 +789,7 @@ fgdbm_to_a(obj)
     for (keystr = rb_gdbm_firstkey(dbm); RTEST(keystr);
          keystr = rb_gdbm_nextkey(dbm, keystr)) {
 
-        rb_ary_push(ary, rb_assoc_new(rb_str_dup(keystr),
-                                      rb_gdbm_fetch2(dbm, keystr)));
+        rb_ary_push(ary, rb_assoc_new(keystr, rb_gdbm_fetch2(dbm, keystr)));
     }
 
     return ary;
@@ -886,75 +919,76 @@ fgdbm_reject(obj)
 void
 Init_gdbm()
 {
-    cGDBM = rb_define_class("GDBM", rb_cObject);
+    rb_cGDBM = rb_define_class("GDBM", rb_cObject);
     rb_eGDBMError = rb_define_class("GDBMError", rb_eStandardError);
     rb_eGDBMFatalError = rb_define_class("GDBMFatalError", rb_eException);
-    rb_include_module(cGDBM, rb_mEnumerable);
+    rb_include_module(rb_cGDBM, rb_mEnumerable);
 
-    rb_define_singleton_method(cGDBM, "new", fgdbm_s_new, -1);
-    rb_define_singleton_method(cGDBM, "open", fgdbm_s_open, -1);
+    rb_define_singleton_method(rb_cGDBM, "new", fgdbm_s_new, -1);
+    rb_define_singleton_method(rb_cGDBM, "open", fgdbm_s_open, -1);
 
-    rb_define_method(cGDBM, "initialize", fgdbm_initialize, -1);
-    rb_define_method(cGDBM, "close", fgdbm_close, 0);
-    rb_define_method(cGDBM, "[]", fgdbm_aref, 1);
-    rb_define_method(cGDBM, "fetch", fgdbm_fetch_m, -1);
-    rb_define_method(cGDBM, "[]=", fgdbm_store, 2);
-    rb_define_method(cGDBM, "store", fgdbm_store, 2);
-    rb_define_method(cGDBM, "index",  fgdbm_index, 1);
-    rb_define_method(cGDBM, "indexes",  fgdbm_indexes, -1);
-    rb_define_method(cGDBM, "indices",  fgdbm_indexes, -1);
-    rb_define_method(cGDBM, "length", fgdbm_length, 0);
-    rb_define_alias(cGDBM,  "size", "length");
-    rb_define_method(cGDBM, "empty?", fgdbm_empty_p, 0);
-    rb_define_method(cGDBM, "each", fgdbm_each_pair, 0);
-    rb_define_method(cGDBM, "each_value", fgdbm_each_value, 0);
-    rb_define_method(cGDBM, "each_key", fgdbm_each_key, 0);
-    rb_define_method(cGDBM, "each_pair", fgdbm_each_pair, 0);
-    rb_define_method(cGDBM, "keys", fgdbm_keys, 0);
-    rb_define_method(cGDBM, "values", fgdbm_values, 0);
-    rb_define_method(cGDBM, "shift", fgdbm_shift, 0);
-    rb_define_method(cGDBM, "delete", fgdbm_delete, 1);
-    rb_define_method(cGDBM, "delete_if", fgdbm_delete_if, 0);
-    rb_define_method(cGDBM, "reject!", fgdbm_delete_if, 0);
-    rb_define_method(cGDBM, "reject", fgdbm_reject, 0);
-    rb_define_method(cGDBM, "clear", fgdbm_clear, 0);
-    rb_define_method(cGDBM,"invert", fgdbm_invert, 0);
-    rb_define_method(cGDBM,"update", fgdbm_update, 1);
-    rb_define_method(cGDBM,"replace", fgdbm_replace, 1);
-    rb_define_method(cGDBM,"reorganize", fgdbm_reorganize, 0);
-    rb_define_method(cGDBM,"sync", fgdbm_sync, 0);
-    /* rb_define_method(cGDBM,"setopt", fgdbm_setopt, 2); */
-    rb_define_method(cGDBM,"cachesize=", fgdbm_set_cachesize, 1);
-    rb_define_method(cGDBM,"fastmode=", fgdbm_set_fastmode, 1);
-    rb_define_method(cGDBM,"syncmode=", fgdbm_set_syncmode, 1);
-
-    rb_define_method(cGDBM, "include?", fgdbm_has_key, 1);
-    rb_define_method(cGDBM, "has_key?", fgdbm_has_key, 1);
-    rb_define_method(cGDBM, "member?", fgdbm_has_key, 1);
-    rb_define_method(cGDBM, "has_value?", fgdbm_has_value, 1);
-    rb_define_method(cGDBM, "key?", fgdbm_has_key, 1);
-    rb_define_method(cGDBM, "value?", fgdbm_has_value, 1);
+    rb_define_method(rb_cGDBM, "initialize", fgdbm_initialize, -1);
+    rb_define_method(rb_cGDBM, "close", fgdbm_close, 0);
+    rb_define_method(rb_cGDBM, "[]", fgdbm_aref, 1);
+    rb_define_method(rb_cGDBM, "fetch", fgdbm_fetch_m, -1);
+    rb_define_method(rb_cGDBM, "[]=", fgdbm_store, 2);
+    rb_define_method(rb_cGDBM, "store", fgdbm_store, 2);
+    rb_define_method(rb_cGDBM, "index",  fgdbm_index, 1);
+    rb_define_method(rb_cGDBM, "indexes",  fgdbm_indexes, -1);
+    rb_define_method(rb_cGDBM, "indices",  fgdbm_indexes, -1);
+    rb_define_method(rb_cGDBM, "select",  fgdbm_select, -1);
+    rb_define_method(rb_cGDBM, "length", fgdbm_length, 0);
+    rb_define_method(rb_cGDBM, "size", fgdbm_length, 0);
+    rb_define_method(rb_cGDBM, "empty?", fgdbm_empty_p, 0);
+    rb_define_method(rb_cGDBM, "each", fgdbm_each_pair, 0);
+    rb_define_method(rb_cGDBM, "each_value", fgdbm_each_value, 0);
+    rb_define_method(rb_cGDBM, "each_key", fgdbm_each_key, 0);
+    rb_define_method(rb_cGDBM, "each_pair", fgdbm_each_pair, 0);
+    rb_define_method(rb_cGDBM, "keys", fgdbm_keys, 0);
+    rb_define_method(rb_cGDBM, "values", fgdbm_values, 0);
+    rb_define_method(rb_cGDBM, "shift", fgdbm_shift, 0);
+    rb_define_method(rb_cGDBM, "delete", fgdbm_delete, 1);
+    rb_define_method(rb_cGDBM, "delete_if", fgdbm_delete_if, 0);
+    rb_define_method(rb_cGDBM, "reject!", fgdbm_delete_if, 0);
+    rb_define_method(rb_cGDBM, "reject", fgdbm_reject, 0);
+    rb_define_method(rb_cGDBM, "clear", fgdbm_clear, 0);
+    rb_define_method(rb_cGDBM,"invert", fgdbm_invert, 0);
+    rb_define_method(rb_cGDBM,"update", fgdbm_update, 1);
+    rb_define_method(rb_cGDBM,"replace", fgdbm_replace, 1);
+    rb_define_method(rb_cGDBM,"reorganize", fgdbm_reorganize, 0);
+    rb_define_method(rb_cGDBM,"sync", fgdbm_sync, 0);
+    /* rb_define_method(rb_cGDBM,"setopt", fgdbm_setopt, 2); */
+    rb_define_method(rb_cGDBM,"cachesize=", fgdbm_set_cachesize, 1);
+    rb_define_method(rb_cGDBM,"fastmode=", fgdbm_set_fastmode, 1);
+    rb_define_method(rb_cGDBM,"syncmode=", fgdbm_set_syncmode, 1);
+
+    rb_define_method(rb_cGDBM, "include?", fgdbm_has_key, 1);
+    rb_define_method(rb_cGDBM, "has_key?", fgdbm_has_key, 1);
+    rb_define_method(rb_cGDBM, "member?", fgdbm_has_key, 1);
+    rb_define_method(rb_cGDBM, "has_value?", fgdbm_has_value, 1);
+    rb_define_method(rb_cGDBM, "key?", fgdbm_has_key, 1);
+    rb_define_method(rb_cGDBM, "value?", fgdbm_has_value, 1);
 
-    rb_define_method(cGDBM, "to_a", fgdbm_to_a, 0);
-    rb_define_method(cGDBM, "to_hash", fgdbm_to_hash, 0);
+    rb_define_method(rb_cGDBM, "to_a", fgdbm_to_a, 0);
+    rb_define_method(rb_cGDBM, "to_hash", fgdbm_to_hash, 0);
 
     /* flags for gdbm_opn() */
     /*
-    rb_define_const(cGDBM, "READER",  INT2FIX(GDBM_READER));
-    rb_define_const(cGDBM, "WRITER",  INT2FIX(GDBM_WRITER));
-    rb_define_const(cGDBM, "WRCREAT", INT2FIX(GDBM_WRCREAT));
-    rb_define_const(cGDBM, "NEWDB",   INT2FIX(GDBM_NEWDB));
+    rb_define_const(rb_cGDBM, "READER",  INT2FIX(GDBM_READER));
+    rb_define_const(rb_cGDBM, "WRITER",  INT2FIX(GDBM_WRITER));
+    rb_define_const(rb_cGDBM, "WRCREAT", INT2FIX(GDBM_WRCREAT));
+    rb_define_const(rb_cGDBM, "NEWDB",   INT2FIX(GDBM_NEWDB));
     */
-    rb_define_const(cGDBM, "FAST", INT2FIX(GDBM_FAST));
+    rb_define_const(rb_cGDBM, "FAST", INT2FIX(GDBM_FAST));
     /* this flag is obsolete in gdbm 1.8.
        On gdbm 1.8, fast mode is default behavior. */
 
     /* gdbm version 1.8 specific */
 #if defined(GDBM_SYNC)
-    rb_define_const(cGDBM, "SYNC",    INT2FIX(GDBM_SYNC));
+    rb_define_const(rb_cGDBM, "SYNC",    INT2FIX(GDBM_SYNC));
 #endif
 #if defined(GDBM_NOLOCK)
-    rb_define_const(cGDBM, "NOLOCK",  INT2FIX(GDBM_NOLOCK));
+    rb_define_const(rb_cGDBM, "NOLOCK",  INT2FIX(GDBM_NOLOCK));
 #endif
-    rb_define_const(cGDBM, "VERSION",  rb_str_new2(gdbm_version));
+    rb_define_const(rb_cGDBM, "VERSION",  rb_str_new2(gdbm_version));
 }
Index: ext/gdbm/testgdbm.rb
===================================================================
RCS file: /usr/local/cvsup/ruby/ruby/ext/gdbm/testgdbm.rb,v
retrieving revision 1.1
diff -u -p -u -r1.1 testgdbm.rb
--- ext/gdbm/testgdbm.rb	6 May 2001 15:02:47 -0000	1.1
+++ ext/gdbm/testgdbm.rb	24 Feb 2002 21:16:53 -0000
@@ -279,6 +279,25 @@ class TestGDBM < RUNIT::TestCase
     assert_equals(values.reverse, @gdbm.indexes(*keys.reverse))
   end
 
+  def test_select
+    keys = %w(foo bar baz)
+    values = %w(FOO BAR BAZ)
+    @gdbm[keys[0]], @gdbm[keys[1]], @gdbm[keys[2]] = values
+    assert_equals(values.reverse, @gdbm.select(*keys.reverse))
+  end
+
+  def test_select_with_block
+    keys = %w(foo bar baz)
+    values = %w(FOO BAR BAZ)
+    @gdbm[keys[0]], @gdbm[keys[1]], @gdbm[keys[2]] = values
+    ret = @gdbm.select {|k,v|
+      assert_equals(k.upcase, v)
+      k != "bar"
+    }
+    assert_equals([['baz', 'BAZ'], ['foo', 'FOO']],
+		  ret.sort)
+  end
+
   def test_length
     num = 10
     assert_equals(0, @gdbm.size)
@@ -411,7 +430,7 @@ class TestGDBM < RUNIT::TestCase
 
     @gdbm[keys[0]], @gdbm[keys[1]], @gdbm[keys[2]] = values
 
-    assert_equals(@gdbm, @gdbm.delete(key))
+    assert_equals('BAR', @gdbm.delete(key))
     assert_nil(@gdbm[key])
     assert_equals(2, @gdbm.size)
 
@@ -428,12 +447,13 @@ class TestGDBM < RUNIT::TestCase
   def test_delete_with_block
     key = 'no called block'
     @gdbm[key] = 'foo'
-    assert_equals(@gdbm, @gdbm.delete(key) {|k| k.replace 'called block'})
+    assert_equals('foo', @gdbm.delete(key) {|k| k.replace 'called block'})
     assert_equals('no called block', key)
     assert_equals(0, @gdbm.size)
 
     key = 'no called block'
-    assert_nil(@gdbm.delete(key) {|k| k.replace 'called block'})
+    assert_equals(:blockval,
+		  @gdbm.delete(key) {|k| k.replace 'called block'; :blockval})
     assert_equals('called block', key)
     assert_equals(0, @gdbm.size)
   end
Index: ext/sdbm/init.c
===================================================================
RCS file: /usr/local/cvsup/ruby/ruby/ext/sdbm/init.c,v
retrieving revision 1.10
diff -u -p -u -r1.10 init.c
--- ext/sdbm/init.c	29 Oct 2001 06:16:01 -0000	1.10
+++ ext/sdbm/init.c	26 Feb 2002 17:24:53 -0000
@@ -16,7 +16,7 @@
 #include <fcntl.h>
 #include <errno.h>
 
-static VALUE cSDBM;
+static VALUE rb_cDBM, rb_eDBMError;
 
 struct dbmdata {
     int  di_size;
@@ -26,7 +26,7 @@ struct dbmdata {
 static void
 closed_sdbm()
 {
-    rb_raise(rb_eRuntimeError, "closed SDBM file");
+    rb_raise(rb_eDBMError, "closed SDBM file");
 }
 
 #define GetDBM(obj, dbmp) {\
@@ -57,6 +57,17 @@ fsdbm_close(obj)
 }
 
 static VALUE
+fsdbm_s_new(argc, argv, klass)
+    int argc;
+    VALUE *argv;
+    VALUE klass;
+{
+    VALUE obj = Data_Wrap_Struct(klass, 0, free_sdbm, 0);
+    rb_obj_call_init(obj, argc, argv);
+    return obj;
+}
+
+static VALUE
 fsdbm_initialize(argc, argv, obj)
     int argc;
     VALUE *argv;
@@ -100,17 +111,6 @@ fsdbm_initialize(argc, argv, obj)
 }
 
 static VALUE
-fsdbm_s_new(argc, argv, klass)
-    int argc;
-    VALUE *argv;
-    VALUE klass;
-{
-    VALUE obj = Data_Wrap_Struct(klass, 0, free_sdbm, 0);
-    rb_obj_call_init(obj, argc, argv);
-    return obj;
-}
-
-static VALUE
 fsdbm_s_open(argc, argv, klass)
     int argc;
     VALUE *argv;
@@ -216,12 +216,52 @@ fsdbm_indexes(argc, argv, obj)
 }
 
 static VALUE
+fsdbm_select(argc, argv, obj)
+    int argc;
+    VALUE *argv;
+    VALUE obj;
+{
+    VALUE new = rb_ary_new2(argc);
+    int i;
+
+    if (rb_block_given_p()) {
+        datum key, val;
+        DBM *dbm;
+        struct dbmdata *dbmp;
+        VALUE keystr, valstr;
+
+	if (argc > 0) {
+	    rb_raise(rb_eArgError, "wrong number arguments(%d for 0)", argc);
+	}
+        GetDBM(obj, dbmp);
+        dbm = dbmp->di_dbm;
+
+        for (key = sdbm_firstkey(dbm); key.dptr; key = sdbm_nextkey(dbm)) {
+            VALUE assoc;
+            val = sdbm_fetch(dbm, key);
+            assoc = rb_assoc_new(rb_tainted_str_new(key.dptr, key.dsize),
+                                 rb_tainted_str_new(val.dptr, val.dsize));
+            if (RTEST(rb_yield(assoc)))
+                rb_ary_push(new, assoc);
+        }
+    }
+    else {
+        for (i=0; i<argc; i++) {
+            rb_ary_push(new, fsdbm_fetch(obj, argv[i]));
+        }
+    }
+
+    return new;
+}
+
+static VALUE
 fsdbm_delete(obj, keystr)
     VALUE obj, keystr;
 {
     datum key, value;
     struct dbmdata *dbmp;
     DBM *dbm;
+    VALUE valstr;
 
     rb_secure(4);
     StringValue(keystr);
@@ -234,18 +274,21 @@ fsdbm_delete(obj, keystr)
 
     value = sdbm_fetch(dbm, key);
     if (value.dptr == 0) {
-	if (rb_block_given_p()) rb_yield(keystr);
+	if (rb_block_given_p()) return rb_yield(keystr);
 	return Qnil;
     }
 
+    /* need to save value before sdbm_delete() */
+    valstr = rb_tainted_str_new(value.dptr, value.dsize);
+
     if (sdbm_delete(dbm, key)) {
 	dbmp->di_size = -1;
-	rb_raise(rb_eRuntimeError, "dbm_delete failed");
+	rb_raise(rb_eDBMError, "dbm_delete failed");
     }
     else if (dbmp->di_size >= 0) {
 	dbmp->di_size--;
     }
-    return obj;
+    return valstr;
 }
 
 static VALUE
@@ -304,7 +347,7 @@ fsdbm_delete_if(obj)
 	key.dptr = RSTRING(keystr)->ptr;
 	key.dsize = RSTRING(keystr)->len;
 	if (sdbm_delete(dbm, key)) {
-	    rb_raise(rb_eRuntimeError, "sdbm_delete failed");
+	    rb_raise(rb_eDBMError, "sdbm_delete failed");
 	}
     }
     if (status) rb_jump_tag(status);
@@ -327,7 +370,7 @@ fsdbm_clear(obj)
     dbmp->di_size = -1;
     while (key = sdbm_firstkey(dbm), key.dptr) {
 	if (sdbm_delete(dbm, key)) {
-	    rb_raise(rb_eRuntimeError, "sdbm_delete failed");
+	    rb_raise(rb_eDBMError, "sdbm_delete failed");
 	}
     }
     dbmp->di_size = 0;
@@ -381,7 +424,7 @@ static VALUE
 fsdbm_update(obj, other)
     VALUE obj, other;
 {
-    rb_iterate((VALUE(*)_((VALUE)))each_pair, other, update_i, obj);
+    rb_iterate(each_pair, other, update_i, obj);
     return obj;
 }
 
@@ -390,7 +433,7 @@ fsdbm_replace(obj, other)
     VALUE obj, other;
 {
     fsdbm_clear(obj);
-    rb_iterate((VALUE(*)_((VALUE)))each_pair, other, update_i, obj);
+    rb_iterate(each_pair, other, update_i, obj);
     return obj;
 }
 
@@ -427,7 +470,7 @@ fsdbm_store(obj, keystr, valstr)
 	sdbm_clearerr(dbm);
 #endif
 	if (errno == EPERM) rb_sys_fail(0);
-	rb_raise(rb_eRuntimeError, "sdbm_store failed");
+	rb_raise(rb_eDBMError, "sdbm_store failed");
     }
 
     return valstr;
@@ -670,46 +713,49 @@ fsdbm_reject(obj)
 void
 Init_sdbm()
 {
-    cSDBM = rb_define_class("SDBM", rb_cObject);
-    rb_include_module(cSDBM, rb_mEnumerable);
-
-    rb_define_singleton_method(cSDBM, "open", fsdbm_s_open, -1);
-    rb_define_singleton_method(cSDBM, "new", fsdbm_s_new, -1);
-    rb_define_method(cSDBM, "initialize", fsdbm_initialize, -1);
-    rb_define_method(cSDBM, "close", fsdbm_close, 0);
-    rb_define_method(cSDBM, "[]", fsdbm_aref, 1);
-    rb_define_method(cSDBM, "fetch", fsdbm_fetch_m, -1);
-    rb_define_method(cSDBM, "[]=", fsdbm_store, 2);
-    rb_define_method(cSDBM, "store", fsdbm_store, 2);
-    rb_define_method(cSDBM, "index",  fsdbm_index, 1);
-    rb_define_method(cSDBM, "indexes",  fsdbm_indexes, -1);
-    rb_define_method(cSDBM, "indices",  fsdbm_indexes, -1);
-    rb_define_method(cSDBM, "length", fsdbm_length, 0);
-    rb_define_alias(cSDBM,  "size", "length");
-    rb_define_method(cSDBM, "empty?", fsdbm_empty_p, 0);
-    rb_define_method(cSDBM, "each", fsdbm_each_pair, 0);
-    rb_define_method(cSDBM, "each_value", fsdbm_each_value, 0);
-    rb_define_method(cSDBM, "each_key", fsdbm_each_key, 0);
-    rb_define_method(cSDBM, "each_pair", fsdbm_each_pair, 0);
-    rb_define_method(cSDBM, "keys", fsdbm_keys, 0);
-    rb_define_method(cSDBM, "values", fsdbm_values, 0);
-    rb_define_method(cSDBM, "shift", fsdbm_shift, 0);
-    rb_define_method(cSDBM, "delete", fsdbm_delete, 1);
-    rb_define_method(cSDBM, "delete_if", fsdbm_delete_if, 0);
-    rb_define_method(cSDBM, "reject!", fsdbm_delete_if, 0);
-    rb_define_method(cSDBM, "reject", fsdbm_reject, 0);
-    rb_define_method(cSDBM, "clear", fsdbm_clear, 0);
-    rb_define_method(cSDBM,"invert", fsdbm_invert, 0);
-    rb_define_method(cSDBM,"update", fsdbm_update, 1);
-    rb_define_method(cSDBM,"replace", fsdbm_replace, 1);
-
-    rb_define_method(cSDBM, "include?", fsdbm_has_key, 1);
-    rb_define_method(cSDBM, "has_key?", fsdbm_has_key, 1);
-    rb_define_method(cSDBM, "member?", fsdbm_has_key, 1);
-    rb_define_method(cSDBM, "has_value?", fsdbm_has_value, 1);
-    rb_define_method(cSDBM, "key?", fsdbm_has_key, 1);
-    rb_define_method(cSDBM, "value?", fsdbm_has_value, 1);
+    rb_cDBM = rb_define_class("SDBM", rb_cObject);
+    rb_eDBMError = rb_define_class("SDBMError", rb_eStandardError);
+    rb_include_module(rb_cDBM, rb_mEnumerable);
+
+    rb_define_singleton_method(rb_cDBM, "new", fsdbm_s_new, -1);
+    rb_define_singleton_method(rb_cDBM, "open", fsdbm_s_open, -1);
+
+    rb_define_method(rb_cDBM, "initialize", fsdbm_initialize, -1);
+    rb_define_method(rb_cDBM, "close", fsdbm_close, 0);
+    rb_define_method(rb_cDBM, "[]", fsdbm_aref, 1);
+    rb_define_method(rb_cDBM, "fetch", fsdbm_fetch_m, -1);
+    rb_define_method(rb_cDBM, "[]=", fsdbm_store, 2);
+    rb_define_method(rb_cDBM, "store", fsdbm_store, 2);
+    rb_define_method(rb_cDBM, "index",  fsdbm_index, 1);
+    rb_define_method(rb_cDBM, "indexes",  fsdbm_indexes, -1);
+    rb_define_method(rb_cDBM, "indices",  fsdbm_indexes, -1);
+    rb_define_method(rb_cDBM, "select",  fsdbm_select, -1);
+    rb_define_method(rb_cDBM, "length", fsdbm_length, 0);
+    rb_define_method(rb_cDBM, "size", fsdbm_length, 0);
+    rb_define_method(rb_cDBM, "empty?", fsdbm_empty_p, 0);
+    rb_define_method(rb_cDBM, "each", fsdbm_each_pair, 0);
+    rb_define_method(rb_cDBM, "each_value", fsdbm_each_value, 0);
+    rb_define_method(rb_cDBM, "each_key", fsdbm_each_key, 0);
+    rb_define_method(rb_cDBM, "each_pair", fsdbm_each_pair, 0);
+    rb_define_method(rb_cDBM, "keys", fsdbm_keys, 0);
+    rb_define_method(rb_cDBM, "values", fsdbm_values, 0);
+    rb_define_method(rb_cDBM, "shift", fsdbm_shift, 0);
+    rb_define_method(rb_cDBM, "delete", fsdbm_delete, 1);
+    rb_define_method(rb_cDBM, "delete_if", fsdbm_delete_if, 0);
+    rb_define_method(rb_cDBM, "reject!", fsdbm_delete_if, 0);
+    rb_define_method(rb_cDBM, "reject", fsdbm_reject, 0);
+    rb_define_method(rb_cDBM, "clear", fsdbm_clear, 0);
+    rb_define_method(rb_cDBM,"invert", fsdbm_invert, 0);
+    rb_define_method(rb_cDBM,"update", fsdbm_update, 1);
+    rb_define_method(rb_cDBM,"replace", fsdbm_replace, 1);
+
+    rb_define_method(rb_cDBM, "include?", fsdbm_has_key, 1);
+    rb_define_method(rb_cDBM, "has_key?", fsdbm_has_key, 1);
+    rb_define_method(rb_cDBM, "member?", fsdbm_has_key, 1);
+    rb_define_method(rb_cDBM, "has_value?", fsdbm_has_value, 1);
+    rb_define_method(rb_cDBM, "key?", fsdbm_has_key, 1);
+    rb_define_method(rb_cDBM, "value?", fsdbm_has_value, 1);
 
-    rb_define_method(cSDBM, "to_a", fsdbm_to_a, 0);
-    rb_define_method(cSDBM, "to_hash", fsdbm_to_hash, 0);
+    rb_define_method(rb_cDBM, "to_a", fsdbm_to_a, 0);
+    rb_define_method(rb_cDBM, "to_hash", fsdbm_to_hash, 0);
 }
Index: ext/sdbm/testsdbm.rb
===================================================================
RCS file: /usr/local/cvsup/ruby/ruby/ext/sdbm/testsdbm.rb,v
retrieving revision 1.1
diff -u -p -u -r1.1 testsdbm.rb
--- ext/sdbm/testsdbm.rb	6 May 2001 15:03:35 -0000	1.1
+++ ext/sdbm/testsdbm.rb	26 Feb 2002 17:22:07 -0000
@@ -139,7 +139,7 @@ class TestSDBM < RUNIT::TestCase
     assert_nil(sdbm.close)
 
     # closed SDBM file
-    assert_exception(RuntimeError) { sdbm.close }
+    assert_exception(SDBMError) { sdbm.close }
   end
 
   def test_aref
@@ -219,6 +219,25 @@ class TestSDBM < RUNIT::TestCase
     assert_equals(values.reverse, @sdbm.indexes(*keys.reverse))
   end
 
+  def test_select
+    keys = %w(foo bar baz)
+    values = %w(FOO BAR BAZ)
+    @sdbm[keys[0]], @sdbm[keys[1]], @sdbm[keys[2]] = values
+    assert_equals(values.reverse, @sdbm.select(*keys.reverse))
+  end
+
+  def test_select_with_block
+    keys = %w(foo bar baz)
+    values = %w(FOO BAR BAZ)
+    @sdbm[keys[0]], @sdbm[keys[1]], @sdbm[keys[2]] = values
+    ret = @sdbm.select {|k,v|
+      assert_equals(k.upcase, v)
+      k != "bar"
+    }
+    assert_equals([['baz', 'BAZ'], ['foo', 'FOO']],
+		  ret.sort)
+  end
+
   def test_length
     num = 10
     assert_equals(0, @sdbm.size)
@@ -351,7 +370,7 @@ class TestSDBM < RUNIT::TestCase
 
     @sdbm[keys[0]], @sdbm[keys[1]], @sdbm[keys[2]] = values
 
-    assert_equals(@sdbm, @sdbm.delete(key))
+    assert_equals('BAR', @sdbm.delete(key))
     assert_nil(@sdbm[key])
     assert_equals(2, @sdbm.size)
 
@@ -360,12 +379,13 @@ class TestSDBM < RUNIT::TestCase
   def test_delete_with_block
     key = 'no called block'
     @sdbm[key] = 'foo'
-    assert_equals(@sdbm, @sdbm.delete(key) {|k| k.replace 'called block'})
+    assert_equals('foo', @sdbm.delete(key) {|k| k.replace 'called block'})
     assert_equals('no called block', key)
     assert_equals(0, @sdbm.size)
 
     key = 'no called block'
-    assert_nil(@sdbm.delete(key) {|k| k.replace 'called block'})
+    assert_equals(:blockval,
+		  @sdbm.delete(key) {|k| k.replace 'called block'; :blockval})
     assert_equals('called block', key)
     assert_equals(0, @sdbm.size)
   end

In This Thread

Prev Next