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