Blame


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