8 u64int off; /* read position within part */
9 u64int n; /* number of valid ientries left to read */
10 u32int size; /* allocated space in buffer */
12 u8int *pos; /* current place in buffer */
13 u8int *epos; /* end of valid buffer contents */
17 initiestream(Part *part, u64int off, u64int clumps, u32int size)
23 ies->buf = MKN(u8int, size);
34 freeiestream(IEStream *ies)
43 peekientry(IEStream *ies)
47 n = ies->epos - ies->pos;
49 memmove(ies->buf, ies->pos, n);
50 ies->epos = &ies->buf[n];
53 if(nn > ies->n * IEntrySize)
54 nn = ies->n * IEntrySize;
58 if(readpart(ies->part, ies->off, ies->epos, nn) < 0){
59 seterr(EOk, "can't read sorted index entries: %r");
69 iebuck(Index *ix, u8int *b)
71 return hashbits(b, 32) / ix->div;
75 buildbucket(Index *ix, IEStream *ies, IBucket *ib)
88 //fprint(2, "b=%p ies->n=%lld ib.n=%d buck=%d score=%V\n", b, ies->n, ib->n, iebuck(ix, b), b);
92 if(buck != iebuck(ix, b))
94 if(ientrycmp(&ib->data[(ib->n - 1)* IEntrySize], b) == 0){
96 * guess that the larger address is the correct one to use
98 unpackientry(&ie1, &ib->data[(ib->n - 1)* IEntrySize]);
99 unpackientry(&ie2, b);
100 seterr(EOk, "duplicate index entry for score=%V type=%d\n", ie1.score, ie1.ia.type);
102 if(ie1.ia.addr > ie2.ia.addr)
103 memmove(b, &ib->data[ib->n * IEntrySize], IEntrySize);
106 memmove(&ib->data[ib->n * IEntrySize], b, IEntrySize);
109 ies->pos += IEntrySize;