19a747e4fSDavid du Colombier #include <u.h> 29a747e4fSDavid du Colombier #include <libc.h> 39a747e4fSDavid du Colombier #include <bio.h> 49a747e4fSDavid du Colombier #include <disk.h> 59a747e4fSDavid du Colombier 69a747e4fSDavid du Colombier /* avl.c */ 79a747e4fSDavid du Colombier typedef struct Avl Avl; 89a747e4fSDavid du Colombier typedef struct Avltree Avltree; 99a747e4fSDavid du Colombier typedef struct Avlwalk Avlwalk; 109a747e4fSDavid du Colombier 11*12fd1c83SDavid du Colombier #pragma incomplete Avltree 12*12fd1c83SDavid du Colombier #pragma incomplete Avlwalk 13*12fd1c83SDavid du Colombier 149a747e4fSDavid du Colombier struct Avl 159a747e4fSDavid du Colombier { 169a747e4fSDavid du Colombier Avl *p; /* parent */ 179a747e4fSDavid du Colombier Avl *n[2]; /* children */ 189a747e4fSDavid du Colombier int bal; /* balance bits */ 199a747e4fSDavid du Colombier }; 209a747e4fSDavid du Colombier 219a747e4fSDavid du Colombier Avltree *mkavltree(int(*cmp)(Avl*, Avl*)); 229a747e4fSDavid du Colombier void insertavl(Avltree *tree, Avl *new, Avl **oldp); 239a747e4fSDavid du Colombier Avl *lookupavl(Avltree *tree, Avl *key); 249a747e4fSDavid du Colombier void deleteavl(Avltree *tree, Avl *key, Avl **oldp); 259a747e4fSDavid du Colombier Avlwalk *avlwalk(Avltree *tree); 269a747e4fSDavid du Colombier Avl *avlnext(Avlwalk *walk); 27867bfcc6SDavid du Colombier Avl *avlprev(Avlwalk *walk); 289a747e4fSDavid du Colombier void endwalk(Avlwalk *walk); 299a747e4fSDavid du Colombier 309a747e4fSDavid du Colombier /* db.c */ 319a747e4fSDavid du Colombier typedef struct Db Db; 329a747e4fSDavid du Colombier typedef struct Entry Entry; 339a747e4fSDavid du Colombier struct Entry 349a747e4fSDavid du Colombier { 359a747e4fSDavid du Colombier Avl a; 369a747e4fSDavid du Colombier char *name; 379a747e4fSDavid du Colombier struct { 389a747e4fSDavid du Colombier char *name; 399a747e4fSDavid du Colombier char *uid; 409a747e4fSDavid du Colombier char *gid; 419a747e4fSDavid du Colombier ulong mtime; 429a747e4fSDavid du Colombier ulong mode; 439a747e4fSDavid du Colombier int mark; 449a747e4fSDavid du Colombier vlong length; 459a747e4fSDavid du Colombier } d; 469a747e4fSDavid du Colombier }; 479a747e4fSDavid du Colombier 489a747e4fSDavid du Colombier 499a747e4fSDavid du Colombier typedef struct Db Db; 509a747e4fSDavid du Colombier struct Db 519a747e4fSDavid du Colombier { 529a747e4fSDavid du Colombier Avltree *avl; 539a747e4fSDavid du Colombier int fd; 549a747e4fSDavid du Colombier }; 559a747e4fSDavid du Colombier Db *opendb(char*); 569a747e4fSDavid du Colombier int finddb(Db*, char*, Dir*); 579a747e4fSDavid du Colombier void removedb(Db*, char*); 589a747e4fSDavid du Colombier void insertdb(Db*, char*, Dir*); 599a747e4fSDavid du Colombier int markdb(Db*, char*, Dir*); 609a747e4fSDavid du Colombier 619a747e4fSDavid du Colombier /* util.c */ 629a747e4fSDavid du Colombier void *erealloc(void*, int); 639a747e4fSDavid du Colombier void *emalloc(int); 649a747e4fSDavid du Colombier char *estrdup(char*); 659a747e4fSDavid du Colombier char *atom(char*); 669a747e4fSDavid du Colombier char *unroot(char*, char*); 679a747e4fSDavid du Colombier 689a747e4fSDavid du Colombier /* revproto.c */ 699a747e4fSDavid du Colombier int revrdproto(char*, char*, char*, Protoenum*, Protowarn*, void*); 709a747e4fSDavid du Colombier 71