Merge git://git.kernel.org/pub/scm/gitk/gitk
[git/gitweb.git] / strbuf.c
blob9d9d8bed915483abbc2ebb340e0881ae4e296bd4
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 = NULL;
8 sb->eof = sb->alloc = sb->len = 0;
11 static void strbuf_begin(struct strbuf *sb) {
12 free(sb->buf);
13 strbuf_init(sb);
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);
21 sb->buf[sb->len++] = ch;
24 static void strbuf_end(struct strbuf *sb) {
25 strbuf_add(sb, 0);
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;
35 while ((ch = fgetc(fp)) != EOF) {
36 if (ch == term)
37 break;
38 strbuf_add(sb, ch);
40 if (ch == EOF && sb->len == 0)
41 sb->eof = 1;
42 strbuf_end(sb);