From 62e648e148b3cb9f96dcce808c55c02b7ccb4486 Mon Sep 17 00:00:00 2001 From: matz Date: Wed, 20 Jan 1999 04:59:39 +0000 Subject: ruby 1.3 cycle git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/RUBY@372 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/dbm/dbm.c | 175 +++++++++++++++++++++++++++++++++++++---------------- ext/dbm/extconf.rb | 6 +- 2 files changed, 128 insertions(+), 53 deletions(-) (limited to 'ext/dbm') diff --git a/ext/dbm/dbm.c b/ext/dbm/dbm.c index b416802241..2764a325e1 100644 --- a/ext/dbm/dbm.c +++ b/ext/dbm/dbm.c @@ -6,7 +6,7 @@ $Date$ created at: Mon Jan 24 15:59:52 JST 1994 - Copyright (C) 1995 Yukihiro Matsumoto + Copyright (C) 1995-1998 Yukihiro Matsumoto ************************************************/ @@ -15,11 +15,12 @@ #include #include #include +#ifdef USE_CWGUSI +# include +#endif VALUE cDBM; -extern VALUE mEnumerable; - struct dbmdata { int di_size; DBM *di_dbm; @@ -28,7 +29,7 @@ struct dbmdata { static void closed_dbm() { - Fail("closed DBM file"); + rb_raise(rb_eRuntimeError, "closed DBM file"); } #define GetDBM(obj, dbmp) {\ @@ -41,13 +42,14 @@ free_dbm(dbmp) struct dbmdata *dbmp; { if (dbmp->di_dbm) dbm_close(dbmp->di_dbm); + free(dbmp); } static VALUE -fdbm_s_open(argc, argv, class) +fdbm_s_open(argc, argv, klass) int argc; VALUE *argv; - VALUE class; + VALUE klass; { VALUE file, vmode; DBM *dbm; @@ -79,9 +81,10 @@ fdbm_s_open(argc, argv, class) rb_sys_fail(RSTRING(file)->ptr); } - obj = Data_Make_Struct(class,struct dbmdata,0,free_dbm,dbmp); + obj = Data_Make_Struct(klass,struct dbmdata,0,free_dbm,dbmp); dbmp->di_dbm = dbm; dbmp->di_size = -1; + rb_obj_call_init(obj); return obj; } @@ -118,23 +121,23 @@ fdbm_fetch(obj, keystr) if (value.dptr == 0) { return Qnil; } - return str_taint(str_new(value.dptr, value.dsize)); + return rb_tainted_str_new(value.dptr, value.dsize); } static VALUE -fdbm_indexes(obj, ag) - VALUE obj, ag; +fdbm_indexes(argc, argv, obj) + int argc; + VALUE *argv; + VALUE obj; { - VALUE *p, *pend; VALUE new; - int i = 0; - struct RArray *args = RARRAY(rb_Array(ag)); + int i; - new = ary_new2(args->len); - p = args->ptr; pend = p + args->len; - while (p < pend) { - ary_push(new, fdbm_fetch(obj, *p++)); + new = rb_ary_new2(argc); + for (i=0; idi_size = -1; - Fail("dbm_delete failed"); + rb_raise(rb_eRuntimeError, "dbm_delete failed"); } else if (dbmp->di_size >= 0) { dbmp->di_size--; @@ -188,9 +191,9 @@ fdbm_shift(obj) val = dbm_fetch(dbm, key); dbm_delete(dbm, key); - keystr = str_taint(str_new(key.dptr, key.dsize)); - valstr = str_taint(str_new(val.dptr, val.dsize)); - return assoc_new(keystr, valstr); + keystr = rb_tainted_str_new(key.dptr, key.dsize); + valstr = rb_tainted_str_new(val.dptr, val.dsize); + return rb_assoc_new(keystr, valstr); } static VALUE @@ -207,11 +210,11 @@ fdbm_delete_if(obj) dbm = dbmp->di_dbm; for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) { val = dbm_fetch(dbm, key); - keystr = str_taint(str_new(key.dptr, key.dsize)); - valstr = str_taint(str_new(val.dptr, val.dsize)); - if (RTEST(rb_yield(assoc_new(keystr, valstr)))) { + keystr = rb_tainted_str_new(key.dptr, key.dsize); + valstr = rb_tainted_str_new(val.dptr, val.dsize); + if (RTEST(rb_yield(rb_assoc_new(keystr, valstr)))) { if (dbm_delete(dbm, key)) { - Fail("dbm_delete failed"); + rb_raise(rb_eRuntimeError, "dbm_delete failed"); } } } @@ -232,12 +235,71 @@ fdbm_clear(obj) dbmp->di_size = -1; for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) { if (dbm_delete(dbm, key)) { - Fail("dbm_delete failed"); + rb_raise(rb_eRuntimeError, "dbm_delete failed"); } } return obj; } +static VALUE +fdbm_invert(obj) + VALUE obj; +{ + datum key, val; + struct dbmdata *dbmp; + DBM *dbm; + VALUE keystr, valstr; + VALUE hash = rb_hash_new(); + + GetDBM(obj, dbmp); + dbm = dbmp->di_dbm; + for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) { + val = dbm_fetch(dbm, key); + keystr = rb_tainted_str_new(key.dptr, key.dsize); + valstr = rb_tainted_str_new(val.dptr, val.dsize); + rb_hash_aset(hash, valstr, keystr); + } + return obj; +} + +static VALUE +each_pair(obj) + VALUE obj; +{ + return rb_funcall(obj, rb_intern("each_pair"), 0, 0); +} + +static VALUE fdbm_store _((VALUE,VALUE,VALUE)); + +static VALUE +update_i(pair, dbm) + VALUE pair, dbm; +{ + Check_Type(pair, T_ARRAY); + if (RARRAY(pair)->len < 2) { + rb_raise(rb_eArgError, "pair must be [key, value]"); + } + fdbm_store(dbm, RARRAY(pair)->ptr[0], RARRAY(pair)->ptr[1]); + return Qnil; +} + +static VALUE +fdbm_update(obj, other) + VALUE obj, other; +{ + rb_iterate(each_pair, other, update_i, obj); + return obj; +} + +static VALUE +fdbm_replace(obj, other) + VALUE obj, other; +{ + fdbm_clear(obj); + rb_iterate(each_pair, other, update_i, obj); + return obj; +} + static VALUE fdbm_store(obj, keystr, valstr) VALUE obj, keystr, valstr; @@ -252,14 +314,14 @@ fdbm_store(obj, keystr, valstr) } rb_secure(4); - keystr = obj_as_string(keystr); + keystr = rb_obj_as_string(keystr); key.dptr = RSTRING(keystr)->ptr; key.dsize = RSTRING(keystr)->len; if (NIL_P(valstr)) return fdbm_delete(obj, keystr); - valstr = obj_as_string(valstr); + valstr = rb_obj_as_string(valstr); val.dptr = RSTRING(valstr)->ptr; val.dsize = RSTRING(valstr)->len; @@ -267,9 +329,11 @@ fdbm_store(obj, keystr, valstr) dbmp->di_size = -1; dbm = dbmp->di_dbm; if (dbm_store(dbm, key, val, DBM_REPLACE)) { +#ifdef HAVE_DBM_CLAERERR dbm_clearerr(dbm); - if (errno == EPERM) rb_sys_fail(Qnil); - Fail("dbm_store failed"); +#endif + if (errno == EPERM) rb_sys_fail(0); + rb_raise(rb_eRuntimeError, "dbm_store failed"); } return valstr; @@ -316,8 +380,8 @@ fdbm_empty_p(obj) else { i = dbmp->di_size; } - if (i == 0) return TRUE; - return FALSE; + if (i == 0) return Qtrue; + return Qfalse; } static VALUE @@ -332,7 +396,7 @@ fdbm_each_value(obj) dbm = dbmp->di_dbm; for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) { val = dbm_fetch(dbm, key); - rb_yield(str_taint(str_new(val.dptr, val.dsize))); + rb_yield(rb_tainted_str_new(val.dptr, val.dsize)); } return obj; } @@ -348,7 +412,7 @@ fdbm_each_key(obj) GetDBM(obj, dbmp); dbm = dbmp->di_dbm; for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) { - rb_yield(str_taint(str_new(key.dptr, key.dsize))); + rb_yield(rb_tainted_str_new(key.dptr, key.dsize)); } return obj; } @@ -367,9 +431,9 @@ fdbm_each_pair(obj) for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) { val = dbm_fetch(dbm, key); - keystr = str_taint(str_new(key.dptr, key.dsize)); - valstr = str_taint(str_new(val.dptr, val.dsize)); - rb_yield(assoc_new(keystr, valstr)); + keystr = rb_tainted_str_new(key.dptr, key.dsize); + valstr = rb_tainted_str_new(val.dptr, val.dsize); + rb_yield(rb_assoc_new(keystr, valstr)); } return obj; @@ -387,9 +451,9 @@ fdbm_keys(obj) GetDBM(obj, dbmp); dbm = dbmp->di_dbm; - ary = ary_new(); + ary = rb_ary_new(); for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) { - ary_push(ary, str_taint(str_new(key.dptr, key.dsize))); + rb_ary_push(ary, rb_tainted_str_new(key.dptr, key.dsize)); } return ary; @@ -407,10 +471,10 @@ fdbm_values(obj) GetDBM(obj, dbmp); dbm = dbmp->di_dbm; - ary = ary_new(); + ary = rb_ary_new(); for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) { val = dbm_fetch(dbm, key); - ary_push(ary, str_taint(str_new(val.dptr, val.dsize))); + rb_ary_push(ary, rb_tainted_str_new(val.dptr, val.dsize)); } return ary; @@ -431,8 +495,8 @@ fdbm_has_key(obj, keystr) GetDBM(obj, dbmp); dbm = dbmp->di_dbm; val = dbm_fetch(dbm, key); - if (val.dptr) return TRUE; - return FALSE; + if (val.dptr) return Qtrue; + return Qfalse; } static VALUE @@ -453,9 +517,9 @@ fdbm_has_value(obj, valstr) val = dbm_fetch(dbm, key); if (val.dsize == RSTRING(valstr)->len && memcmp(val.dptr, RSTRING(valstr)->ptr, val.dsize) == 0) - return TRUE; + return Qtrue; } - return FALSE; + return Qfalse; } static VALUE @@ -470,26 +534,29 @@ fdbm_to_a(obj) GetDBM(obj, dbmp); dbm = dbmp->di_dbm; - ary = ary_new(); + ary = rb_ary_new(); for (key = dbm_firstkey(dbm); key.dptr; key = dbm_nextkey(dbm)) { val = dbm_fetch(dbm, key); - ary_push(ary, assoc_new(str_taint(str_new(key.dptr, key.dsize)), - str_taint(str_new(val.dptr, val.dsize)))); + rb_ary_push(ary, rb_assoc_new(rb_tainted_str_new(key.dptr, key.dsize), + rb_tainted_str_new(val.dptr, val.dsize))); } return ary; } +void Init_dbm() { - cDBM = rb_define_class("DBM", cObject); - rb_include_module(cDBM, mEnumerable); + cDBM = rb_define_class("DBM", rb_cObject); + rb_include_module(cDBM, rb_mEnumerable); rb_define_singleton_method(cDBM, "open", fdbm_s_open, -1); + rb_define_singleton_method(cDBM, "new", fdbm_s_open, -1); rb_define_method(cDBM, "close", fdbm_close, 0); rb_define_method(cDBM, "[]", fdbm_fetch, 1); rb_define_method(cDBM, "[]=", fdbm_store, 2); - rb_define_method(cDBM, "indexes", fdbm_indexes, -2); + rb_define_method(cDBM, "indexes", fdbm_indexes, -1); + rb_define_method(cDBM, "indices", fdbm_indexes, -1); rb_define_method(cDBM, "length", fdbm_length, 0); rb_define_alias(cDBM, "size", "length"); rb_define_method(cDBM, "empty?", fdbm_empty_p, 0); @@ -503,6 +570,10 @@ Init_dbm() rb_define_method(cDBM, "delete", fdbm_delete, 1); rb_define_method(cDBM, "delete_if", fdbm_delete_if, 0); rb_define_method(cDBM, "clear", fdbm_clear, 0); + rb_define_method(cDBM,"invert", fdbm_invert, 0); + rb_define_method(cDBM,"update", fdbm_update, 1); + rb_define_method(cDBM,"replace", fdbm_replace, 1); + rb_define_method(cDBM, "include?", fdbm_has_key, 1); rb_define_method(cDBM, "has_key?", fdbm_has_key, 1); rb_define_method(cDBM, "has_value?", fdbm_has_value, 1); diff --git a/ext/dbm/extconf.rb b/ext/dbm/extconf.rb index 4a5d41f275..3a96cee12f 100644 --- a/ext/dbm/extconf.rb +++ b/ext/dbm/extconf.rb @@ -1,5 +1,9 @@ +require 'mkmf' $LDFLAGS = "-L/usr/local/lib" -have_library("gdbm", "dbm_open") or have_library("dbm", "dbm_open") +have_library("gdbm", "dbm_open") or + have_library("db", "dbm_open") or + have_library("dbm", "dbm_open") if have_func("dbm_open") + have_func("dbm_clearerr") create_makefile("dbm") end -- cgit v1.2.3