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