#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); | |
} |