This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Convert [GNOS]DBM_File::TIEHASH to safecalloc() from safemalloc() then Zero().
[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)safecalloc(1, sizeof(SDBM_File_type));
44                 RETVAL->dbp = dbp ;
45             }
46             
47         }
48         OUTPUT:
49           RETVAL
50
51 void
52 sdbm_DESTROY(db)
53         SDBM_File       db
54         CODE:
55         if (db) {
56             sdbm_close(db->dbp);
57             if (db->filter_fetch_key)
58                 SvREFCNT_dec(db->filter_fetch_key) ;
59             if (db->filter_store_key)
60                 SvREFCNT_dec(db->filter_store_key) ;
61             if (db->filter_fetch_value)
62                 SvREFCNT_dec(db->filter_fetch_value) ;
63             if (db->filter_store_value)
64                 SvREFCNT_dec(db->filter_store_value) ;
65             safefree(db) ;
66         }
67
68 datum_value
69 sdbm_FETCH(db, key)
70         SDBM_File       db
71         datum_key       key
72
73 int
74 sdbm_STORE(db, key, value, flags = DBM_REPLACE)
75         SDBM_File       db
76         datum_key       key
77         datum_value     value
78         int             flags
79     CLEANUP:
80         if (RETVAL) {
81             if (RETVAL < 0 && errno == EPERM)
82                 croak("No write permission to sdbm file");
83             croak("sdbm store returned %d, errno %d, key \"%s\"",
84                         RETVAL,errno,key.dptr);
85             sdbm_clearerr(db->dbp);
86         }
87
88 int
89 sdbm_DELETE(db, key)
90         SDBM_File       db
91         datum_key       key
92
93 int
94 sdbm_EXISTS(db,key)
95         SDBM_File       db
96         datum_key       key
97
98 datum_key
99 sdbm_FIRSTKEY(db)
100         SDBM_File       db
101
102 datum_key
103 sdbm_NEXTKEY(db, key)
104         SDBM_File       db
105         datum_key       key;
106
107 int
108 sdbm_error(db)
109         SDBM_File       db
110         CODE:
111         RETVAL = sdbm_error(db->dbp) ;
112         OUTPUT:
113           RETVAL
114
115 int
116 sdbm_clearerr(db)
117         SDBM_File       db
118         CODE:
119         RETVAL = sdbm_clearerr(db->dbp) ;
120         OUTPUT:
121           RETVAL
122
123
124 SV *
125 filter_fetch_key(db, code)
126         SDBM_File       db
127         SV *            code
128         SV *            RETVAL = &PL_sv_undef ;
129         CODE:
130             DBM_setFilter(db->filter_fetch_key, code) ;
131
132 SV *
133 filter_store_key(db, code)
134         SDBM_File       db
135         SV *            code
136         SV *            RETVAL =  &PL_sv_undef ;
137         CODE:
138             DBM_setFilter(db->filter_store_key, code) ;
139
140 SV *
141 filter_fetch_value(db, code)
142         SDBM_File       db
143         SV *            code
144         SV *            RETVAL =  &PL_sv_undef ;
145         CODE:
146             DBM_setFilter(db->filter_fetch_value, code) ;
147
148 SV *
149 filter_store_value(db, code)
150         SDBM_File       db
151         SV *            code
152         SV *            RETVAL =  &PL_sv_undef ;
153         CODE:
154             DBM_setFilter(db->filter_store_value, code) ;
155