X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=ext%2FODBM_File%2FODBM_File.xs;h=3bc94fe073060eb36f96bee910f04f8295061b4e;hb=65575be5af9681bf691b8b72b0e5b7f432a867bf;hp=7601c3433b9ae882774f08069af37378dc90ca7c;hpb=564319723c2c18fa4801cd77e0d203a582b4d5a3;p=p5sagit%2Fp5-mst-13.2.git diff --git a/ext/ODBM_File/ODBM_File.xs b/ext/ODBM_File/ODBM_File.xs index 7601c34..3bc94fe 100644 --- a/ext/ODBM_File/ODBM_File.xs +++ b/ext/ODBM_File/ODBM_File.xs @@ -2,10 +2,12 @@ #include "perl.h" #include "XSUB.h" -#ifdef NULL -#undef NULL /* XXX Why? */ -#endif #ifdef I_DBM +/* If using the DB3 emulation, ENTER is defined both + * by DB3 and Perl. We drop the Perl definition now. + * See also INSTALL section on DB3. + * -- Stanislav Brabec */ +# undef ENTER # include #else # ifdef I_RPCSVC_DBM @@ -13,6 +15,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(), @@ -41,6 +53,7 @@ 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) \ @@ -68,7 +81,15 @@ typedef datum datum_value ; #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 +97,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,6 +112,8 @@ 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); @@ -117,14 +141,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)