Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/*
2
 * Generic traversal routines.
3
 */
4
 
5
#include "stdinc.h"
6
#include "dat.h"
7
#include "fns.h"
8
 
9
static uint
10
etype(Entry *e)
11
{
12
	uint t;
13
 
14
	if(e->flags&VtEntryDir)
15
		t = BtDir;
16
	else
17
		t = BtData;
18
	return t+e->depth;
19
}
20
 
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;
28
 
29
	case BtDir:
30
		w->data = b->data;
31
		w->m = size / VtEntrySize;
32
		w->isEntry = 1;
33
		return;
34
 
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
}
43
 
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;
49
 
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
}
65