xref: /plan9-contrib/sys/src/cmd/fossil/walk.c (revision d7aba6c3b511bc618cf0c53345848188fc02611a)
15e96a66cSDavid du Colombier /*
25e96a66cSDavid du Colombier  * Generic traversal routines.
35e96a66cSDavid du Colombier  */
45e96a66cSDavid du Colombier 
55e96a66cSDavid du Colombier #include "stdinc.h"
65e96a66cSDavid du Colombier #include "dat.h"
75e96a66cSDavid du Colombier #include "fns.h"
85e96a66cSDavid du Colombier 
95e96a66cSDavid du Colombier static uint
etype(Entry * e)105e96a66cSDavid du Colombier etype(Entry *e)
115e96a66cSDavid du Colombier {
125e96a66cSDavid du Colombier 	uint t;
135e96a66cSDavid du Colombier 
14*d7aba6c3SDavid du Colombier 	if(e->flags&_VtEntryDir)
155e96a66cSDavid du Colombier 		t = BtDir;
165e96a66cSDavid du Colombier 	else
175e96a66cSDavid du Colombier 		t = BtData;
185e96a66cSDavid du Colombier 	return t+e->depth;
195e96a66cSDavid du Colombier }
205e96a66cSDavid du Colombier 
215e96a66cSDavid du Colombier void
initWalk(WalkPtr * w,Block * b,uint size)225e96a66cSDavid du Colombier initWalk(WalkPtr *w, Block *b, uint size)
235e96a66cSDavid du Colombier {
245e96a66cSDavid du Colombier 	memset(w, 0, sizeof *w);
255e96a66cSDavid du Colombier 	switch(b->l.type){
265e96a66cSDavid du Colombier 	case BtData:
275e96a66cSDavid du Colombier 		return;
285e96a66cSDavid du Colombier 
295e96a66cSDavid du Colombier 	case BtDir:
305e96a66cSDavid du Colombier 		w->data = b->data;
315e96a66cSDavid du Colombier 		w->m = size / VtEntrySize;
325e96a66cSDavid du Colombier 		w->isEntry = 1;
335e96a66cSDavid du Colombier 		return;
345e96a66cSDavid du Colombier 
355e96a66cSDavid du Colombier 	default:
365e96a66cSDavid du Colombier 		w->data = b->data;
375e96a66cSDavid du Colombier 		w->m = size / VtScoreSize;
385e96a66cSDavid du Colombier 		w->type = b->l.type;
395e96a66cSDavid du Colombier 		w->tag = b->l.tag;
405e96a66cSDavid du Colombier 		return;
415e96a66cSDavid du Colombier 	}
425e96a66cSDavid du Colombier }
435e96a66cSDavid du Colombier 
445e96a66cSDavid du Colombier int
nextWalk(WalkPtr * w,uchar score[VtScoreSize],uchar * type,u32int * tag,Entry ** e)455e96a66cSDavid du Colombier nextWalk(WalkPtr *w, uchar score[VtScoreSize], uchar *type, u32int *tag, Entry **e)
465e96a66cSDavid du Colombier {
475e96a66cSDavid du Colombier 	if(w->n >= w->m)
485e96a66cSDavid du Colombier 		return 0;
495e96a66cSDavid du Colombier 
505e96a66cSDavid du Colombier 	if(w->isEntry){
515e96a66cSDavid du Colombier 		*e = &w->e;
525e96a66cSDavid du Colombier 		entryUnpack(&w->e, w->data, w->n);
535e96a66cSDavid du Colombier 		memmove(score, w->e.score, VtScoreSize);
545e96a66cSDavid du Colombier 		*type = etype(&w->e);
555e96a66cSDavid du Colombier 		*tag = w->e.tag;
565e96a66cSDavid du Colombier 	}else{
575e96a66cSDavid du Colombier 		*e = nil;
585e96a66cSDavid du Colombier 		memmove(score, w->data+w->n*VtScoreSize, VtScoreSize);
595e96a66cSDavid du Colombier 		*type = w->type-1;
605e96a66cSDavid du Colombier 		*tag = w->tag;
615e96a66cSDavid du Colombier 	}
625e96a66cSDavid du Colombier 	w->n++;
635e96a66cSDavid du Colombier 	return 1;
645e96a66cSDavid du Colombier }
655e96a66cSDavid du Colombier 
66