7de2e13ad490fe6e61114bcdaecc1e59337b605a
2 * malloc.c: implementation of malloc.h
15 extern void fatal(const char *, ...);
17 void *smalloc(size_t size
) {
21 fatal("out of memory");
32 void *srealloc(void *p
, size_t size
) {
40 fatal("out of memory");
44 char *dupstr(const char *s
) {
45 char *r
= smalloc(1+strlen(s
));
50 char *dupfmt(const char *fmt
, ...)
54 char *ret
= NULL
, *rp
= NULL
;
64 for (pass
= 0; pass
< 2; pass
++) {
70 const char *data
= NULL
;
71 int datalen
= 0, stuffcr
= 0, htmlesc
= 0;
82 strftime(datebuf
, lenof(datebuf
),
83 "%a, %d %b %Y %H:%M:%S GMT", &tm
);
86 datalen
= strlen(data
);
87 } else if (*p
== 'd') {
88 int i
= va_arg(ap
, int);
89 sprintf(datebuf
, "%d", i
);
91 datalen
= strlen(data
);
92 } else if (*p
== 's') {
93 data
= va_arg(ap
, const char *);
94 datalen
= strlen(data
);
95 } else if (*p
== 'h') {
97 data
= va_arg(ap
, const char *);
98 datalen
= strlen(data
);
99 } else if (assert(*p
== 'S'), 1) {
100 stuffcr
= va_arg(ap
, int);
101 data
= va_arg(ap
, const char *);
102 datalen
= strlen(data
);
107 while (*p
&& *p
!= '%') p
++;
112 while (datalen
> 0) {
114 if (stuffcr
&& *data
== '\n')
117 (*data
== '<' || *data
== '>' || *data
== '&'))
118 totallen
+= 4; /* max(len("gt;"),len("amp;")) */
122 while (datalen
> 0) {
123 if (htmlesc
&& (*data
< 32 || *data
>= 127))
124 *rp
++ = '?'; /* *shrug* */
125 else if (htmlesc
&& *data
== '<')
126 rp
+= sprintf(rp
, "<");
127 else if (htmlesc
&& *data
== '>')
128 rp
+= sprintf(rp
, ">");
129 else if (htmlesc
&& *data
== '&')
130 rp
+= sprintf(rp
, "&");
131 else if (stuffcr
&& *data
== '\n')
132 *rp
++ = '\r', *rp
++ = '\n';
143 rp
= ret
= snewn(totallen
+1, char);
145 assert(rp
- ret
== totallen
);