#include #include #include #include #include #include "dat.h" void* emalloc(ulong n) { void *p; p = malloc(n); if(p == nil) error("can't malloc: %r"); memset(p, 0, n); return p; } void* erealloc(void *p, ulong n) { p = realloc(p, n); if(p == nil) error("can't malloc: %r"); return p; } char* estrdup(char *s) { char *t; t = emalloc(strlen(s)+1); strcpy(t, s); return t; } char* estrstrdup(char *s, char *t) { long ns, nt; char *u; ns = strlen(s); nt = strlen(t); /* use malloc to avoid memset */ u = malloc(ns+nt+1); if(u == nil) error("can't malloc: %r"); memmove(u, s, ns); memmove(u+ns, t, nt); u[ns+nt] = '\0'; return u; } char* eappend(char *s, char *sep, char *t) { long ns, nsep, nt; char *u; if(t == nil) u = estrstrdup(s, sep); else{ ns = strlen(s); nsep = strlen(sep); nt = strlen(t); /* use malloc to avoid memset */ u = malloc(ns+nsep+nt+1); if(u == nil) error("can't malloc: %r"); memmove(u, s, ns); memmove(u+ns, sep, nsep); memmove(u+ns+nsep, t, nt); u[ns+nsep+nt] = '\0'; } free(s); return u; } char* egrow(char *s, char *sep, char *t) { s = eappend(s, sep, t); free(t); return s; } void error(char *fmt, ...) { va_list arg; char buf[256]; Fmt f; fmtfdinit(&f, 2, buf, sizeof buf); fmtprint(&f, "Mail: "); va_start(arg, fmt); fmtvprint(&f, fmt, arg); va_end(arg); fmtprint(&f, "\n"); fmtfdflush(&f); exits(fmt); } void growbytes(Bytes *b, char *s, long ns) { if(b->nalloc < b->n + ns + 1){ b->nalloc = b->n + ns + 8000; /* use realloc to avoid memset */ b->b = realloc(b->b, b->nalloc); if(b->b == nil) error("growbytes: can't realloc: %r"); } memmove(b->b+b->n, s, ns); b->n += ns; b->b[b->n] = '\0'; }