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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations)
Tue Jun 6 03:41:38 2006 UTC (19 years, 9 months ago) by sysadm
CVS Tags: pvpgn_1-7-4-0_MIL
Branch point for: GNU, MAIN
Content type: text/x-csrc
Initial revision

1 sysadm 1.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