This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Replace all reads of RXf_UTF8 with RX_UTF8().
[perl5.git] / ext / SDBM_File / SDBM_File.xs
1 #define PERL_NO_GET_CONTEXT
2 #include "EXTERN.h"
3 #include "perl.h"
4 #include "XSUB.h"
5 #include "sdbm/sdbm.h"
6
7 typedef struct {
8         DBM *   dbp ;
9         SV *    filter_fetch_key ;
10         SV *    filter_store_key ;
11         SV *    filter_fetch_value ;
12         SV *    filter_store_value ;
13         int     filtering ;
14         } SDBM_File_type;
15
16 typedef SDBM_File_type * SDBM_File ;
17 typedef datum datum_key ;
18 typedef datum datum_value ;
19
20 #define sdbm_TIEHASH(dbtype,filename,flags,mode) sdbm_open(filename,flags,mode)
21 #define sdbm_FETCH(db,key)                      sdbm_fetch(db->dbp,key)
22 #define sdbm_STORE(db,key,value,flags)          sdbm_store(db->dbp,key,value,flags)
23 #define sdbm_DELETE(db,key)                     sdbm_delete(db->dbp,key)
24 #define sdbm_EXISTS(db,key)                     sdbm_exists(db->dbp,key)
25 #define sdbm_FIRSTKEY(db)                       sdbm_firstkey(db->dbp)
26 #define sdbm_NEXTKEY(db,key)                    sdbm_nextkey(db->dbp)
27
28
29 MODULE = SDBM_File      PACKAGE = SDBM_File     PREFIX = sdbm_
30
31 SDBM_File
32 sdbm_TIEHASH(dbtype, filename, flags, mode)
33         char *          dbtype
34         char *          filename
35         int             flags
36         int             mode
37         CODE:
38         {
39             DBM *       dbp ;
40
41             RETVAL = NULL ;
42             if ((dbp = sdbm_open(filename,flags,mode))) {
43                 RETVAL = (SDBM_File)safemalloc(sizeof(SDBM_File_type)) ;
44                 Zero(RETVAL, 1, SDBM_File_type) ;
45                 RETVAL->dbp = dbp ;
46             }
47             
48         }
49         OUTPUT:
50           RETVAL
51
52 void
53 sdbm_DESTROY(db)
54         SDBM_File       db
55         CODE:
56         if (db) {
57             sdbm_close(db->dbp);
58             if (db->filter_fetch_key)
59                 SvREFCNT_dec(db->filter_fetch_key) ;
60             if (db->filter_store_key)
61                 SvREFCNT_dec(db->filter_store_key) ;
62             if (db->filter_fetch_value)
63                 SvREFCNT_dec(db->filter_fetch_value) ;
64             if (db->filter_store_value)
65                 SvREFCNT_dec(db->filter_store_value) ;
66             safefree(db) ;
67         }
68
69 datum_value
70 sdbm_FETCH(db, key)
71         SDBM_File       db
72         datum_key       key
73
74 int
75 sdbm_STORE(db, key, value, flags = DBM_REPLACE)
76         SDBM_File       db
77         datum_key       key
78         datum_value     value
79         int             flags
80     CLEANUP:
81         if (RETVAL) {
82             if (RETVAL < 0 && errno == EPERM)
83                 croak("No write permission to sdbm file");
84             croak("sdbm store returned %d, errno %d, key \"%s\"",
85                         RETVAL,errno,key.dptr);
86             sdbm_clearerr(db->dbp);
87         }
88
89 int
90 sdbm_DELETE(db, key)
91         SDBM_File       db
92         datum_key       key
93
94 int
95 sdbm_EXISTS(db,key)
96         SDBM_File       db
97         datum_key       key
98
99 datum_key
100 sdbm_FIRSTKEY(db)
101         SDBM_File       db
102
103 datum_key
104 sdbm_NEXTKEY(db, key)
105         SDBM_File       db
106         datum_key       key;
107
108 int
109 sdbm_error(db)
110         SDBM_File       db
111         CODE:
112         RETVAL = sdbm_error(db->dbp) ;
113         OUTPUT:
114           RETVAL
115
116 int
117 sdbm_clearerr(db)
118         SDBM_File       db
119         CODE:
120         RETVAL = sdbm_clearerr(db->dbp) ;
121         OUTPUT:
122           RETVAL
123
124
125 SV *
126 filter_fetch_key(db, code)
127         SDBM_File       db
128         SV *            code
129         SV *            RETVAL = &PL_sv_undef ;
130         CODE:
131             DBM_setFilter(db->filter_fetch_key, code) ;
132
133 SV *
134 filter_store_key(db, code)
135         SDBM_File       db
136         SV *            code
137         SV *            RETVAL =  &PL_sv_undef ;
138         CODE:
139             DBM_setFilter(db->filter_store_key, code) ;
140
141 SV *
142 filter_fetch_value(db, code)
143         SDBM_File       db
144         SV *            code
145         SV *            RETVAL =  &PL_sv_undef ;
146         CODE:
147             DBM_setFilter(db->filter_fetch_value, code) ;
148
149 SV *
150 filter_store_value(db, code)
151         SDBM_File       db
152         SV *            code
153         SV *            RETVAL =  &PL_sv_undef ;
154         CODE:
155             DBM_setFilter(db->filter_store_value, code) ;
156