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 void
91 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);
107 void
108 growbytes(Bytes *b, char *s, long ns)
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");
117 memmove(b->b+b->n, s, ns);
118 b->n += ns;
119 b->b[b->n] = '\0';