This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
threads 1.64 (repost)
[perl5.git] / ext / NDBM_File / NDBM_File.xs
CommitLineData
a0d0e21e
LW
1#include "EXTERN.h"
2#include "perl.h"
3#include "XSUB.h"
4#include <ndbm.h>
5
9fe6733a
PM
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
e82f3e3c 19
5046273b 20#if defined(__cplusplus) && defined(HAS_GDBM)
e82f3e3c
SP
21/* gdbm's header file used for compatibility with gdbm */
22/* isn't compatible to C++ syntax, so we need these */
23/* declarations to make everyone happy. */
24EXTERN_C DBM *dbm_open(const char *, int, mode_t);
25EXTERN_C void dbm_close(DBM *);
26EXTERN_C datum dbm_fetch(DBM *, datum);
27EXTERN_C int dbm_store(DBM *, datum, datum, int);
28EXTERN_C int dbm_delete(DBM *, datum);
29EXTERN_C datum dbm_firstkey(DBM *);
30EXTERN_C datum dbm_nextkey(DBM *);
31#endif
32
049cc612 33MODULE = NDBM_File PACKAGE = NDBM_File PREFIX = ndbm_
a0d0e21e
LW
34
35NDBM_File
049cc612 36ndbm_TIEHASH(dbtype, filename, flags, mode)
a0d0e21e
LW
37 char * dbtype
38 char * filename
39 int flags
40 int mode
9fe6733a
PM
41 CODE:
42 {
43 DBM * dbp ;
44
45 RETVAL = NULL ;
8fa7f367 46 if ((dbp = dbm_open(filename, flags, mode))) {
9fe6733a
PM
47 RETVAL = (NDBM_File)safemalloc(sizeof(NDBM_File_type)) ;
48 Zero(RETVAL, 1, NDBM_File_type) ;
49 RETVAL->dbp = dbp ;
50 }
51
52 }
53 OUTPUT:
54 RETVAL
a0d0e21e
LW
55
56void
049cc612 57ndbm_DESTROY(db)
a0d0e21e
LW
58 NDBM_File db
59 CODE:
9fe6733a 60 dbm_close(db->dbp);
eb99164f 61 safefree(db);
a0d0e21e 62
049cc612 63#define ndbm_FETCH(db,key) dbm_fetch(db->dbp,key)
9fe6733a 64datum_value
049cc612 65ndbm_FETCH(db, key)
a0d0e21e 66 NDBM_File db
9fe6733a 67 datum_key key
a0d0e21e 68
049cc612 69#define ndbm_STORE(db,key,value,flags) dbm_store(db->dbp,key,value,flags)
a0d0e21e 70int
049cc612 71ndbm_STORE(db, key, value, flags = DBM_REPLACE)
a0d0e21e 72 NDBM_File db
9fe6733a
PM
73 datum_key key
74 datum_value value
a0d0e21e
LW
75 int flags
76 CLEANUP:
77 if (RETVAL) {
78 if (RETVAL < 0 && errno == EPERM)
79 croak("No write permission to ndbm file");
748a9306 80 croak("ndbm store returned %d, errno %d, key \"%s\"",
a0d0e21e 81 RETVAL,errno,key.dptr);
9fe6733a 82 dbm_clearerr(db->dbp);
a0d0e21e
LW
83 }
84
049cc612 85#define ndbm_DELETE(db,key) dbm_delete(db->dbp,key)
a0d0e21e 86int
049cc612 87ndbm_DELETE(db, key)
a0d0e21e 88 NDBM_File db
9fe6733a 89 datum_key key
a0d0e21e 90
049cc612 91#define ndbm_FIRSTKEY(db) dbm_firstkey(db->dbp)
9fe6733a 92datum_key
049cc612 93ndbm_FIRSTKEY(db)
a0d0e21e
LW
94 NDBM_File db
95
049cc612 96#define ndbm_NEXTKEY(db,key) dbm_nextkey(db->dbp)
9fe6733a 97datum_key
049cc612 98ndbm_NEXTKEY(db, key)
a0d0e21e 99 NDBM_File db
0bf2e707 100 datum_key key = NO_INIT
a0d0e21e 101
049cc612 102#define ndbm_error(db) dbm_error(db->dbp)
a0d0e21e 103int
049cc612 104ndbm_error(db)
a0d0e21e
LW
105 NDBM_File db
106
049cc612 107#define ndbm_clearerr(db) dbm_clearerr(db->dbp)
a0d0e21e 108void
049cc612 109ndbm_clearerr(db)
a0d0e21e
LW
110 NDBM_File db
111
9fe6733a 112
9fe6733a
PM
113SV *
114filter_fetch_key(db, code)
115 NDBM_File db
116 SV * code
117 SV * RETVAL = &PL_sv_undef ;
118 CODE:
6a31061a 119 DBM_setFilter(db->filter_fetch_key, code) ;
9fe6733a
PM
120
121SV *
122filter_store_key(db, code)
123 NDBM_File db
124 SV * code
125 SV * RETVAL = &PL_sv_undef ;
126 CODE:
6a31061a 127 DBM_setFilter(db->filter_store_key, code) ;
9fe6733a
PM
128
129SV *
130filter_fetch_value(db, code)
131 NDBM_File db
132 SV * code
133 SV * RETVAL = &PL_sv_undef ;
134 CODE:
6a31061a 135 DBM_setFilter(db->filter_fetch_value, code) ;
9fe6733a
PM
136
137SV *
138filter_store_value(db, code)
139 NDBM_File db
140 SV * code
141 SV * RETVAL = &PL_sv_undef ;
142 CODE:
6a31061a 143 DBM_setFilter(db->filter_store_value, code) ;
9fe6733a 144