URI:
       twalk.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       twalk.c (963B)
       ---
            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 }