Re: [PATCH] User pragmas now accessible from B
[p5sagit/p5-mst-13.2.git] / ext / SDBM_File / SDBM_File.xs
index c2e940b..6aafb6b 100644 (file)
@@ -1,3 +1,4 @@
+#define PERL_NO_GET_CONTEXT
 #include "EXTERN.h"
 #include "perl.h"
 #include "XSUB.h"
@@ -16,24 +17,6 @@ typedef SDBM_File_type * SDBM_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) ;*/         \
-       }
-
 #define sdbm_TIEHASH(dbtype,filename,flags,mode) sdbm_open(filename,flags,mode)
 #define sdbm_FETCH(db,key)                     sdbm_fetch(db->dbp,key)
 #define sdbm_STORE(db,key,value,flags)         sdbm_store(db->dbp,key,value,flags)
@@ -56,7 +39,7 @@ sdbm_TIEHASH(dbtype, filename, flags, mode)
            DBM *       dbp ;
 
            RETVAL = NULL ;
-           if (dbp = sdbm_open(filename,flags,mode) ) {
+           if ((dbp = sdbm_open(filename,flags,mode))) {
                RETVAL = (SDBM_File)safemalloc(sizeof(SDBM_File_type)) ;
                Zero(RETVAL, 1, SDBM_File_type) ;
                RETVAL->dbp = dbp ;
@@ -70,16 +53,18 @@ void
 sdbm_DESTROY(db)
        SDBM_File       db
        CODE:
-         sdbm_close(db->dbp);
-         if (db->filter_fetch_key)
-           SvREFCNT_dec(db->filter_fetch_key) ;
-         if (db->filter_store_key)
-           SvREFCNT_dec(db->filter_store_key) ;
-         if (db->filter_fetch_value)
-           SvREFCNT_dec(db->filter_fetch_value) ;
-         if (db->filter_store_value)
-           SvREFCNT_dec(db->filter_store_value) ;
-         Safefree(db) ;        
+       if (db) {
+           sdbm_close(db->dbp);
+           if (db->filter_fetch_key)
+               SvREFCNT_dec(db->filter_fetch_key) ;
+           if (db->filter_store_key)
+               SvREFCNT_dec(db->filter_store_key) ;
+           if (db->filter_fetch_value)
+               SvREFCNT_dec(db->filter_fetch_value) ;
+           if (db->filter_store_value)
+               SvREFCNT_dec(db->filter_store_value) ;
+           safefree(db) ;
+       }
 
 datum_value
 sdbm_FETCH(db, key)
@@ -118,7 +103,7 @@ sdbm_FIRSTKEY(db)
 datum_key
 sdbm_NEXTKEY(db, key)
        SDBM_File       db
-       datum_key       key
+       datum_key       key;
 
 int
 sdbm_error(db)
@@ -137,32 +122,13 @@ sdbm_clearerr(db)
          RETVAL
 
 
-#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)
        SDBM_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)
@@ -170,7 +136,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)
@@ -178,7 +144,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)
@@ -186,5 +152,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) ;