1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <draw.h>
5 #include <html.h>
6 #include "dat.h"
7 
8 void*
emalloc(ulong n)9 emalloc(ulong n)
10 {
11 	void *p;
12 
13 	p = malloc(n);
14 	if(p == nil)
15 		error("can't malloc: %r");
16 	memset(p, 0, n);
17 	return p;
18 }
19 
20 void*
erealloc(void * p,ulong n)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 }
28 
29 char*
estrdup(char * s)30 estrdup(char *s)
31 {
32 	char *t;
33 
34 	t = emalloc(strlen(s)+1);
35 	strcpy(t, s);
36 	return t;
37 }
38 
39 char*
estrstrdup(char * s,char * t)40 estrstrdup(char *s, char *t)
41 {
42 	long ns, nt;
43 	char *u;
44 
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 }
56 
57 char*
eappend(char * s,char * sep,char * t)58 eappend(char *s, char *sep, char *t)
59 {
60 	long ns, nsep, nt;
61 	char *u;
62 
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 }
81 
82 char*
egrow(char * s,char * sep,char * t)83 egrow(char *s, char *sep, char *t)
84 {
85 	s = eappend(s, sep, t);
86 	free(t);
87 	return s;
88 }
89 
90 void
error(char * fmt,...)91 error(char *fmt, ...)
92 {
93 	va_list arg;
94 	char buf[256];
95 	Fmt f;
96 
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 }
106 
107 void
growbytes(Bytes * b,char * s,long ns)108 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 }
121