4 void strbuf_init(struct strbuf *sb) {
5 memset(sb, 0, sizeof(*sb));
8 void strbuf_release(struct strbuf *sb) {
10 memset(sb, 0, sizeof(*sb));
13 void strbuf_reset(struct strbuf *sb) {
19 char *strbuf_detach(struct strbuf *sb) {
25 void strbuf_grow(struct strbuf *sb, size_t extra) {
26 if (sb->len + extra + 1 <= sb->len)
27 die("you want to use way too much memory");
28 ALLOC_GROW(sb->buf, sb->len + extra + 1, sb->alloc);
31 void strbuf_add(struct strbuf *sb, const void *data, size_t len) {
33 memcpy(sb->buf + sb->len, data, len);
34 strbuf_setlen(sb, sb->len + len);
37 void strbuf_addf(struct strbuf *sb, const char *fmt, ...) {
42 len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
47 if (len >= strbuf_avail(sb)) {
50 len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap);
52 if (len >= strbuf_avail(sb)) {
53 die("this should not happen, your snprintf is broken");
56 strbuf_setlen(sb, sb->len + len);
59 size_t strbuf_fread(struct strbuf *sb, size_t size, FILE *f) {
62 strbuf_grow(sb, size);
63 res = fread(sb->buf + sb->len, 1, size, f);
65 strbuf_setlen(sb, sb->len + res);
70 ssize_t strbuf_read(struct strbuf *sb, int fd)
72 size_t oldlen = sb->len;
77 strbuf_grow(sb, 8192);
78 cnt = xread(fd, sb->buf + sb->len, sb->alloc - sb->len - 1);
80 strbuf_setlen(sb, oldlen);
88 sb->buf[sb->len] = '\0';
89 return sb->len - oldlen;
92 void read_line(struct strbuf *sb, FILE *fp, int term) {
101 while ((ch = fgetc(fp)) != EOF) {
105 sb->buf[sb->len++] = ch;
107 if (ch == EOF && sb->len == 0) {
113 sb->buf[sb->len] = '\0';