Imported Upstream version 0.63.0
[hcoop/debian/courier-authlib.git] / gdbmobj / gdbmobj2.c
1 /*
2 ** Copyright 1998 - 1999 Double Precision, Inc. See COPYING for
3 ** distribution information.
4 */
5
6 #include "gdbmobj.h"
7
8 static char *fetchkeyval(struct gdbmobj *obj, size_t *, char **, size_t *);
9 extern char *gdbm_dofetch(struct gdbmobj *, const char *, size_t, size_t *);
10
11 char *gdbmobj_firstkey(struct gdbmobj *obj, size_t *keylen, char **val,
12 size_t *vallen)
13 {
14 datum key;
15
16 if (!obj->has_dbf) return (0);
17
18 if (obj->prev_key) free(obj->prev_key);
19 obj->prev_key=0;
20
21 key=gdbm_firstkey(obj->dbf);
22
23 if (!key.dptr) return (0);
24
25 obj->prev_key=key.dptr;
26 obj->prev_key_len=key.dsize;
27 return (fetchkeyval(obj, keylen, val, vallen));
28 }
29
30
31 static char *fetchkeyval(struct gdbmobj *obj, size_t *keylen, char **val,
32 size_t *vallen)
33 {
34 if (!obj->prev_key) return (0);
35 *val=gdbm_dofetch(obj, obj->prev_key, obj->prev_key_len, vallen);
36 *keylen=obj->prev_key_len;
37 return (obj->prev_key);
38 }
39
40 char *gdbmobj_nextkey(struct gdbmobj *obj, size_t *keylen,
41 char **val, size_t *vallen)
42 {
43 datum dkey, key;
44
45 if (!obj->has_dbf || !obj->prev_key) return (0);
46
47 dkey.dptr=(char *)obj->prev_key;
48 dkey.dsize=obj->prev_key_len;
49
50 key=gdbm_nextkey(obj->dbf, dkey);
51
52 free(obj->prev_key);
53 obj->prev_key=key.dptr;
54 obj->prev_key_len=key.dsize;
55 return (fetchkeyval(obj, keylen, val, vallen));
56 }