This is my patch patch.1l for perl5.001.
[p5sagit/p5-mst-13.2.git] / ext / GDBM_File / GDBM_File.xs
CommitLineData
a0d0e21e 1#include "EXTERN.h"
2#include "perl.h"
3#include "XSUB.h"
4
5#include <gdbm.h>
6#include <fcntl.h>
7
8typedef GDBM_FILE GDBM_File;
9
10#define GDBM_BLOCKSIZE 0 /* gdbm defaults to stat blocksize */
11#define gdbm_TIEHASH(dbtype, name, read_write, mode, fatal_func) \
12 gdbm_open(name, GDBM_BLOCKSIZE, read_write, mode, fatal_func)
13
14#define gdbm_FETCH(db,key) gdbm_fetch(db,key)
15#define gdbm_STORE(db,key,value,flags) gdbm_store(db,key,value,flags)
16#define gdbm_DELETE(db,key) gdbm_delete(db,key)
17#define gdbm_FIRSTKEY(db) gdbm_firstkey(db)
18#define gdbm_NEXTKEY(db,key) gdbm_nextkey(db,key)
19
20typedef datum gdatum;
21
22typedef void (*FATALFUNC)();
23
24static int
25not_here(s)
26char *s;
27{
28 croak("GDBM_File::%s not implemented on this architecture", s);
29 return -1;
30}
31
32static double
33constant(name, arg)
34char *name;
35int arg;
36{
37 errno = 0;
38 switch (*name) {
39 case 'A':
40 break;
41 case 'B':
42 break;
43 case 'C':
44 break;
45 case 'D':
46 break;
47 case 'E':
48 break;
49 case 'F':
50 break;
51 case 'G':
52 if (strEQ(name, "GDBM_CACHESIZE"))
53#ifdef GDBM_CACHESIZE
54 return GDBM_CACHESIZE;
55#else
56 goto not_there;
57#endif
58 if (strEQ(name, "GDBM_FAST"))
59#ifdef GDBM_FAST
60 return GDBM_FAST;
61#else
62 goto not_there;
63#endif
64 if (strEQ(name, "GDBM_FASTMODE"))
65#ifdef GDBM_FASTMODE
66 return GDBM_FASTMODE;
67#else
68 goto not_there;
69#endif
70 if (strEQ(name, "GDBM_INSERT"))
71#ifdef GDBM_INSERT
72 return GDBM_INSERT;
73#else
74 goto not_there;
75#endif
76 if (strEQ(name, "GDBM_NEWDB"))
77#ifdef GDBM_NEWDB
78 return GDBM_NEWDB;
79#else
80 goto not_there;
81#endif
82 if (strEQ(name, "GDBM_READER"))
83#ifdef GDBM_READER
84 return GDBM_READER;
85#else
86 goto not_there;
87#endif
88 if (strEQ(name, "GDBM_REPLACE"))
89#ifdef GDBM_REPLACE
90 return GDBM_REPLACE;
91#else
92 goto not_there;
93#endif
94 if (strEQ(name, "GDBM_WRCREAT"))
95#ifdef GDBM_WRCREAT
96 return GDBM_WRCREAT;
97#else
98 goto not_there;
99#endif
100 if (strEQ(name, "GDBM_WRITER"))
101#ifdef GDBM_WRITER
102 return GDBM_WRITER;
103#else
104 goto not_there;
105#endif
106 break;
107 case 'H':
108 break;
109 case 'I':
110 break;
111 case 'J':
112 break;
113 case 'K':
114 break;
115 case 'L':
116 break;
117 case 'M':
118 break;
119 case 'N':
120 break;
121 case 'O':
122 break;
123 case 'P':
124 break;
125 case 'Q':
126 break;
127 case 'R':
128 break;
129 case 'S':
130 break;
131 case 'T':
132 break;
133 case 'U':
134 break;
135 case 'V':
136 break;
137 case 'W':
138 break;
139 case 'X':
140 break;
141 case 'Y':
142 break;
143 case 'Z':
144 break;
145 }
146 errno = EINVAL;
147 return 0;
148
149not_there:
150 errno = ENOENT;
151 return 0;
152}
153
154MODULE = GDBM_File PACKAGE = GDBM_File PREFIX = gdbm_
155
156double
157constant(name,arg)
158 char * name
159 int arg
160
161
162GDBM_File
163gdbm_TIEHASH(dbtype, name, read_write, mode, fatal_func = (FATALFUNC)croak)
164 char * dbtype
165 char * name
166 int read_write
167 int mode
168 FATALFUNC fatal_func
169
170void
171gdbm_close(db)
172 GDBM_File db
173 CLEANUP:
174
175void
176gdbm_DESTROY(db)
177 GDBM_File db
178 CODE:
179 gdbm_close(db);
180
181gdatum
182gdbm_FETCH(db, key)
183 GDBM_File db
184 datum key
185
186int
187gdbm_STORE(db, key, value, flags = GDBM_REPLACE)
188 GDBM_File db
189 datum key
190 datum value
191 int flags
192 CLEANUP:
193 if (RETVAL) {
194 if (RETVAL < 0 && errno == EPERM)
195 croak("No write permission to gdbm file");
748a9306 196 croak("gdbm store returned %d, errno %d, key \"%.*s\"",
a0d0e21e 197 RETVAL,errno,key.dsize,key.dptr);
198 /* gdbm_clearerr(db); */
199 }
200
201int
202gdbm_DELETE(db, key)
203 GDBM_File db
204 datum key
205
206gdatum
207gdbm_FIRSTKEY(db)
208 GDBM_File db
209
210gdatum
211gdbm_NEXTKEY(db, key)
212 GDBM_File db
213 datum key
214
215int
216gdbm_reorganize(db)
217 GDBM_File db
218
3b35bae3 219
220void
221gdbm_sync(db)
222 GDBM_File db
223
224int
225gdbm_exists(db, key)
226 GDBM_File db
227 datum key
228
229int
230gdbm_setopt (db, optflag, optval, optlen)
231 GDBM_File db
232 int optflag
233 int &optval
234 int optlen
235