diff options
Diffstat (limited to 'src/cmd/venti/utils.c')
-rw-r--r-- | src/cmd/venti/utils.c | 361 |
1 files changed, 361 insertions, 0 deletions
diff --git a/src/cmd/venti/utils.c b/src/cmd/venti/utils.c new file mode 100644 index 00000000..26a0ef82 --- /dev/null +++ b/src/cmd/venti/utils.c @@ -0,0 +1,361 @@ +#include "stdinc.h" +#include "dat.h" +#include "fns.h" + +int +namecmp(char *s, char *t) +{ + return strncmp(s, t, ANameSize); +} + +void +namecp(char *dst, char *src) +{ + strncpy(dst, src, ANameSize - 1); + dst[ANameSize - 1] = '\0'; +} + +int +nameok(char *name) +{ + char *t; + int c; + + if(name == nil) + return -1; + for(t = name; c = *t; t++) + if(t - name >= ANameSize + || c < ' ' || c >= 0x7f) + return -1; + return 0; +} + +int +stru32int(char *s, u32int *r) +{ + char *t; + u32int n, nn, m; + int c; + + m = TWID32 / 10; + n = 0; + for(t = s; ; t++){ + c = *t; + if(c < '0' || c > '9') + break; + if(n > m) + return -1; + nn = n * 10 + c - '0'; + if(nn < n) + return -1; + n = nn; + } + *r = n; + return s != t && *t == '\0'; +} + +int +stru64int(char *s, u64int *r) +{ + char *t; + u64int n, nn, m; + int c; + + m = TWID64 / 10; + n = 0; + for(t = s; ; t++){ + c = *t; + if(c < '0' || c > '9') + break; + if(n > m) + return -1; + nn = n * 10 + c - '0'; + if(nn < n) + return -1; + n = nn; + } + *r = n; + return s != t && *t == '\0'; +} + +int +vttypevalid(int type) +{ + return type < VtMaxType; +} + +void +fmtzbinit(Fmt *f, ZBlock *b) +{ + f->runes = 0; + f->start = b->data; + f->to = f->start; + f->stop = (char*)f->start + b->len; + f->flush = nil; + f->farg = nil; + f->nfmt = 0; + f->args = nil; +} + +static int +sflush(Fmt *f) +{ + char *s; + int n; + + n = (int)f->farg; + n += 256; + f->farg = (void*)n; + s = f->start; + f->start = realloc(s, n); + if(f->start == nil){ + f->start = s; + return 0; + } + f->to = (char*)f->start + ((char*)f->to - s); + f->stop = (char*)f->start + n - 1; + return 1; +} + +static char* +logit(int severity, char *fmt, va_list args) +{ + Fmt f; + int n; + + f.runes = 0; + n = 32; + f.start = malloc(n); + if(f.start == nil) + return nil; + f.to = f.start; + f.stop = (char*)f.start + n - 1; + f.flush = sflush; + f.farg = (void*)n; + f.nfmt = 0; + f.args = args; + n = dofmt(&f, fmt); + if(n < 0) +{ +fprint(2, "dofmt %s failed\n", fmt); + return nil; +} + *(char*)f.to = '\0'; + + if(argv0 == nil) + fprint(2, "%s: err %d: %s\n", argv0, severity, f.start); + else + fprint(2, "err %d: %s\n", severity, f.start); + return f.start; +} + +void +seterr(int severity, char *fmt, ...) +{ + char *s; + va_list args; + + va_start(args, fmt); + s = logit(severity, fmt, args); + va_end(args); + if(s == nil) + werrstr("error setting error"); + else{ + werrstr("%s", s); + free(s); + } +} + +void +logerr(int severity, char *fmt, ...) +{ + char *s; + va_list args; + + va_start(args, fmt); + s = logit(severity, fmt, args); + va_end(args); + free(s); +} + +u32int +now(void) +{ + return time(nil); +} + +void +fatal(char *fmt, ...) +{ + Fmt f; + char buf[256]; + + f.runes = 0; + f.start = buf; + f.to = buf; + f.stop = buf + sizeof(buf); + f.flush = fmtfdflush; + f.farg = (void*)2; + f.nfmt = 0; + fmtprint(&f, "fatal %s error:", argv0); + va_start(f.args, fmt); + dofmt(&f, fmt); + va_end(f.args); + fmtprint(&f, "\n"); + fmtfdflush(&f); + if(0) + abort(); + threadexitsall(buf); +} + +ZBlock * +alloczblock(u32int size, int zeroed) +{ + ZBlock *b; + static ZBlock z; + + b = malloc(sizeof(ZBlock) + size); + if(b == nil){ + seterr(EOk, "out of memory"); + return nil; + } + + *b = z; + b->data = (u8int*)&b[1]; + b->len = size; + if(zeroed) + memset(b->data, 0, size); + return b; +} + +void +freezblock(ZBlock *b) +{ + free(b); +} + +ZBlock* +packet2zblock(Packet *p, u32int size) +{ + ZBlock *b; + + if(p == nil) + return nil; + b = alloczblock(size, 0); + if(b == nil) + return nil; + b->len = size; + if(packetcopy(p, b->data, 0, size) < 0){ + freezblock(b); + return nil; + } + return b; +} + +Packet* +zblock2packet(ZBlock *zb, u32int size) +{ + Packet *p; + + if(zb == nil) + return nil; + p = packetalloc(); + packetappend(p, zb->data, size); + return p; +} + +void * +emalloc(ulong n) +{ + void *p; + + p = malloc(n); + if(p == nil) + sysfatal("out of memory"); + memset(p, 0xa5, n); +if(0)print("emalloc %p-%p by %lux\n", p, (char*)p+n, getcallerpc(&n)); + return p; +} + +void * +ezmalloc(ulong n) +{ + void *p; + + p = malloc(n); + if(p == nil) + sysfatal("out of memory"); + memset(p, 0, n); +if(0)print("ezmalloc %p-%p by %lux\n", p, (char*)p+n, getcallerpc(&n)); + return p; +} + +void * +erealloc(void *p, ulong n) +{ + p = realloc(p, n); + if(p == nil) + sysfatal("out of memory"); +if(0)print("erealloc %p-%p by %lux\n", p, (char*)p+n, getcallerpc(&p)); + return p; +} + +char * +estrdup(char *s) +{ + char *t; + int n; + + n = strlen(s) + 1; + t = emalloc(n); + memmove(t, s, n); +if(0)print("estrdup %p-%p by %lux\n", t, (char*)t+n, getcallerpc(&s)); + return t; +} + +ZBlock* +readfile(char *name) +{ + Part *p; + ZBlock *b; + + p = initpart(name, 1); + if(p == nil) + return nil; + b = alloczblock(p->size, 0); + if(b == nil){ + seterr(EOk, "can't alloc %s: %r", name); + freepart(p); + return nil; + } + if(readpart(p, 0, b->data, p->size) < 0){ + seterr(EOk, "can't read %s: %r", name); + freepart(p); + freezblock(b); + return nil; + } + freepart(p); + return b; +} + +/* + * return floor(log2(v)) + */ +int +u64log2(u64int v) +{ + int i; + + for(i = 0; i < 64; i++) + if((v >> i) <= 1) + break; + return i; +} + +int +vtproc(void (*fn)(void*), void *arg) +{ + proccreate(fn, arg, 256*1024); + return 0; +} + |