Commit | Line | Data |
463ee0b2 |
1 | #include "EXTERN.h" |
2 | #include "perl.h" |
3 | #include "XSUB.h" |
4 | #include "ext/dbm/sdbm/sdbm.h" |
5 | |
6 | typedef 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 | |
10 | static int |
2304df62 |
11 | XS_SDBM_File_sdbm_new(ix, ax, items) |
463ee0b2 |
12 | register int ix; |
2304df62 |
13 | register int ax; |
463ee0b2 |
14 | register 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 | |
33 | static int |
2304df62 |
34 | XS_SDBM_File_sdbm_DESTROY(ix, ax, items) |
463ee0b2 |
35 | register int ix; |
2304df62 |
36 | register int ax; |
463ee0b2 |
37 | register 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 | |
54 | static int |
2304df62 |
55 | XS_SDBM_File_sdbm_fetch(ix, ax, items) |
463ee0b2 |
56 | register int ix; |
2304df62 |
57 | register int ax; |
463ee0b2 |
58 | register 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 | |
83 | static int |
2304df62 |
84 | XS_SDBM_File_sdbm_store(ix, ax, items) |
463ee0b2 |
85 | register int ix; |
2304df62 |
86 | register int ax; |
463ee0b2 |
87 | register 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 | |
123 | static int |
2304df62 |
124 | XS_SDBM_File_sdbm_delete(ix, ax, items) |
463ee0b2 |
125 | register int ix; |
2304df62 |
126 | register int ax; |
463ee0b2 |
127 | register 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 | |
152 | static int |
2304df62 |
153 | XS_SDBM_File_sdbm_firstkey(ix, ax, items) |
463ee0b2 |
154 | register int ix; |
2304df62 |
155 | register int ax; |
463ee0b2 |
156 | register 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 | |
177 | static int |
2304df62 |
178 | XS_SDBM_File_nextkey(ix, ax, items) |
463ee0b2 |
179 | register int ix; |
2304df62 |
180 | register int ax; |
463ee0b2 |
181 | register 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 | |
206 | static int |
2304df62 |
207 | XS_SDBM_File_sdbm_error(ix, ax, items) |
463ee0b2 |
208 | register int ix; |
2304df62 |
209 | register int ax; |
463ee0b2 |
210 | register 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 | |
231 | static int |
2304df62 |
232 | XS_SDBM_File_sdbm_clearerr(ix, ax, items) |
463ee0b2 |
233 | register int ix; |
2304df62 |
234 | register int ax; |
463ee0b2 |
235 | register 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 |
256 | int boot_SDBM_File(ix,ax,items) |
463ee0b2 |
257 | int ix; |
2304df62 |
258 | int ax; |
463ee0b2 |
259 | int 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 | } |