2 * malloc.c: implementation of malloc.h
14 #define lenof(x) (sizeof((x))/sizeof(*(x)))
16 extern void fatal(const char *, ...);
18 void *smalloc(size_t size
) {
22 fatal("out of memory");
33 void *srealloc(void *p
, size_t size
) {
41 fatal("out of memory");
45 char *dupstr(const char *s
) {
46 char *r
= smalloc(1+strlen(s
));
51 char *dupfmt(const char *fmt
, ...)
55 char *ret
= NULL
, *rp
= NULL
;
65 for (pass
= 0; pass
< 2; pass
++) {
71 const char *data
= NULL
;
72 int datalen
= 0, stuffcr
= 0, htmlesc
= 0;
83 strftime(datebuf
, lenof(datebuf
),
84 "%a, %d %b %Y %H:%M:%S GMT", &tm
);
87 datalen
= strlen(data
);
88 } else if (*p
== 'd') {
89 int i
= va_arg(ap
, int);
90 sprintf(datebuf
, "%d", i
);
92 datalen
= strlen(data
);
93 } else if (*p
== 's') {
94 data
= va_arg(ap
, const char *);
95 datalen
= strlen(data
);
96 } else if (*p
== 'h') {
98 data
= va_arg(ap
, const char *);
99 datalen
= strlen(data
);
100 } else if (assert(*p
== 'S'), 1) {
101 stuffcr
= va_arg(ap
, int);
102 data
= va_arg(ap
, const char *);
103 datalen
= strlen(data
);
108 while (*p
&& *p
!= '%') p
++;
113 while (datalen
> 0) {
115 if (stuffcr
&& *data
== '\n')
118 (*data
== '<' || *data
== '>' || *data
== '&'))
119 totallen
+= 4; /* max(len("gt;"),len("amp;")) */
123 while (datalen
> 0) {
124 if (htmlesc
&& (*data
< 32 || *data
>= 127))
125 *rp
++ = '?'; /* *shrug* */
126 else if (htmlesc
&& *data
== '<')
127 rp
+= sprintf(rp
, "<");
128 else if (htmlesc
&& *data
== '>')
129 rp
+= sprintf(rp
, ">");
130 else if (htmlesc
&& *data
== '&')
131 rp
+= sprintf(rp
, "&");
132 else if (stuffcr
&& *data
== '\n')
133 *rp
++ = '\r', *rp
++ = '\n';
144 rp
= ret
= snewn(totallen
+1, char);
146 assert(rp
- ret
== totallen
);