2 * alloc.c: implementation of alloc.h
8 extern void fatal(const char *, ...);
10 void *smalloc(size_t size
) {
14 fatal("out of memory");
25 void *srealloc(void *p
, size_t size
) {
33 fatal("out of memory");
37 char *dupstr(const char *s
) {
38 char *r
= smalloc(1+strlen(s
));
43 char *dupfmt(const char *fmt
, ...)
47 char *ret
= NULL
, *rp
= NULL
;
57 for (pass
= 0; pass
< 2; pass
++) {
63 const char *data
= NULL
;
64 int datalen
= 0, stuffcr
= 0, htmlesc
= 0;
75 strftime(datebuf
, lenof(datebuf
),
76 "%a, %d %b %Y %H:%M:%S GMT", &tm
);
79 datalen
= strlen(data
);
80 } else if (*p
== 'd') {
81 int i
= va_arg(ap
, int);
82 sprintf(datebuf
, "%d", i
);
84 datalen
= strlen(data
);
85 } else if (*p
== 's') {
86 data
= va_arg(ap
, const char *);
87 datalen
= strlen(data
);
88 } else if (*p
== 'h') {
90 data
= va_arg(ap
, const char *);
91 datalen
= strlen(data
);
92 } else if (assert(*p
== 'S'), 1) {
93 stuffcr
= va_arg(ap
, int);
94 data
= va_arg(ap
, const char *);
95 datalen
= strlen(data
);
100 while (*p
&& *p
!= '%') p
++;
105 while (datalen
> 0) {
107 if (stuffcr
&& *data
== '\n')
110 (*data
== '<' || *data
== '>' || *data
== '&'))
111 totallen
+= 4; /* max(len("gt;"),len("amp;")) */
115 while (datalen
> 0) {
116 if (htmlesc
&& (*data
< 32 || *data
>= 127))
117 *rp
++ = '?'; /* *shrug* */
118 else if (htmlesc
&& *data
== '<')
119 rp
+= sprintf(rp
, "<");
120 else if (htmlesc
&& *data
== '>')
121 rp
+= sprintf(rp
, ">");
122 else if (htmlesc
&& *data
== '&')
123 rp
+= sprintf(rp
, "&");
124 else if (stuffcr
&& *data
== '\n')
125 *rp
++ = '\r', *rp
++ = '\n';
136 rp
= ret
= snewn(totallen
+1, char);
138 assert(rp
- ret
== totallen
);