Blob
1 /*2 * Generic traversal routines.3 */5 #include "stdinc.h"6 #include "dat.h"7 #include "fns.h"9 static uint10 etype(Entry *e)11 {12 uint t;14 if(e->flags&_VtEntryDir)15 t = BtDir;16 else17 t = BtData;18 return t+e->depth;19 }21 void22 initWalk(WalkPtr *w, Block *b, uint size)23 {24 memset(w, 0, sizeof *w);25 switch(b->l.type){26 case BtData:27 return;29 case BtDir:30 w->data = b->data;31 w->m = size / VtEntrySize;32 w->isEntry = 1;33 return;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 }44 int45 nextWalk(WalkPtr *w, uchar score[VtScoreSize], uchar *type, u32int *tag, Entry **e)46 {47 if(w->n >= w->m)48 return 0;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 }