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