perl 5.0 alpha 8
[p5sagit/p5-mst-13.2.git] / SDBM_File.c
CommitLineData
463ee0b2 1#include "EXTERN.h"
2#include "perl.h"
3#include "XSUB.h"
4#include "ext/dbm/sdbm/sdbm.h"
5
6typedef DBM* SDBM_File;
7#define sdbm_new(dbtype,filename,flags,mode) sdbm_open(filename,flags,mode)
ed6116ce 8#define nextkey(db,key) sdbm_nextkey(db)
463ee0b2 9
10static int
2304df62 11XS_SDBM_File_sdbm_new(ix, ax, items)
463ee0b2 12register int ix;
2304df62 13register int ax;
463ee0b2 14register int items;
15{
2304df62 16 if (items != 4) {
463ee0b2 17 croak("Usage: SDBM_File::new(dbtype, filename, flags, mode)");
18 }
19 {
20 char * dbtype = SvPV(ST(1),na);
21 char * filename = SvPV(ST(2),na);
22 int flags = (int)SvIV(ST(3));
23 int mode = (int)SvIV(ST(4));
24 SDBM_File RETVAL;
25
26 RETVAL = sdbm_new(dbtype, filename, flags, mode);
8990e307 27 ST(0) = sv_newmortal();
463ee0b2 28 sv_setptrobj(ST(0), RETVAL, "SDBM_File");
29 }
2304df62 30 return ax;
463ee0b2 31}
32
33static int
2304df62 34XS_SDBM_File_sdbm_DESTROY(ix, ax, items)
463ee0b2 35register int ix;
2304df62 36register int ax;
463ee0b2 37register int items;
38{
2304df62 39 if (items != 1) {
463ee0b2 40 croak("Usage: SDBM_File::DESTROY(db)");
41 }
42 {
43 SDBM_File db;
44
8990e307 45 if (SvROK(ST(1)))
ed6116ce 46 db = (SDBM_File)(unsigned long)SvNV((SV*)SvRV(ST(1)));
463ee0b2 47 else
8990e307 48 croak("db is not a reference");
463ee0b2 49 sdbm_close(db);
50 }
2304df62 51 return ax;
463ee0b2 52}
53
54static int
2304df62 55XS_SDBM_File_sdbm_fetch(ix, ax, items)
463ee0b2 56register int ix;
2304df62 57register int ax;
463ee0b2 58register int items;
59{
2304df62 60 if (items != 2) {
463ee0b2 61 croak("Usage: SDBM_File::fetch(db, key)");
62 }
63 {
64 SDBM_File db;
65 datum key;
66 datum RETVAL;
67
68 if (sv_isa(ST(1), "SDBM_File"))
ed6116ce 69 db = (SDBM_File)(unsigned long)SvNV((SV*)SvRV(ST(1)));
463ee0b2 70 else
71 croak("db is not of type SDBM_File");
72
2304df62 73 key.dptr = SvPV(ST(2), na);
74 key.dsize = (int)na;;
463ee0b2 75
76 RETVAL = sdbm_fetch(db, key);
8990e307 77 ST(0) = sv_newmortal();
463ee0b2 78 sv_setpvn(ST(0), RETVAL.dptr, RETVAL.dsize);
79 }
2304df62 80 return ax;
463ee0b2 81}
82
83static int
2304df62 84XS_SDBM_File_sdbm_store(ix, ax, items)
463ee0b2 85register int ix;
2304df62 86register int ax;
463ee0b2 87register int items;
88{
89 if (items < 3 || items > 4) {
90 croak("Usage: SDBM_File::store(db, key, value, flags = DBM_REPLACE)");
91 }
92 {
93 SDBM_File db;
94 datum key;
95 datum value;
96 int flags;
97 int RETVAL;
98
99 if (sv_isa(ST(1), "SDBM_File"))
ed6116ce 100 db = (SDBM_File)(unsigned long)SvNV((SV*)SvRV(ST(1)));
463ee0b2 101 else
102 croak("db is not of type SDBM_File");
103
2304df62 104 key.dptr = SvPV(ST(2), na);
105 key.dsize = (int)na;;
463ee0b2 106
2304df62 107 value.dptr = SvPV(ST(3), na);
108 value.dsize = (int)na;;
463ee0b2 109
110 if (items < 4)
111 flags = DBM_REPLACE;
112 else {
113 flags = (int)SvIV(ST(4));
114 }
115
116 RETVAL = sdbm_store(db, key, value, flags);
8990e307 117 ST(0) = sv_newmortal();
463ee0b2 118 sv_setiv(ST(0), (I32)RETVAL);
119 }
2304df62 120 return ax;
463ee0b2 121}
122
123static int
2304df62 124XS_SDBM_File_sdbm_delete(ix, ax, items)
463ee0b2 125register int ix;
2304df62 126register int ax;
463ee0b2 127register int items;
128{
2304df62 129 if (items != 2) {
463ee0b2 130 croak("Usage: SDBM_File::delete(db, key)");
131 }
132 {
133 SDBM_File db;
134 datum key;
135 int RETVAL;
136
137 if (sv_isa(ST(1), "SDBM_File"))
ed6116ce 138 db = (SDBM_File)(unsigned long)SvNV((SV*)SvRV(ST(1)));
463ee0b2 139 else
140 croak("db is not of type SDBM_File");
141
2304df62 142 key.dptr = SvPV(ST(2), na);
143 key.dsize = (int)na;;
463ee0b2 144
145 RETVAL = sdbm_delete(db, key);
8990e307 146 ST(0) = sv_newmortal();
463ee0b2 147 sv_setiv(ST(0), (I32)RETVAL);
148 }
2304df62 149 return ax;
463ee0b2 150}
151
152static int
2304df62 153XS_SDBM_File_sdbm_firstkey(ix, ax, items)
463ee0b2 154register int ix;
2304df62 155register int ax;
463ee0b2 156register int items;
157{
2304df62 158 if (items != 1) {
463ee0b2 159 croak("Usage: SDBM_File::firstkey(db)");
160 }
161 {
162 SDBM_File db;
163 datum RETVAL;
164
165 if (sv_isa(ST(1), "SDBM_File"))
ed6116ce 166 db = (SDBM_File)(unsigned long)SvNV((SV*)SvRV(ST(1)));
463ee0b2 167 else
168 croak("db is not of type SDBM_File");
169
170 RETVAL = sdbm_firstkey(db);
8990e307 171 ST(0) = sv_newmortal();
463ee0b2 172 sv_setpvn(ST(0), RETVAL.dptr, RETVAL.dsize);
173 }
2304df62 174 return ax;
463ee0b2 175}
176
177static int
2304df62 178XS_SDBM_File_nextkey(ix, ax, items)
463ee0b2 179register int ix;
2304df62 180register int ax;
463ee0b2 181register int items;
182{
2304df62 183 if (items != 2) {
463ee0b2 184 croak("Usage: SDBM_File::nextkey(db, key)");
185 }
186 {
187 SDBM_File db;
188 datum key;
189 datum RETVAL;
190
191 if (sv_isa(ST(1), "SDBM_File"))
ed6116ce 192 db = (SDBM_File)(unsigned long)SvNV((SV*)SvRV(ST(1)));
463ee0b2 193 else
194 croak("db is not of type SDBM_File");
195
2304df62 196 key.dptr = SvPV(ST(2), na);
197 key.dsize = (int)na;;
463ee0b2 198
ed6116ce 199 RETVAL = nextkey(db, key);
8990e307 200 ST(0) = sv_newmortal();
463ee0b2 201 sv_setpvn(ST(0), RETVAL.dptr, RETVAL.dsize);
202 }
2304df62 203 return ax;
463ee0b2 204}
205
206static int
2304df62 207XS_SDBM_File_sdbm_error(ix, ax, items)
463ee0b2 208register int ix;
2304df62 209register int ax;
463ee0b2 210register int items;
211{
2304df62 212 if (items != 1) {
463ee0b2 213 croak("Usage: SDBM_File::error(db)");
214 }
215 {
216 SDBM_File db;
217 int RETVAL;
218
219 if (sv_isa(ST(1), "SDBM_File"))
ed6116ce 220 db = (SDBM_File)(unsigned long)SvNV((SV*)SvRV(ST(1)));
463ee0b2 221 else
222 croak("db is not of type SDBM_File");
223
224 RETVAL = sdbm_error(db);
8990e307 225 ST(0) = sv_newmortal();
463ee0b2 226 sv_setiv(ST(0), (I32)RETVAL);
227 }
2304df62 228 return ax;
463ee0b2 229}
230
231static int
2304df62 232XS_SDBM_File_sdbm_clearerr(ix, ax, items)
463ee0b2 233register int ix;
2304df62 234register int ax;
463ee0b2 235register int items;
236{
2304df62 237 if (items != 1) {
463ee0b2 238 croak("Usage: SDBM_File::clearerr(db)");
239 }
240 {
241 SDBM_File db;
242 int RETVAL;
243
244 if (sv_isa(ST(1), "SDBM_File"))
ed6116ce 245 db = (SDBM_File)(unsigned long)SvNV((SV*)SvRV(ST(1)));
463ee0b2 246 else
247 croak("db is not of type SDBM_File");
248
249 RETVAL = sdbm_clearerr(db);
8990e307 250 ST(0) = sv_newmortal();
463ee0b2 251 sv_setiv(ST(0), (I32)RETVAL);
252 }
2304df62 253 return ax;
463ee0b2 254}
255
2304df62 256int boot_SDBM_File(ix,ax,items)
463ee0b2 257int ix;
2304df62 258int ax;
463ee0b2 259int items;
260{
261 char* file = __FILE__;
262
263 newXSUB("SDBM_File::new", 0, XS_SDBM_File_sdbm_new, file);
264 newXSUB("SDBM_File::DESTROY", 0, XS_SDBM_File_sdbm_DESTROY, file);
265 newXSUB("SDBM_File::fetch", 0, XS_SDBM_File_sdbm_fetch, file);
266 newXSUB("SDBM_File::store", 0, XS_SDBM_File_sdbm_store, file);
267 newXSUB("SDBM_File::delete", 0, XS_SDBM_File_sdbm_delete, file);
268 newXSUB("SDBM_File::firstkey", 0, XS_SDBM_File_sdbm_firstkey, file);
ed6116ce 269 newXSUB("SDBM_File::nextkey", 0, XS_SDBM_File_nextkey, file);
463ee0b2 270 newXSUB("SDBM_File::error", 0, XS_SDBM_File_sdbm_error, file);
271 newXSUB("SDBM_File::clearerr", 0, XS_SDBM_File_sdbm_clearerr, file);
272}