Junio C Hamano | d1df574 | 2005-04-25 18:26:45 -0700 | [diff] [blame] | 1 | #include <stdio.h> |
| 2 | #include <stdlib.h> |
| 3 | #include "strbuf.h" |
Christopher Li | 812666c | 2005-04-26 12:00:58 -0700 | [diff] [blame] | 4 | #include "cache.h" |
Junio C Hamano | d1df574 | 2005-04-25 18:26:45 -0700 | [diff] [blame] | 5 | |
| 6 | void strbuf_init(struct strbuf *sb) { |
Linus Torvalds | e99d59f | 2005-05-20 11:46:10 -0700 | [diff] [blame] | 7 | sb->buf = NULL; |
Junio C Hamano | d1df574 | 2005-04-25 18:26:45 -0700 | [diff] [blame] | 8 | sb->eof = sb->alloc = sb->len = 0; |
| 9 | } |
| 10 | |
| 11 | static void strbuf_begin(struct strbuf *sb) { |
| 12 | free(sb->buf); |
| 13 | strbuf_init(sb); |
| 14 | } |
| 15 | |
| 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; |
Christopher Li | 812666c | 2005-04-26 12:00:58 -0700 | [diff] [blame] | 19 | sb->buf = xrealloc(sb->buf, sb->alloc); |
Junio C Hamano | d1df574 | 2005-04-25 18:26:45 -0700 | [diff] [blame] | 20 | } |
| 21 | sb->buf[sb->len++] = ch; |
| 22 | } |
| 23 | |
| 24 | static void strbuf_end(struct strbuf *sb) { |
| 25 | strbuf_add(sb, 0); |
| 26 | } |
| 27 | |
| 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; |
| 34 | } |
| 35 | while ((ch = fgetc(fp)) != EOF) { |
| 36 | if (ch == term) |
| 37 | break; |
| 38 | strbuf_add(sb, ch); |
| 39 | } |
Junio C Hamano | 9dc527a | 2005-05-18 23:34:03 -0700 | [diff] [blame] | 40 | if (ch == EOF && sb->len == 0) |
| 41 | sb->eof = 1; |
Junio C Hamano | d1df574 | 2005-04-25 18:26:45 -0700 | [diff] [blame] | 42 | strbuf_end(sb); |
| 43 | } |
| 44 | |