1#include <stdio.h>
2#include <stdlib.h>
3#include "strbuf.h"
4#include "cache.h"
5
6void strbuf_init(struct strbuf *sb) {
7 sb->buf = NULL;
8 sb->eof = sb->alloc = sb->len = 0;
9}
10
11static void strbuf_begin(struct strbuf *sb) {
12 free(sb->buf);
13 strbuf_init(sb);
14}
15
16static void inline strbuf_add(struct strbuf *sb, int ch) {
17 if (sb->alloc <= sb->len) {
18 sb->alloc = sb->alloc * 3 / 2 + 16;
19 sb->buf = xrealloc(sb->buf, sb->alloc);
20 }
21 sb->buf[sb->len++] = ch;
22}
23
24static void strbuf_end(struct strbuf *sb) {
25 strbuf_add(sb, 0);
26}
27
28void read_line(struct strbuf *sb, FILE *fp, int term) {
29 int ch;
30 strbuf_begin(sb);
31 if (feof(fp)) {
32 sb->eof = 1;
33 return;
34 }
35 while ((ch = fgetc(fp)) != EOF) {
36 if (ch == term)
37 break;
38 strbuf_add(sb, ch);
39 }
40 if (ch == EOF && sb->len == 0)
41 sb->eof = 1;
42 strbuf_end(sb);
43}
44