2 * This code is largely based on strbuf in the GIT version control system.
10 char gbuf_empty_buffer
[1];
12 static inline void gbuf_init(struct gbuf
*buf
)
14 buf
->buffer
= gbuf_empty_buffer
;
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
) {
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
)
41 void gbuf_add_ch(struct gbuf
*buf
, char ch
)
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
)
51 memcpy(buf
->buffer
+ buf
->len
, data
, len
);
53 buf
->buffer
[buf
->len
] = 0;
56 void gbuf_add_str(struct gbuf
*buf
, const char *str
)
58 int len
= strlen(str
);
63 memcpy(buf
->buffer
+ buf
->len
, str
, len
+ 1);
67 void gbuf_addf(struct gbuf
*buf
, const char *fmt
, ...)
73 slen
= vsnprintf(buf
->buffer
+ buf
->len
, buf
->alloc
- buf
->len
, fmt
, ap
);
76 if (slen
> gbuf_avail(buf
)) {
77 gbuf_grow(buf
, slen
+ 1);
80 slen
= vsnprintf(buf
->buffer
+ buf
->len
, buf
->alloc
- buf
->len
, fmt
, ap
);
87 void gbuf_set(struct gbuf
*buf
, int c
, size_t count
)
89 gbuf_grow(buf
, count
);
90 memset(buf
->buffer
+ buf
->len
, c
, count
);
92 buf
->buffer
[buf
->len
] = 0;
95 char *gbuf_steal(struct gbuf
*buf
)
97 char *b
= buf
->buffer
;