xref: /plan9/sys/src/cmd/fossil/walk.c (revision 5e96a66c77eb9140492ca53f857cbbf108e128ed)
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