#include <stdio.h> #include <stdlib.h> #include "strbuf.h" #include "cache.h" void strbuf_init(struct strbuf *sb) { sb->buf = NULL; sb->eof = sb->alloc = sb->len = 0; } static void strbuf_begin(struct strbuf *sb) { free(sb->buf); strbuf_init(sb); } static void inline strbuf_add(struct strbuf *sb, int ch) { if (sb->alloc <= sb->len) { sb->alloc = sb->alloc * 3 / 2 + 16; sb->buf = xrealloc(sb->buf, sb->alloc); } sb->buf[sb->len++] = ch; } static void strbuf_end(struct strbuf *sb) { strbuf_add(sb, 0); } void read_line(struct strbuf *sb, FILE *fp, int term) { int ch; strbuf_begin(sb); if (feof(fp)) { sb->eof = 1; return; } while ((ch = fgetc(fp)) != EOF) { if (ch == term) break; strbuf_add(sb, ch); } if (ch == EOF && sb->len == 0) sb->eof = 1; strbuf_end(sb); }