README: make the instructions for CM fonts more concise
[neateqn.git] / sbuf.c
blob6273f0fccd83228092b04364ebded2c3c59d2cc7
1 #include <stdarg.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include "eqn.h"
7 #define SBUF_SZ 512
9 static void sbuf_extend(struct sbuf *sbuf, int amount)
11 char *s = sbuf->s;
12 sbuf->sz = (MAX(1, amount) + SBUF_SZ - 1) & ~(SBUF_SZ - 1);
13 sbuf->s = malloc(sbuf->sz);
14 if (sbuf->n)
15 memcpy(sbuf->s, s, sbuf->n);
16 free(s);
19 void sbuf_init(struct sbuf *sbuf)
21 memset(sbuf, 0, sizeof(*sbuf));
22 sbuf_extend(sbuf, SBUF_SZ);
25 void sbuf_add(struct sbuf *sbuf, int c)
27 if (sbuf->n + 2 >= sbuf->sz)
28 sbuf_extend(sbuf, sbuf->sz * 2);
29 sbuf->s[sbuf->n++] = c;
32 void sbuf_append(struct sbuf *sbuf, char *s)
34 int len = strlen(s);
35 if (sbuf->n + len + 1 >= sbuf->sz)
36 sbuf_extend(sbuf, sbuf->n + len + 1);
37 memcpy(sbuf->s + sbuf->n, s, len);
38 sbuf->n += len;
41 void sbuf_printf(struct sbuf *sbuf, char *s, ...)
43 char buf[LNLEN];
44 va_list ap;
45 va_start(ap, s);
46 vsprintf(buf, s, ap);
47 va_end(ap);
48 sbuf_append(sbuf, buf);
51 int sbuf_empty(struct sbuf *sbuf)
53 return !sbuf->n;
56 char *sbuf_buf(struct sbuf *sbuf)
58 sbuf->s[sbuf->n] = '\0';
59 return sbuf->s;
62 int sbuf_len(struct sbuf *sbuf)
64 return sbuf->n;
67 /* shorten the sbuf */
68 void sbuf_cut(struct sbuf *sbuf, int n)
70 if (sbuf->n > n)
71 sbuf->n = n;
74 void sbuf_done(struct sbuf *sbuf)
76 free(sbuf->s);