44 lines
807 B
44 lines
807 B
#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); |
|
} |
|
|
|
|