diff options
Diffstat (limited to 'src/cmd/venti/ifile.c')
-rw-r--r-- | src/cmd/venti/ifile.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/src/cmd/venti/ifile.c b/src/cmd/venti/ifile.c new file mode 100644 index 00000000..811e487c --- /dev/null +++ b/src/cmd/venti/ifile.c @@ -0,0 +1,93 @@ +#include "stdinc.h" +#include "dat.h" +#include "fns.h" + +int +readifile(IFile *f, char *name) +{ + ZBlock *b; + + b = readfile(name); + if(b == nil) + return -1; + f->name = name; + f->b = b; + f->pos = 0; + return 0; +} + +void +freeifile(IFile *f) +{ + freezblock(f->b); + f->b = nil; + f->pos = 0; +} + +int +partifile(IFile *f, Part *part, u64int start, u32int size) +{ + ZBlock *b; + + b = alloczblock(size, 0); + if(b == nil) + return -1; + if(readpart(part, start, b->data, size) < 0){ + seterr(EAdmin, "can't read %s: %r", part->name); + freezblock(b); + return -1; + } + f->name = part->name; + f->b = b; + f->pos = 0; + return 0; +} + +/* + * return the next non-blank input line, + * stripped of leading white space and with # comments eliminated + */ +char* +ifileline(IFile *f) +{ + char *s, *e, *t; + int c; + + for(;;){ + s = (char*)&f->b->data[f->pos]; + e = memchr(s, '\n', f->b->len - f->pos); + if(e == nil) + return nil; + *e++ = '\0'; + f->pos = e - (char*)f->b->data; + t = strchr(s, '#'); + if(t != nil) + *t = '\0'; + for(; c = *s; s++) + if(c != ' ' && c != '\t' && c != '\r') + return s; + } +} + +int +ifilename(IFile *f, char *dst) +{ + char *s; + + s = ifileline(f); + if(s == nil || strlen(s) >= ANameSize) + return -1; + namecp(dst, s); + return 0; +} + +int +ifileu32int(IFile *f, u32int *r) +{ + char *s; + + s = ifileline(f); + if(s == nil) + return -1; + return stru32int(s, r); +} |