Blob


1 /*
2 * Generic traversal routines.
3 */
5 #include "stdinc.h"
6 #include "dat.h"
7 #include "fns.h"
9 static uint
10 etype(Entry *e)
11 {
12 uint t;
14 if(e->flags&_VtEntryDir)
15 t = BtDir;
16 else
17 t = BtData;
18 return t+e->depth;
19 }
21 void
22 initWalk(WalkPtr *w, Block *b, uint size)
23 {
24 memset(w, 0, sizeof *w);
25 switch(b->l.type){
26 case BtData:
27 return;
29 case BtDir:
30 w->data = b->data;
31 w->m = size / VtEntrySize;
32 w->isEntry = 1;
33 return;
35 default:
36 w->data = b->data;
37 w->m = size / VtScoreSize;
38 w->type = b->l.type;
39 w->tag = b->l.tag;
40 return;
41 }
42 }
44 int
45 nextWalk(WalkPtr *w, uchar score[VtScoreSize], uchar *type, u32int *tag, Entry **e)
46 {
47 if(w->n >= w->m)
48 return 0;
50 if(w->isEntry){
51 *e = &w->e;
52 entryUnpack(&w->e, w->data, w->n);
53 memmove(score, w->e.score, VtScoreSize);
54 *type = etype(&w->e);
55 *tag = w->e.tag;
56 }else{
57 *e = nil;
58 memmove(score, w->data+w->n*VtScoreSize, VtScoreSize);
59 *type = w->type-1;
60 *tag = w->tag;
61 }
62 w->n++;
63 return 1;
64 }