Integrate mainline
[p5sagit/p5-mst-13.2.git] / ext / NDBM_File / NDBM_File.xs
CommitLineData
a0d0e21e 1#include "EXTERN.h"
2#include "perl.h"
3#include "XSUB.h"
bb636fa4 4/* If using the DB3 emulation, ENTER is defined both
5 * by DB3 and Perl. We drop the Perl definition now.
6 * See also INSTALL section on DB3.
7 * -- Stanislav Brabec <utx@penguin.cz> */
8#undef ENTER
a0d0e21e 9#include <ndbm.h>
10
9fe6733a 11typedef struct {
12 DBM * dbp ;
13 SV * filter_fetch_key ;
14 SV * filter_store_key ;
15 SV * filter_fetch_value ;
16 SV * filter_store_value ;
17 int filtering ;
18 } NDBM_File_type;
19
20typedef NDBM_File_type * NDBM_File ;
21typedef datum datum_key ;
22typedef datum datum_value ;
23
24#define ckFilter(arg,type,name) \
25 if (db->type) { \
26 SV * save_defsv ; \
27 /* printf("filtering %s\n", name) ;*/ \
28 if (db->filtering) \
29 croak("recursion detected in %s", name) ; \
30 db->filtering = TRUE ; \
31 save_defsv = newSVsv(DEFSV) ; \
32 sv_setsv(DEFSV, arg) ; \
33 PUSHMARK(sp) ; \
34 (void) perl_call_sv(db->type, G_DISCARD|G_NOARGS); \
35 sv_setsv(arg, DEFSV) ; \
36 sv_setsv(DEFSV, save_defsv) ; \
37 SvREFCNT_dec(save_defsv) ; \
38 db->filtering = FALSE ; \
39 /*printf("end of filtering %s\n", name) ;*/ \
40 }
41
a0d0e21e 42
049cc612 43MODULE = NDBM_File PACKAGE = NDBM_File PREFIX = ndbm_
a0d0e21e 44
45NDBM_File
049cc612 46ndbm_TIEHASH(dbtype, filename, flags, mode)
a0d0e21e 47 char * dbtype
48 char * filename
49 int flags
50 int mode
9fe6733a 51 CODE:
52 {
53 DBM * dbp ;
54
55 RETVAL = NULL ;
56 if (dbp = dbm_open(filename, flags, mode)) {
57 RETVAL = (NDBM_File)safemalloc(sizeof(NDBM_File_type)) ;
58 Zero(RETVAL, 1, NDBM_File_type) ;
59 RETVAL->dbp = dbp ;
60 }
61
62 }
63 OUTPUT:
64 RETVAL
a0d0e21e 65
66void
049cc612 67ndbm_DESTROY(db)
a0d0e21e 68 NDBM_File db
69 CODE:
9fe6733a 70 dbm_close(db->dbp);
eb99164f 71 safefree(db);
a0d0e21e 72
049cc612 73#define ndbm_FETCH(db,key) dbm_fetch(db->dbp,key)
9fe6733a 74datum_value
049cc612 75ndbm_FETCH(db, key)
a0d0e21e 76 NDBM_File db
9fe6733a 77 datum_key key
a0d0e21e 78
049cc612 79#define ndbm_STORE(db,key,value,flags) dbm_store(db->dbp,key,value,flags)
a0d0e21e 80int
049cc612 81ndbm_STORE(db, key, value, flags = DBM_REPLACE)
a0d0e21e 82 NDBM_File db
9fe6733a 83 datum_key key
84 datum_value value
a0d0e21e 85 int flags
86 CLEANUP:
87 if (RETVAL) {
88 if (RETVAL < 0 && errno == EPERM)
89 croak("No write permission to ndbm file");
748a9306 90 croak("ndbm store returned %d, errno %d, key \"%s\"",
a0d0e21e 91 RETVAL,errno,key.dptr);
9fe6733a 92 dbm_clearerr(db->dbp);
a0d0e21e 93 }
94
049cc612 95#define ndbm_DELETE(db,key) dbm_delete(db->dbp,key)
a0d0e21e 96int
049cc612 97ndbm_DELETE(db, key)
a0d0e21e 98 NDBM_File db
9fe6733a 99 datum_key key
a0d0e21e 100
049cc612 101#define ndbm_FIRSTKEY(db) dbm_firstkey(db->dbp)
9fe6733a 102datum_key
049cc612 103ndbm_FIRSTKEY(db)
a0d0e21e 104 NDBM_File db
105
049cc612 106#define ndbm_NEXTKEY(db,key) dbm_nextkey(db->dbp)
9fe6733a 107datum_key
049cc612 108ndbm_NEXTKEY(db, key)
a0d0e21e 109 NDBM_File db
9fe6733a 110 datum_key key
a0d0e21e 111
049cc612 112#define ndbm_error(db) dbm_error(db->dbp)
a0d0e21e 113int
049cc612 114ndbm_error(db)
a0d0e21e 115 NDBM_File db
116
049cc612 117#define ndbm_clearerr(db) dbm_clearerr(db->dbp)
a0d0e21e 118void
049cc612 119ndbm_clearerr(db)
a0d0e21e 120 NDBM_File db
121
9fe6733a 122
123#define setFilter(type) \
124 { \
125 if (db->type) \
e62f7e43 126 RETVAL = sv_mortalcopy(db->type) ; \
127 ST(0) = RETVAL ; \
9fe6733a 128 if (db->type && (code == &PL_sv_undef)) { \
129 SvREFCNT_dec(db->type) ; \
130 db->type = NULL ; \
131 } \
132 else if (code) { \
133 if (db->type) \
134 sv_setsv(db->type, code) ; \
135 else \
136 db->type = newSVsv(code) ; \
137 } \
138 }
139
140
141
142SV *
143filter_fetch_key(db, code)
144 NDBM_File db
145 SV * code
146 SV * RETVAL = &PL_sv_undef ;
147 CODE:
148 setFilter(filter_fetch_key) ;
9fe6733a 149
150SV *
151filter_store_key(db, code)
152 NDBM_File db
153 SV * code
154 SV * RETVAL = &PL_sv_undef ;
155 CODE:
156 setFilter(filter_store_key) ;
9fe6733a 157
158SV *
159filter_fetch_value(db, code)
160 NDBM_File db
161 SV * code
162 SV * RETVAL = &PL_sv_undef ;
163 CODE:
164 setFilter(filter_fetch_value) ;
9fe6733a 165
166SV *
167filter_store_value(db, code)
168 NDBM_File db
169 SV * code
170 SV * RETVAL = &PL_sv_undef ;
171 CODE:
172 setFilter(filter_store_value) ;
9fe6733a 173