#include #include #include #include #include #include "dat.h" void* emalloc(uint n) { void *p; p = malloc(n); if(p == nil) error("can't malloc: %r"); memset(p, 0, n); setmalloctag(p, getcallerpc(&n)); return p; } void* erealloc(void *p, uint n) { p = realloc(p, n); if(p == nil) error("can't realloc: %r"); setmalloctag(p, getcallerpc(&n)); return p; } char* estrdup(char *s) { char *t; t = emalloc(strlen(s)+1); strcpy(t, s); return t; } char* esmprint(char *fmt, ...) { va_list args; char *s; va_start(args, fmt); s = vsmprint(fmt, args); va_end(args); if(s == nil) sysfatal("no memory"); return s; } void error(char *fmt, ...) { Fmt f; char buf[64]; va_list arg; fmtfdinit(&f, 2, buf, sizeof buf); fmtprint(&f, "%s: ", argv0); va_start(arg, fmt); fmtvprint(&f, fmt, arg); va_end(arg); fmtprint(&f, "\n"); fmtfdflush(&f); threadexitsall(fmt); } void ctlprint(int fd, char *fmt, ...) { int n; va_list arg; va_start(arg, fmt); n = vfprint(fd, fmt, arg); va_end(arg); if(n <= 0) error("control file write error: %r"); } char* readfile(char *file, int *np) { char *data; int fd, len; Dir *d; if(np != nil) *np = 0; fd = open(file, OREAD); if(fd < 0) return nil; d = dirfstat(fd); len = 0; if(d != nil) len = d->length; free(d); data = emalloc(len+1); read(fd, data, len); close(fd); if(np != nil) *np = len; return data; } char* cleanpath(char* file, char* dir) { char* s; char* t; char cwd[512]; assert(file && file[0]); if(file[1]) file = estrdup(file); else { s = file; file = emalloc(3); file[0] = s[0]; file[1] = 0; } s = cleanname(file); if(s[0] != '/' && access(s, AEXIST) == 0){ getwd(cwd, sizeof(cwd)); t = esmprint("%s/%s", cwd, s); free(s); return t; } if(s[0] != '/' && dir != nil && dir[0] != 0){ t = esmprint("%s/%s", dir, s); free(s); s = cleanname(t); } return s; }