From 3fc04d9361549d5bb15f869c22d7ce9591a0ac8c Mon Sep 17 00:00:00 2001 From: matz Date: Wed, 27 Feb 2002 04:52:21 +0000 Subject: * ext/dbm/dbm.c (fdbm_select): 1.7 behavior. * ext/gdbm/gdbm.c (fgdbm_select): ditto. * ext/sdbm/sdbm.c (fsdbm_select): ditto. * ext/dbm/dbm.c (fdbm_delete): adopt Hash#delete behavior. * ext/sdbm/sdbm.c (fsdbm_delete): ditto. * ext/gdbm/gdbm.c: need not to dup key to the block. * ext/sdbm/sdbm.c : replace RuntimeError with SDBMError. * eval.c (rb_f_missing): NoMethod error messages for true, false, nil must respond visibility like for other objects. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2145 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/gdbm/gdbm.c | 196 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 115 insertions(+), 81 deletions(-) (limited to 'ext/gdbm/gdbm.c') diff --git a/ext/gdbm/gdbm.c b/ext/gdbm/gdbm.c index eddeb11f8e..d30f5dec7a 100644 --- a/ext/gdbm/gdbm.c +++ b/ext/gdbm/gdbm.c @@ -14,11 +14,11 @@ #include #include -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) @@ -140,19 +151,6 @@ fgdbm_s_open(argc, argv, klass) return obj; } -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; @@ -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 @@ -326,6 +324,43 @@ fgdbm_indexes(argc, argv, obj) return new; } +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