/[LeafOK_CVS]/pvpgn-1.7.4/src/tinycdb/cdb_findnext.c
ViewVC logotype

Contents of /pvpgn-1.7.4/src/tinycdb/cdb_findnext.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1.1.1 - (show annotations) (vendor branch)
Tue Jun 6 03:41:38 2006 UTC (19 years, 9 months ago) by sysadm
Branch: GNU, MAIN
CVS Tags: arelease, HEAD
Changes since 1.1: +0 -0 lines
Content type: text/x-csrc
no message

1 /* sequential cdb_find routines
2 *
3 * This file is a part of tinycdb package by Michael Tokarev, mjt@corpit.ru.
4 * Public domain.
5 */
6
7 /* see cdb_find.c for comments */
8
9 #include "common/setup_before.h"
10 #include "cdb_int.h"
11 #include "common/setup_after.h"
12
13 int
14 cdb_findinit(struct cdb_find *cdbfp, struct cdb *cdbp,
15 const void *key, unsigned klen)
16 {
17 unsigned n, pos;
18
19 cdbfp->cdb_cdbp = cdbp;
20 cdbfp->cdb_key = key;
21 cdbfp->cdb_klen = klen;
22 cdbfp->cdb_hval = cdb_hash(key, klen);
23
24 cdbfp->cdb_htp = cdbp->cdb_mem + ((cdbfp->cdb_hval << 3) & 2047);
25 n = cdb_unpack(cdbfp->cdb_htp + 4);
26 cdbfp->cdb_httodo = n << 3;
27 if (!n)
28 return 0;
29 pos = cdb_unpack(cdbfp->cdb_htp);
30 if (n > (cdbp->cdb_fsize >> 3)
31 || pos < cdbp->cdb_dend
32 || pos > cdbp->cdb_fsize
33 || cdbfp->cdb_httodo > cdbp->cdb_fsize - pos)
34 return errno = EPROTO, -1;
35
36 cdbfp->cdb_htab = cdbp->cdb_mem + pos;
37 cdbfp->cdb_htend = cdbfp->cdb_htab + cdbfp->cdb_httodo;
38 cdbfp->cdb_htp = cdbfp->cdb_htab + (((cdbfp->cdb_hval >> 8) % n) << 3);
39
40 return 1;
41 }
42
43 int
44 cdb_findnext(struct cdb_find *cdbfp) {
45 struct cdb *cdbp = cdbfp->cdb_cdbp;
46 unsigned pos, n;
47 unsigned klen = cdbfp->cdb_klen;
48
49 while(cdbfp->cdb_httodo) {
50 pos = cdb_unpack(cdbfp->cdb_htp + 4);
51 if (!pos)
52 return 0;
53 n = cdb_unpack(cdbfp->cdb_htp) == cdbfp->cdb_hval;
54 if ((cdbfp->cdb_htp += 8) >= cdbfp->cdb_htend)
55 cdbfp->cdb_htp = cdbfp->cdb_htab;
56 cdbfp->cdb_httodo -= 8;
57 if (n) {
58 if (pos > cdbp->cdb_fsize - 8)
59 return errno = EPROTO, -1;
60 if (cdb_unpack(cdbp->cdb_mem + pos) == klen) {
61 if (cdbp->cdb_fsize - klen < pos + 8)
62 return errno = EPROTO, -1;
63 if (memcmp(cdbfp->cdb_key,
64 cdbp->cdb_mem + pos + 8, klen) == 0) {
65 n = cdb_unpack(cdbp->cdb_mem + pos + 4);
66 pos += 8;
67 if (cdbp->cdb_fsize < n ||
68 cdbp->cdb_fsize - n < pos + klen)
69 return errno = EPROTO, -1;
70 cdbp->cdb_kpos = pos;
71 cdbp->cdb_klen = klen;
72 cdbp->cdb_vpos = pos + klen;
73 cdbp->cdb_vlen = n;
74 return 1;
75 }
76 }
77 }
78 }
79
80 return 0;
81
82 }

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1