1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "strbuf.h"
4 #include "cache.h"
6 void strbuf_init(struct strbuf *sb) {
7 sb->buf = 0;
8 sb->eof = sb->alloc = sb->len = 0;
9 }
11 static void strbuf_begin(struct strbuf *sb) {
12 free(sb->buf);
13 strbuf_init(sb);
14 }
16 static 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 }
24 static void strbuf_end(struct strbuf *sb) {
25 strbuf_add(sb, 0);
26 }
28 void 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 (sb->len == 0)
41 sb->eof = 1;
42 strbuf_end(sb);
43 }