Blob
1 #include <u.h>2 #include <libc.h>3 #include <bio.h>4 #include <draw.h>5 #include <html.h>6 #include "dat.h"8 void*9 emalloc(ulong n)10 {11 void *p;13 p = malloc(n);14 if(p == nil)15 error("can't malloc: %r");16 memset(p, 0, n);17 return p;18 }20 void*21 erealloc(void *p, ulong n)22 {23 p = realloc(p, n);24 if(p == nil)25 error("can't malloc: %r");26 return p;27 }29 char*30 estrdup(char *s)31 {32 char *t;34 t = emalloc(strlen(s)+1);35 strcpy(t, s);36 return t;37 }39 char*40 estrstrdup(char *s, char *t)41 {42 long ns, nt;43 char *u;45 ns = strlen(s);46 nt = strlen(t);47 /* use malloc to avoid memset */48 u = malloc(ns+nt+1);49 if(u == nil)50 error("can't malloc: %r");51 memmove(u, s, ns);52 memmove(u+ns, t, nt);53 u[ns+nt] = '\0';54 return u;55 }57 char*58 eappend(char *s, char *sep, char *t)59 {60 long ns, nsep, nt;61 char *u;63 if(t == nil)64 u = estrstrdup(s, sep);65 else{66 ns = strlen(s);67 nsep = strlen(sep);68 nt = strlen(t);69 /* use malloc to avoid memset */70 u = malloc(ns+nsep+nt+1);71 if(u == nil)72 error("can't malloc: %r");73 memmove(u, s, ns);74 memmove(u+ns, sep, nsep);75 memmove(u+ns+nsep, t, nt);76 u[ns+nsep+nt] = '\0';77 }78 free(s);79 return u;80 }82 char*83 egrow(char *s, char *sep, char *t)84 {85 s = eappend(s, sep, t);86 free(t);87 return s;88 }90 void91 error(char *fmt, ...)92 {93 va_list arg;94 char buf[256];95 Fmt f;97 fmtfdinit(&f, 2, buf, sizeof buf);98 fmtprint(&f, "Mail: ");99 va_start(arg, fmt);100 fmtvprint(&f, fmt, arg);101 va_end(arg);102 fmtprint(&f, "\n");103 fmtfdflush(&f);104 exits(fmt);105 }107 void108 growbytes(Bytes *b, char *s, long ns)109 {110 if(b->nalloc < b->n + ns + 1){111 b->nalloc = b->n + ns + 8000;112 /* use realloc to avoid memset */113 b->b = realloc(b->b, b->nalloc);114 if(b->b == nil)115 error("growbytes: can't realloc: %r");116 }117 memmove(b->b+b->n, s, ns);118 b->n += ns;119 b->b[b->n] = '\0';120 }