Upgrade to Win32-0.37
[p5sagit/p5-mst-13.2.git] / ext / NDBM_File / NDBM_File.xs
1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4 #if defined(I_GDBM_NDBM)
5 #  include <gdbm-ndbm.h> /* Debian compatibility version */
6 #elif defined(I_GDBMNDBM)
7 #  include <gdbm/ndbm.h> /* RedHat compatibility version */
8 #elif defined(I_NDBM)
9 #include <ndbm.h>
10 #endif
11
12 typedef struct {
13         DBM *   dbp ;
14         SV *    filter_fetch_key ;
15         SV *    filter_store_key ;
16         SV *    filter_fetch_value ;
17         SV *    filter_store_value ;
18         int     filtering ;
19         } NDBM_File_type;
20
21 typedef NDBM_File_type * NDBM_File ;
22 typedef datum datum_key ;
23 typedef datum datum_value ;
24
25
26 #if defined(__cplusplus) && defined(HAS_GDBM)
27 /* gdbm's header file used for compatibility with gdbm */
28 /* isn't compatible to C++ syntax, so we need these */
29 /* declarations to make everyone happy. */
30 EXTERN_C DBM *dbm_open(const char *, int, mode_t);
31 EXTERN_C void dbm_close(DBM *);
32 EXTERN_C datum dbm_fetch(DBM *, datum);
33 EXTERN_C int dbm_store(DBM *, datum, datum, int);
34 EXTERN_C int dbm_delete(DBM *, datum);
35 EXTERN_C datum dbm_firstkey(DBM *);
36 EXTERN_C datum dbm_nextkey(DBM *);
37 #endif
38
39 MODULE = NDBM_File      PACKAGE = NDBM_File     PREFIX = ndbm_
40
41 NDBM_File
42 ndbm_TIEHASH(dbtype, filename, flags, mode)
43         char *          dbtype
44         char *          filename
45         int             flags
46         int             mode
47         CODE:
48         {
49             DBM *       dbp ;
50
51             RETVAL = NULL ;
52             if ((dbp =  dbm_open(filename, flags, mode))) {
53                 RETVAL = (NDBM_File)safemalloc(sizeof(NDBM_File_type)) ;
54                 Zero(RETVAL, 1, NDBM_File_type) ;
55                 RETVAL->dbp = dbp ;
56             }
57             
58         }
59         OUTPUT:
60           RETVAL
61
62 void
63 ndbm_DESTROY(db)
64         NDBM_File       db
65         CODE:
66         dbm_close(db->dbp);
67         safefree(db);
68
69 #define ndbm_FETCH(db,key)                      dbm_fetch(db->dbp,key)
70 datum_value
71 ndbm_FETCH(db, key)
72         NDBM_File       db
73         datum_key       key
74
75 #define ndbm_STORE(db,key,value,flags)          dbm_store(db->dbp,key,value,flags)
76 int
77 ndbm_STORE(db, key, value, flags = DBM_REPLACE)
78         NDBM_File       db
79         datum_key       key
80         datum_value     value
81         int             flags
82     CLEANUP:
83         if (RETVAL) {
84             if (RETVAL < 0 && errno == EPERM)
85                 croak("No write permission to ndbm file");
86             croak("ndbm store returned %d, errno %d, key \"%s\"",
87                         RETVAL,errno,key.dptr);
88             dbm_clearerr(db->dbp);
89         }
90
91 #define ndbm_DELETE(db,key)                     dbm_delete(db->dbp,key)
92 int
93 ndbm_DELETE(db, key)
94         NDBM_File       db
95         datum_key       key
96
97 #define ndbm_FIRSTKEY(db)                       dbm_firstkey(db->dbp)
98 datum_key
99 ndbm_FIRSTKEY(db)
100         NDBM_File       db
101
102 #define ndbm_NEXTKEY(db,key)                    dbm_nextkey(db->dbp)
103 datum_key
104 ndbm_NEXTKEY(db, key)
105         NDBM_File       db
106         datum_key       key = NO_INIT
107
108 #define ndbm_error(db)                          dbm_error(db->dbp)
109 int
110 ndbm_error(db)
111         NDBM_File       db
112
113 #define ndbm_clearerr(db)                       dbm_clearerr(db->dbp)
114 void
115 ndbm_clearerr(db)
116         NDBM_File       db
117
118
119 SV *
120 filter_fetch_key(db, code)
121         NDBM_File       db
122         SV *            code
123         SV *            RETVAL = &PL_sv_undef ;
124         CODE:
125             DBM_setFilter(db->filter_fetch_key, code) ;
126
127 SV *
128 filter_store_key(db, code)
129         NDBM_File       db
130         SV *            code
131         SV *            RETVAL =  &PL_sv_undef ;
132         CODE:
133             DBM_setFilter(db->filter_store_key, code) ;
134
135 SV *
136 filter_fetch_value(db, code)
137         NDBM_File       db
138         SV *            code
139         SV *            RETVAL =  &PL_sv_undef ;
140         CODE:
141             DBM_setFilter(db->filter_fetch_value, code) ;
142
143 SV *
144 filter_store_value(db, code)
145         NDBM_File       db
146         SV *            code
147         SV *            RETVAL =  &PL_sv_undef ;
148         CODE:
149             DBM_setFilter(db->filter_store_value, code) ;
150