| #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); | 
 | } | 
 |  |