This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
call_(pv|etc.) for Devel::PPPort
[perl5.git] / ext / GDBM_File / GDBM_File.xs
CommitLineData
a0d0e21e
LW
1#include "EXTERN.h"
2#include "perl.h"
3#include "XSUB.h"
4
5#include <gdbm.h>
6#include <fcntl.h>
7
9fe6733a
PM
8typedef struct {
9 GDBM_FILE dbp ;
10 SV * filter_fetch_key ;
11 SV * filter_store_key ;
12 SV * filter_fetch_value ;
13 SV * filter_store_value ;
14 int filtering ;
15 } GDBM_File_type;
16
17typedef GDBM_File_type * GDBM_File ;
18typedef datum datum_key ;
19typedef datum datum_value ;
0bf2e707 20typedef datum datum_key_copy;
9fe6733a 21
9fe6733a 22#define GDBM_BLOCKSIZE 0 /* gdbm defaults to stat blocksize */
a0d0e21e 23
12f917ad 24typedef void (*FATALFUNC)();
a0d0e21e 25
8063af02 26#ifndef GDBM_FAST
a0d0e21e 27static int
f0f333f4 28not_here(char *s)
a0d0e21e
LW
29{
30 croak("GDBM_File::%s not implemented on this architecture", s);
31 return -1;
32}
8063af02 33#endif
a0d0e21e 34
097d66a9
GS
35/* GDBM allocates the datum with system malloc() and expects the user
36 * to free() it. So we either have to free() it immediately, or have
37 * perl free() it when it deallocates the SV, depending on whether
38 * perl uses malloc()/free() or not. */
39static void
caa0600b 40output_datum(pTHX_ SV *arg, char *str, int size)
097d66a9 41{
7bab3ede 42#if (!defined(MYMALLOC) || (defined(MYMALLOC) && defined(PERL_POLLUTE_MALLOC)))
097d66a9
GS
43 sv_usepvn(arg, str, size);
44#else
45 sv_setpvn(arg, str, size);
46 safesysfree(str);
47#endif
48}
49
e50aee73
AD
50/* Versions of gdbm prior to 1.7x might not have the gdbm_sync,
51 gdbm_exists, and gdbm_setopt functions. Apparently Slackware
52 (Linux) 2.1 contains gdbm-1.5 (which dates back to 1991).
53*/
54#ifndef GDBM_FAST
55#define gdbm_exists(db,key) not_here("gdbm_exists")
56#define gdbm_sync(db) (void) not_here("gdbm_sync")
57#define gdbm_setopt(db,optflag,optval,optlen) not_here("gdbm_setopt")
58#endif
59
1cb0fb50 60#include "const-c.inc"
a0d0e21e
LW
61
62MODULE = GDBM_File PACKAGE = GDBM_File PREFIX = gdbm_
63
1cb0fb50 64INCLUDE: const-xs.inc
a0d0e21e
LW
65
66GDBM_File
67gdbm_TIEHASH(dbtype, name, read_write, mode, fatal_func = (FATALFUNC)croak)
68 char * dbtype
69 char * name
70 int read_write
71 int mode
72 FATALFUNC fatal_func
9fe6733a
PM
73 CODE:
74 {
75 GDBM_FILE dbp ;
a0d0e21e 76
9fe6733a 77 RETVAL = NULL ;
8063af02 78 if ((dbp = gdbm_open(name, GDBM_BLOCKSIZE, read_write, mode, fatal_func))) {
9fe6733a
PM
79 RETVAL = (GDBM_File)safemalloc(sizeof(GDBM_File_type)) ;
80 Zero(RETVAL, 1, GDBM_File_type) ;
81 RETVAL->dbp = dbp ;
82 }
83
84 }
85 OUTPUT:
86 RETVAL
87
88
89#define gdbm_close(db) gdbm_close(db->dbp)
a0d0e21e
LW
90void
91gdbm_close(db)
92 GDBM_File db
93 CLEANUP:
94
95void
96gdbm_DESTROY(db)
97 GDBM_File db
98 CODE:
99 gdbm_close(db);
eb99164f 100 safefree(db);
a0d0e21e 101
9fe6733a
PM
102#define gdbm_FETCH(db,key) gdbm_fetch(db->dbp,key)
103datum_value
a0d0e21e
LW
104gdbm_FETCH(db, key)
105 GDBM_File db
0bf2e707 106 datum_key_copy key
a0d0e21e 107
9fe6733a 108#define gdbm_STORE(db,key,value,flags) gdbm_store(db->dbp,key,value,flags)
a0d0e21e
LW
109int
110gdbm_STORE(db, key, value, flags = GDBM_REPLACE)
111 GDBM_File db
9fe6733a
PM
112 datum_key key
113 datum_value value
a0d0e21e
LW
114 int flags
115 CLEANUP:
116 if (RETVAL) {
117 if (RETVAL < 0 && errno == EPERM)
118 croak("No write permission to gdbm file");
748a9306 119 croak("gdbm store returned %d, errno %d, key \"%.*s\"",
a0d0e21e 120 RETVAL,errno,key.dsize,key.dptr);
a0d0e21e
LW
121 }
122
9fe6733a 123#define gdbm_DELETE(db,key) gdbm_delete(db->dbp,key)
a0d0e21e
LW
124int
125gdbm_DELETE(db, key)
126 GDBM_File db
9fe6733a 127 datum_key key
a0d0e21e 128
9fe6733a
PM
129#define gdbm_FIRSTKEY(db) gdbm_firstkey(db->dbp)
130datum_key
a0d0e21e
LW
131gdbm_FIRSTKEY(db)
132 GDBM_File db
133
9fe6733a
PM
134#define gdbm_NEXTKEY(db,key) gdbm_nextkey(db->dbp,key)
135datum_key
a0d0e21e
LW
136gdbm_NEXTKEY(db, key)
137 GDBM_File db
0bf2e707 138 datum_key key
a0d0e21e 139
9fe6733a 140#define gdbm_reorganize(db) gdbm_reorganize(db->dbp)
a0d0e21e
LW
141int
142gdbm_reorganize(db)
143 GDBM_File db
144
3b35bae3 145
9fe6733a 146#define gdbm_sync(db) gdbm_sync(db->dbp)
3b35bae3
AD
147void
148gdbm_sync(db)
149 GDBM_File db
150
9fe6733a 151#define gdbm_EXISTS(db,key) gdbm_exists(db->dbp,key)
3b35bae3 152int
c07a80fd 153gdbm_EXISTS(db, key)
3b35bae3 154 GDBM_File db
9fe6733a 155 datum_key key
3b35bae3 156
9fe6733a 157#define gdbm_setopt(db,optflag, optval, optlen) gdbm_setopt(db->dbp,optflag, optval, optlen)
3b35bae3
AD
158int
159gdbm_setopt (db, optflag, optval, optlen)
160 GDBM_File db
161 int optflag
162 int &optval
163 int optlen
164
9fe6733a 165
9fe6733a
PM
166SV *
167filter_fetch_key(db, code)
168 GDBM_File db
169 SV * code
170 SV * RETVAL = &PL_sv_undef ;
171 CODE:
6a31061a 172 DBM_setFilter(db->filter_fetch_key, code) ;
9fe6733a
PM
173
174SV *
175filter_store_key(db, code)
176 GDBM_File db
177 SV * code
178 SV * RETVAL = &PL_sv_undef ;
179 CODE:
6a31061a 180 DBM_setFilter(db->filter_store_key, code) ;
9fe6733a
PM
181
182SV *
183filter_fetch_value(db, code)
184 GDBM_File db
185 SV * code
186 SV * RETVAL = &PL_sv_undef ;
187 CODE:
6a31061a 188 DBM_setFilter(db->filter_fetch_value, code) ;
9fe6733a
PM
189
190SV *
191filter_store_value(db, code)
192 GDBM_File db
193 SV * code
194 SV * RETVAL = &PL_sv_undef ;
195 CODE:
6a31061a 196 DBM_setFilter(db->filter_store_value, code) ;
9fe6733a 197