Fix configure check for ffmpeg header file
[cmus.git] / gbuf.c
blobc393a95170d4764f644e885ff38d3b882f6c1ada
1 /*
2 * This code is largely based on strbuf in the GIT version control system.
3 */
5 #include "gbuf.h"
6 #include "xmalloc.h"
8 #include <stdarg.h>
10 char gbuf_empty_buffer[1];
12 static inline void gbuf_init(struct gbuf *buf)
14 buf->buffer = gbuf_empty_buffer;
15 buf->alloc = 0;
16 buf->len = 0;
19 void gbuf_grow(struct gbuf *buf, size_t more)
21 size_t align = 16 - 1;
22 size_t alloc = (buf->len + more + 1 + align) & ~align;
24 if (alloc > buf->alloc) {
25 if (!buf->alloc)
26 buf->buffer = NULL;
27 buf->alloc = alloc;
28 buf->buffer = xrealloc(buf->buffer, buf->alloc);
29 // gbuf is not NUL terminated if this was first alloc
30 buf->buffer[buf->len] = 0;
34 void gbuf_free(struct gbuf *buf)
36 if (buf->alloc)
37 free(buf->buffer);
38 gbuf_init(buf);
41 void gbuf_add_ch(struct gbuf *buf, char ch)
43 gbuf_grow(buf, 1);
44 buf->buffer[buf->len++] = ch;
45 buf->buffer[buf->len] = 0;
48 void gbuf_add_bytes(struct gbuf *buf, const void *data, size_t len)
50 gbuf_grow(buf, len);
51 memcpy(buf->buffer + buf->len, data, len);
52 buf->len += len;
53 buf->buffer[buf->len] = 0;
56 void gbuf_add_str(struct gbuf *buf, const char *str)
58 int len = strlen(str);
60 if (!len)
61 return;
62 gbuf_grow(buf, len);
63 memcpy(buf->buffer + buf->len, str, len + 1);
64 buf->len += len;
67 void gbuf_addf(struct gbuf *buf, const char *fmt, ...)
69 va_list ap;
70 size_t avail = gbuf_avail(buf);
71 int slen;
73 va_start(ap, fmt);
74 slen = vsnprintf(buf->buffer + buf->len, avail, fmt, ap);
75 va_end(ap);
77 if (slen > avail) {
78 gbuf_grow(buf, slen);
80 va_start(ap, fmt);
81 slen = vsnprintf(buf->buffer + buf->len, gbuf_avail(buf), fmt, ap);
82 va_end(ap);
85 buf->len += slen;
86 buf->buffer[buf->len] = 0;
89 void gbuf_set(struct gbuf *buf, int c, size_t count)
91 gbuf_grow(buf, count);
92 memset(buf->buffer + buf->len, c, count);
93 buf->len += count;
94 buf->buffer[buf->len] = 0;
97 char *gbuf_steal(struct gbuf *buf)
99 char *b = buf->buffer;
100 if (!buf->alloc)
101 b = xnew0(char, 1);
102 gbuf_init(buf);
103 return b;