This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
fix bad free in do_exec3()
[perl5.git] / ext / NDBM_File / NDBM_File.xs
... / ...
CommitLineData
1#include "EXTERN.h"
2#include "perl.h"
3#include "XSUB.h"
4#include <ndbm.h>
5
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
19MODULE = NDBM_File PACKAGE = NDBM_File PREFIX = ndbm_
20
21NDBM_File
22ndbm_TIEHASH(dbtype, filename, flags, mode)
23 char * dbtype
24 char * filename
25 int flags
26 int mode
27 CODE:
28 {
29 DBM * dbp ;
30
31 RETVAL = NULL ;
32 if ((dbp = dbm_open(filename, flags, mode))) {
33 RETVAL = (NDBM_File)safemalloc(sizeof(NDBM_File_type)) ;
34 Zero(RETVAL, 1, NDBM_File_type) ;
35 RETVAL->dbp = dbp ;
36 }
37
38 }
39 OUTPUT:
40 RETVAL
41
42void
43ndbm_DESTROY(db)
44 NDBM_File db
45 CODE:
46 dbm_close(db->dbp);
47 safefree(db);
48
49#define ndbm_FETCH(db,key) dbm_fetch(db->dbp,key)
50datum_value
51ndbm_FETCH(db, key)
52 NDBM_File db
53 datum_key key
54
55#define ndbm_STORE(db,key,value,flags) dbm_store(db->dbp,key,value,flags)
56int
57ndbm_STORE(db, key, value, flags = DBM_REPLACE)
58 NDBM_File db
59 datum_key key
60 datum_value value
61 int flags
62 CLEANUP:
63 if (RETVAL) {
64 if (RETVAL < 0 && errno == EPERM)
65 croak("No write permission to ndbm file");
66 croak("ndbm store returned %d, errno %d, key \"%s\"",
67 RETVAL,errno,key.dptr);
68 dbm_clearerr(db->dbp);
69 }
70
71#define ndbm_DELETE(db,key) dbm_delete(db->dbp,key)
72int
73ndbm_DELETE(db, key)
74 NDBM_File db
75 datum_key key
76
77#define ndbm_FIRSTKEY(db) dbm_firstkey(db->dbp)
78datum_key
79ndbm_FIRSTKEY(db)
80 NDBM_File db
81
82#define ndbm_NEXTKEY(db,key) dbm_nextkey(db->dbp)
83datum_key
84ndbm_NEXTKEY(db, key)
85 NDBM_File db
86 datum_key key = NO_INIT
87
88#define ndbm_error(db) dbm_error(db->dbp)
89int
90ndbm_error(db)
91 NDBM_File db
92
93#define ndbm_clearerr(db) dbm_clearerr(db->dbp)
94void
95ndbm_clearerr(db)
96 NDBM_File db
97
98
99SV *
100filter_fetch_key(db, code)
101 NDBM_File db
102 SV * code
103 SV * RETVAL = &PL_sv_undef ;
104 CODE:
105 DBM_setFilter(db->filter_fetch_key, code) ;
106
107SV *
108filter_store_key(db, code)
109 NDBM_File db
110 SV * code
111 SV * RETVAL = &PL_sv_undef ;
112 CODE:
113 DBM_setFilter(db->filter_store_key, code) ;
114
115SV *
116filter_fetch_value(db, code)
117 NDBM_File db
118 SV * code
119 SV * RETVAL = &PL_sv_undef ;
120 CODE:
121 DBM_setFilter(db->filter_fetch_value, code) ;
122
123SV *
124filter_store_value(db, code)
125 NDBM_File db
126 SV * code
127 SV * RETVAL = &PL_sv_undef ;
128 CODE:
129 DBM_setFilter(db->filter_store_value, code) ;
130