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