X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=ext%2FODBM_File%2FODBM_File.xs;h=2510d5e4f3daf6032bde30508a8291010a69c5bd;hb=e42df61ffa4b532a113a57b2965d347ce4da44b3;hp=9ad794da89f6606921b8d8198c4bd3affbd1223a;hpb=1b882d32f692ce67c7b4fa7e0684fcc65add31dc;p=p5sagit%2Fp5-mst-13.2.git diff --git a/ext/ODBM_File/ODBM_File.xs b/ext/ODBM_File/ODBM_File.xs index 9ad794d..2510d5e 100644 --- a/ext/ODBM_File/ODBM_File.xs +++ b/ext/ODBM_File/ODBM_File.xs @@ -2,9 +2,6 @@ #include "perl.h" #include "XSUB.h" -#ifdef NULL -#undef NULL /* XXX Why? */ -#endif #ifdef I_DBM # include #else @@ -13,6 +10,16 @@ # endif #endif +#ifndef HAS_DBMINIT_PROTO +int dbminit(char* filename); +int dbmclose(void); +datum fetch(datum key); +int store(datum key, datum dat); +int delete(datum key); +datum firstkey(void); +datum nextkey(datum key); +#endif + #ifdef DBM_BUG_DUPLICATE_FREE /* * DBM on at least Ultrix and HPUX call dbmclose() from dbminit(), @@ -25,7 +32,7 @@ * Set DBM_BUG_DUPLICATE_FREE in the extension hint file. */ /* Close the previous dbm, and fail to open a new dbm */ -#define dbmclose() ((void) dbminit("/tmp/x/y/z/z/y")) +#define dbmclose() ((void) dbminit("/non/exist/ent")) #endif #include @@ -41,34 +48,24 @@ typedef struct { typedef ODBM_File_type * ODBM_File ; typedef datum datum_key ; +typedef datum datum_key_copy ; typedef datum datum_value ; -#define ckFilter(arg,type,name) \ - if (db->type) { \ - SV * save_defsv ; \ - /* printf("filtering %s\n", name) ;*/ \ - if (db->filtering) \ - croak("recursion detected in %s", name) ; \ - db->filtering = TRUE ; \ - save_defsv = newSVsv(DEFSV) ; \ - sv_setsv(DEFSV, arg) ; \ - PUSHMARK(sp) ; \ - (void) perl_call_sv(db->type, G_DISCARD|G_NOARGS); \ - sv_setsv(arg, DEFSV) ; \ - sv_setsv(DEFSV, save_defsv) ; \ - SvREFCNT_dec(save_defsv) ; \ - db->filtering = FALSE ; \ - /*printf("end of filtering %s\n", name) ;*/ \ - } - - #define odbm_FETCH(db,key) fetch(key) #define odbm_STORE(db,key,value,flags) store(key,value) #define odbm_DELETE(db,key) delete(key) #define odbm_FIRSTKEY(db) firstkey() #define odbm_NEXTKEY(db,key) nextkey(key) -static int dbmrefcnt; +#define MY_CXT_KEY "ODBM_File::_guts" XS_VERSION + +typedef struct { + int x_dbmrefcnt; +} my_cxt_t; + +START_MY_CXT + +#define dbmrefcnt (MY_CXT.x_dbmrefcnt) #ifndef DBM_REPLACE #define DBM_REPLACE 0 @@ -76,9 +73,10 @@ static int dbmrefcnt; MODULE = ODBM_File PACKAGE = ODBM_File PREFIX = odbm_ -#ifndef NULL -# define NULL 0 -#endif +BOOT: +{ + MY_CXT_INIT; +} ODBM_File odbm_TIEHASH(dbtype, filename, flags, mode) @@ -90,9 +88,11 @@ odbm_TIEHASH(dbtype, filename, flags, mode) { char *tmpbuf; void * dbp ; + dMY_CXT; + if (dbmrefcnt++) croak("Old dbm can only open one database"); - New(0, tmpbuf, strlen(filename) + 5, char); + Newx(tmpbuf, strlen(filename) + 5, char); SAVEFREEPV(tmpbuf); sprintf(tmpbuf,"%s.dir",filename); if (stat(tmpbuf, &PL_statbuf) < 0) { @@ -117,14 +117,17 @@ odbm_TIEHASH(dbtype, filename, flags, mode) void DESTROY(db) ODBM_File db + PREINIT: + dMY_CXT; CODE: dbmrefcnt--; dbmclose(); + safefree(db); datum_value odbm_FETCH(db, key) ODBM_File db - datum_key key + datum_key_copy key int odbm_STORE(db, key, value, flags = DBM_REPLACE) @@ -158,7 +161,8 @@ odbm_NEXTKEY(db, key) #define setFilter(type) \ { \ if (db->type) \ - RETVAL = newSVsv(db->type) ; \ + RETVAL = sv_mortalcopy(db->type) ; \ + ST(0) = RETVAL ; \ if (db->type && (code == &PL_sv_undef)) { \ SvREFCNT_dec(db->type) ; \ db->type = Nullsv ; \ @@ -179,9 +183,7 @@ filter_fetch_key(db, code) SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_fetch_key) ; - OUTPUT: - RETVAL + DBM_setFilter(db->filter_fetch_key, code) ; SV * filter_store_key(db, code) @@ -189,9 +191,7 @@ filter_store_key(db, code) SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_store_key) ; - OUTPUT: - RETVAL + DBM_setFilter(db->filter_store_key, code) ; SV * filter_fetch_value(db, code) @@ -199,9 +199,7 @@ filter_fetch_value(db, code) SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_fetch_value) ; - OUTPUT: - RETVAL + DBM_setFilter(db->filter_fetch_value, code) ; SV * filter_store_value(db, code) @@ -209,7 +207,5 @@ filter_store_value(db, code) SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_store_value) ; - OUTPUT: - RETVAL + DBM_setFilter(db->filter_store_value, code) ;