blob: 7f14b0fb59bd7e14979b002f441ae84ff5b0e9a2 [file] [log] [blame]
Christopher Li812666c2005-04-26 12:00:58 -07001#include "cache.h"
Junio C Hamano85023572006-12-19 14:34:12 -08002#include "strbuf.h"
Junio C Hamanod1df5742005-04-25 18:26:45 -07003
4void strbuf_init(struct strbuf *sb) {
Linus Torvaldse99d59f2005-05-20 11:46:10 -07005 sb->buf = NULL;
Junio C Hamanod1df5742005-04-25 18:26:45 -07006 sb->eof = sb->alloc = sb->len = 0;
7}
8
9static void strbuf_begin(struct strbuf *sb) {
10 free(sb->buf);
11 strbuf_init(sb);
12}
13
14static void inline strbuf_add(struct strbuf *sb, int ch) {
15 if (sb->alloc <= sb->len) {
16 sb->alloc = sb->alloc * 3 / 2 + 16;
Christopher Li812666c2005-04-26 12:00:58 -070017 sb->buf = xrealloc(sb->buf, sb->alloc);
Junio C Hamanod1df5742005-04-25 18:26:45 -070018 }
19 sb->buf[sb->len++] = ch;
20}
21
22static void strbuf_end(struct strbuf *sb) {
23 strbuf_add(sb, 0);
24}
25
26void read_line(struct strbuf *sb, FILE *fp, int term) {
27 int ch;
28 strbuf_begin(sb);
29 if (feof(fp)) {
30 sb->eof = 1;
31 return;
32 }
33 while ((ch = fgetc(fp)) != EOF) {
34 if (ch == term)
35 break;
36 strbuf_add(sb, ch);
37 }
Junio C Hamano9dc527a2005-05-18 23:34:03 -070038 if (ch == EOF && sb->len == 0)
39 sb->eof = 1;
Junio C Hamanod1df5742005-04-25 18:26:45 -070040 strbuf_end(sb);
41}
42