otf: extract font name from CFF name index
[neatmkfn.git] / sbuf.c
blob0dc4c8748439d85779800e71078f2811760c5a2b
1 /* Variable Length String Buffer */
2 #include <stdarg.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include "sbuf.h"
8 #define MAX(a, b) ((a) < (b) ? (b) : (a))
9 #define ALIGN(n, a) (((n) + (a) - 1) & ~((a) - 1))
10 #define NEXTSZ(o, r) ALIGN(MAX((o) * 2, (o) + (r)), SBUFSZ)
12 #define SBUFSZ 128
14 struct sbuf {
15 char *s; /* allocated buffer */
16 int s_n; /* length of the string stored in s[] */
17 int s_sz; /* size of memory allocated for s[] */
20 static void sbuf_extend(struct sbuf *sbuf, int newsz)
22 char *s = sbuf->s;
23 sbuf->s_sz = newsz;
24 sbuf->s = malloc(sbuf->s_sz);
25 if (sbuf->s_n)
26 memcpy(sbuf->s, s, sbuf->s_n);
27 free(s);
30 struct sbuf *sbuf_make(void)
32 struct sbuf *sb = malloc(sizeof(*sb));
33 memset(sb, 0, sizeof(*sb));
34 return sb;
37 char *sbuf_buf(struct sbuf *sb)
39 if (!sb->s)
40 sbuf_extend(sb, 1);
41 sb->s[sb->s_n] = '\0';
42 return sb->s;
45 char *sbuf_done(struct sbuf *sb)
47 char *s = sbuf_buf(sb);
48 free(sb);
49 return s;
52 void sbuf_free(struct sbuf *sb)
54 free(sb->s);
55 free(sb);
58 void sbuf_chr(struct sbuf *sbuf, int c)
60 if (sbuf->s_n + 2 >= sbuf->s_sz)
61 sbuf_extend(sbuf, NEXTSZ(sbuf->s_sz, 1));
62 sbuf->s[sbuf->s_n++] = c;
65 void sbuf_mem(struct sbuf *sbuf, char *s, int len)
67 if (sbuf->s_n + len + 1 >= sbuf->s_sz)
68 sbuf_extend(sbuf, NEXTSZ(sbuf->s_sz, len + 1));
69 memcpy(sbuf->s + sbuf->s_n, s, len);
70 sbuf->s_n += len;
73 void sbuf_str(struct sbuf *sbuf, char *s)
75 sbuf_mem(sbuf, s, strlen(s));
78 int sbuf_len(struct sbuf *sbuf)
80 return sbuf->s_n;
83 void sbuf_cut(struct sbuf *sb, int len)
85 if (sb->s_n > len)
86 sb->s_n = len;
89 void sbuf_printf(struct sbuf *sbuf, char *s, ...)
91 char buf[256];
92 va_list ap;
93 va_start(ap, s);
94 vsnprintf(buf, sizeof(buf), s, ap);
95 va_end(ap);
96 sbuf_str(sbuf, buf);