|  | #include <u.h> | 
|  | #include <libc.h> | 
|  | #include <bio.h> | 
|  | #include <draw.h> | 
|  | #include <html.h> | 
|  | #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'; | 
|  | } |