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