strbuf.con commit Merge branch 'jc/xsha1' into next (18667f6)
   1#include <stdio.h>
   2#include <stdlib.h>
   3#include "strbuf.h"
   4#include "cache.h"
   5
   6void strbuf_init(struct strbuf *sb) {
   7        sb->buf = NULL;
   8        sb->eof = sb->alloc = sb->len = 0;
   9}
  10
  11static void strbuf_begin(struct strbuf *sb) {
  12        free(sb->buf);
  13        strbuf_init(sb);
  14}
  15
  16static 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);
  20        }
  21        sb->buf[sb->len++] = ch;
  22}
  23
  24static void strbuf_end(struct strbuf *sb) {
  25        strbuf_add(sb, 0);
  26}
  27
  28void 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        }
  40        if (ch == EOF && sb->len == 0)
  41                sb->eof = 1;
  42        strbuf_end(sb);
  43}
  44