strbuf: add new function strbuf_getwholeline()

This function is just like strbuf_getline() except it retains the
line-termination character.  This function will be used by the mailinfo
and mailsplit builtins which require the entire line for parsing.

Signed-off-by: Brandon Casey <drafnel@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Brandon Casey 2009-08-04 22:31:56 -05:00 committed by Junio C Hamano
parent 07a4a3b496
commit c7e4f0d78a
2 changed files with 13 additions and 3 deletions

View File

@ -322,7 +322,7 @@ int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint)
return -1; return -1;
} }
int strbuf_getline(struct strbuf *sb, FILE *fp, int term) int strbuf_getwholeline(struct strbuf *sb, FILE *fp, int term)
{ {
int ch; int ch;
@ -332,10 +332,10 @@ int strbuf_getline(struct strbuf *sb, FILE *fp, int term)
strbuf_reset(sb); strbuf_reset(sb);
while ((ch = fgetc(fp)) != EOF) { while ((ch = fgetc(fp)) != EOF) {
if (ch == term)
break;
strbuf_grow(sb, 1); strbuf_grow(sb, 1);
sb->buf[sb->len++] = ch; sb->buf[sb->len++] = ch;
if (ch == term)
break;
} }
if (ch == EOF && sb->len == 0) if (ch == EOF && sb->len == 0)
return EOF; return EOF;
@ -344,6 +344,15 @@ int strbuf_getline(struct strbuf *sb, FILE *fp, int term)
return 0; return 0;
} }
int strbuf_getline(struct strbuf *sb, FILE *fp, int term)
{
if (strbuf_getwholeline(sb, fp, term))
return EOF;
if (sb->buf[sb->len-1] == term)
strbuf_setlen(sb, sb->len-1);
return 0;
}
int strbuf_read_file(struct strbuf *sb, const char *path, size_t hint) int strbuf_read_file(struct strbuf *sb, const char *path, size_t hint)
{ {
int fd, len; int fd, len;

View File

@ -126,6 +126,7 @@ extern ssize_t strbuf_read(struct strbuf *, int fd, size_t hint);
extern int strbuf_read_file(struct strbuf *sb, const char *path, size_t hint); extern int strbuf_read_file(struct strbuf *sb, const char *path, size_t hint);
extern int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint); extern int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint);
extern int strbuf_getwholeline(struct strbuf *, FILE *, int);
extern int strbuf_getline(struct strbuf *, FILE *, int); extern int strbuf_getline(struct strbuf *, FILE *, int);
extern void stripspace(struct strbuf *buf, int skip_comments); extern void stripspace(struct strbuf *buf, int skip_comments);