diff options
Diffstat (limited to 'strbuf.c')
-rw-r--r-- | strbuf.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/strbuf.c b/strbuf.c new file mode 100644 index 0000000000..dac945c7c8 --- /dev/null +++ b/strbuf.c @@ -0,0 +1,43 @@ +#include <stdio.h> +#include <stdlib.h> +#include "strbuf.h" + +void strbuf_init(struct strbuf *sb) { + sb->buf = 0; + 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 = realloc(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 (sb->len == 0) + sb->eof = 1; + strbuf_end(sb); +} + |