X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=ext%2FNDBM_File%2FNDBM_File.xs;h=53403a54d645f780b8731854fa5d2617e7e7680e;hb=58a9407439d0a351f8fbc4e66b3f56e5d81df3c0;hp=c417eb693e9200e308c171b4f60d6425152e3a21;hpb=bb636fa4a888d369d95f00a75923476bd0dae49f;p=p5sagit%2Fp5-mst-13.2.git diff --git a/ext/NDBM_File/NDBM_File.xs b/ext/NDBM_File/NDBM_File.xs index c417eb6..53403a5 100644 --- a/ext/NDBM_File/NDBM_File.xs +++ b/ext/NDBM_File/NDBM_File.xs @@ -1,11 +1,6 @@ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" -/* 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 typedef struct { @@ -21,24 +16,19 @@ typedef NDBM_File_type * NDBM_File ; typedef datum datum_key ; 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) ;*/ \ - } +#if defined(__cplusplus) && defined(HAS_GDBM) +/* gdbm's header file used for compatibility with gdbm */ +/* isn't compatible to C++ syntax, so we need these */ +/* declarations to make everyone happy. */ +EXTERN_C DBM *dbm_open(const char *, int, mode_t); +EXTERN_C void dbm_close(DBM *); +EXTERN_C datum dbm_fetch(DBM *, datum); +EXTERN_C int dbm_store(DBM *, datum, datum, int); +EXTERN_C int dbm_delete(DBM *, datum); +EXTERN_C datum dbm_firstkey(DBM *); +EXTERN_C datum dbm_nextkey(DBM *); +#endif MODULE = NDBM_File PACKAGE = NDBM_File PREFIX = ndbm_ @@ -53,7 +43,7 @@ ndbm_TIEHASH(dbtype, filename, flags, mode) DBM * dbp ; RETVAL = NULL ; - if (dbp = dbm_open(filename, flags, mode)) { + if ((dbp = dbm_open(filename, flags, mode))) { RETVAL = (NDBM_File)safemalloc(sizeof(NDBM_File_type)) ; Zero(RETVAL, 1, NDBM_File_type) ; RETVAL->dbp = dbp ; @@ -107,7 +97,7 @@ ndbm_FIRSTKEY(db) datum_key ndbm_NEXTKEY(db, key) NDBM_File db - datum_key key + datum_key key = NO_INIT #define ndbm_error(db) dbm_error(db->dbp) int @@ -120,32 +110,13 @@ ndbm_clearerr(db) NDBM_File db -#define setFilter(type) \ - { \ - if (db->type) \ - RETVAL = sv_mortalcopy(db->type) ; \ - ST(0) = RETVAL ; \ - if (db->type && (code == &PL_sv_undef)) { \ - SvREFCNT_dec(db->type) ; \ - db->type = NULL ; \ - } \ - else if (code) { \ - if (db->type) \ - sv_setsv(db->type, code) ; \ - else \ - db->type = newSVsv(code) ; \ - } \ - } - - - SV * filter_fetch_key(db, code) NDBM_File db SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_fetch_key) ; + DBM_setFilter(db->filter_fetch_key, code) ; SV * filter_store_key(db, code) @@ -153,7 +124,7 @@ filter_store_key(db, code) SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_store_key) ; + DBM_setFilter(db->filter_store_key, code) ; SV * filter_fetch_value(db, code) @@ -161,7 +132,7 @@ filter_fetch_value(db, code) SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_fetch_value) ; + DBM_setFilter(db->filter_fetch_value, code) ; SV * filter_store_value(db, code) @@ -169,5 +140,5 @@ filter_store_value(db, code) SV * code SV * RETVAL = &PL_sv_undef ; CODE: - setFilter(filter_store_value) ; + DBM_setFilter(db->filter_store_value, code) ;