Drop strbuf's 'eof' marker, and make read_line a first class citizen.

read_line is now strbuf_getline, and is a first class citizen, it returns 0
when reading a line worked, EOF else.

The ->eof marker was used non-locally by fast-import.c, mimic the same
behaviour using a static int in "read_next_command", that now returns -1 on
EOF, and avoids to call strbuf_getline when it's in EOF state.

Also no longer automagically strbuf_release the buffer, it's counter
intuitive and breaks fast-import in a very subtle way.

Note: being at EOF implies that command_buf.len == 0.

Signed-off-by: Pierre Habouzit <madcoder@debian.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Pierre Habouzit 2007-09-17 11:19:04 +02:00 committed by Junio C Hamano
parent 8b6087fb25
commit e6c019d0b0
7 changed files with 39 additions and 41 deletions

View File

@ -277,9 +277,7 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix)
while (1) { while (1) {
char *path_name; char *path_name;
const char *p; const char *p;
if (strbuf_getline(&buf, stdin, line_termination) == EOF)
read_line(&buf, stdin, line_termination);
if (buf.eof)
break; break;
if (line_termination && buf.buf[0] == '"') if (line_termination && buf.buf[0] == '"')
path_name = unquote_c_style(buf.buf, NULL); path_name = unquote_c_style(buf.buf, NULL);
@ -292,6 +290,7 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix)
if (path_name != buf.buf) if (path_name != buf.buf)
free(path_name); free(path_name);
} }
strbuf_release(&buf);
} }
if (all) if (all)

View File

@ -327,8 +327,7 @@ static void read_index_info(int line_termination)
* This format is to put higher order stages into the * This format is to put higher order stages into the
* index file and matches git-ls-files --stage output. * index file and matches git-ls-files --stage output.
*/ */
read_line(&buf, stdin, line_termination); if (strbuf_getline(&buf, stdin, line_termination) == EOF)
if (buf.eof)
break; break;
errno = 0; errno = 0;
@ -391,6 +390,7 @@ static void read_index_info(int line_termination)
bad_line: bad_line:
die("malformed index info %s", buf.buf); die("malformed index info %s", buf.buf);
} }
strbuf_release(&buf);
} }
static const char update_index_usage[] = static const char update_index_usage[] =
@ -719,8 +719,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
while (1) { while (1) {
char *path_name; char *path_name;
const char *p; const char *p;
read_line(&buf, stdin, line_termination); if (strbuf_getline(&buf, stdin, line_termination) == EOF)
if (buf.eof)
break; break;
if (line_termination && buf.buf[0] == '"') if (line_termination && buf.buf[0] == '"')
path_name = unquote_c_style(buf.buf, NULL); path_name = unquote_c_style(buf.buf, NULL);
@ -735,6 +734,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)
if (path_name != buf.buf) if (path_name != buf.buf)
free(path_name); free(path_name);
} }
strbuf_release(&buf);
} }
finish: finish:

View File

@ -1584,20 +1584,25 @@ static void dump_marks(void)
mark_file, strerror(errno)); mark_file, strerror(errno));
} }
static void read_next_command(void) static int read_next_command(void)
{ {
static int stdin_eof = 0;
if (stdin_eof) {
unread_command_buf = 0;
return EOF;
}
do { do {
if (unread_command_buf) { if (unread_command_buf) {
unread_command_buf = 0; unread_command_buf = 0;
if (command_buf.eof)
return;
} else { } else {
struct recent_command *rc; struct recent_command *rc;
strbuf_detach(&command_buf); strbuf_detach(&command_buf);
read_line(&command_buf, stdin, '\n'); stdin_eof = strbuf_getline(&command_buf, stdin, '\n');
if (command_buf.eof) if (stdin_eof)
return; return EOF;
rc = rc_free; rc = rc_free;
if (rc) if (rc)
@ -1616,6 +1621,8 @@ static void read_next_command(void)
cmd_tail = rc; cmd_tail = rc;
} }
} while (command_buf.buf[0] == '#'); } while (command_buf.buf[0] == '#');
return 0;
} }
static void skip_optional_lf(void) static void skip_optional_lf(void)
@ -1648,8 +1655,7 @@ static void *cmd_data (size_t *size)
size_t term_len = command_buf.len - 5 - 2; size_t term_len = command_buf.len - 5 - 2;
for (;;) { for (;;) {
read_line(&command_buf, stdin, '\n'); if (strbuf_getline(&command_buf, stdin, '\n') == EOF)
if (command_buf.eof)
die("EOF in data (terminator '%s' not found)", term); die("EOF in data (terminator '%s' not found)", term);
if (term_len == command_buf.len if (term_len == command_buf.len
&& !strcmp(term, command_buf.buf)) && !strcmp(term, command_buf.buf))
@ -2095,7 +2101,7 @@ static void cmd_new_commit(void)
} }
/* file_change* */ /* file_change* */
while (!command_buf.eof && command_buf.len > 0) { while (command_buf.len > 0) {
if (!prefixcmp(command_buf.buf, "M ")) if (!prefixcmp(command_buf.buf, "M "))
file_change_m(b); file_change_m(b);
else if (!prefixcmp(command_buf.buf, "D ")) else if (!prefixcmp(command_buf.buf, "D "))
@ -2110,7 +2116,8 @@ static void cmd_new_commit(void)
unread_command_buf = 1; unread_command_buf = 1;
break; break;
} }
read_next_command(); if (read_next_command() == EOF)
break;
} }
/* build the tree and the commit */ /* build the tree and the commit */
@ -2375,11 +2382,8 @@ int main(int argc, const char **argv)
prepare_packed_git(); prepare_packed_git();
start_packfile(); start_packfile();
set_die_routine(die_nicely); set_die_routine(die_nicely);
for (;;) { while (read_next_command() != EOF) {
read_next_command(); if (!strcmp("blob", command_buf.buf))
if (command_buf.eof)
break;
else if (!strcmp("blob", command_buf.buf))
cmd_new_blob(); cmd_new_blob();
else if (!prefixcmp(command_buf.buf, "commit ")) else if (!prefixcmp(command_buf.buf, "commit "))
cmd_new_commit(); cmd_new_commit();

View File

@ -222,8 +222,7 @@ int pull_targets_stdin(char ***target, const char ***write_ref)
char *rf_one = NULL; char *rf_one = NULL;
char *tg_one; char *tg_one;
read_line(&buf, stdin, '\n'); if (strbuf_getline(&buf, stdin, '\n') == EOF)
if (buf.eof)
break; break;
tg_one = buf.buf; tg_one = buf.buf;
rf_one = strchr(tg_one, '\t'); rf_one = strchr(tg_one, '\t');
@ -239,6 +238,7 @@ int pull_targets_stdin(char ***target, const char ***write_ref)
(*write_ref)[targets] = rf_one ? xstrdup(rf_one) : NULL; (*write_ref)[targets] = rf_one ? xstrdup(rf_one) : NULL;
targets++; targets++;
} }
strbuf_release(&buf);
return targets; return targets;
} }

View File

@ -88,8 +88,7 @@ int main(int ac, char **av)
enum object_type type; enum object_type type;
char *path; char *path;
read_line(&sb, stdin, line_termination); if (strbuf_getline(&sb, stdin, line_termination) == EOF)
if (sb.eof)
break; break;
ptr = sb.buf; ptr = sb.buf;
/* Input is non-recursive ls-tree output format /* Input is non-recursive ls-tree output format
@ -121,6 +120,7 @@ int main(int ac, char **av)
if (path != ntr) if (path != ntr)
free(path); free(path);
} }
strbuf_release(&sb);
write_tree(sha1); write_tree(sha1);
puts(sha1_to_hex(sha1)); puts(sha1_to_hex(sha1));
exit(0); exit(0);

View File

@ -17,7 +17,6 @@ void strbuf_reset(struct strbuf *sb)
{ {
if (sb->len) if (sb->len)
strbuf_setlen(sb, 0); strbuf_setlen(sb, 0);
sb->eof = 0;
} }
char *strbuf_detach(struct strbuf *sb) char *strbuf_detach(struct strbuf *sb)
@ -145,14 +144,13 @@ ssize_t strbuf_read(struct strbuf *sb, int fd, size_t hint)
return sb->len - oldlen; return sb->len - oldlen;
} }
void read_line(struct strbuf *sb, FILE *fp, int term) int strbuf_getline(struct strbuf *sb, FILE *fp, int term)
{ {
int ch; int ch;
if (feof(fp)) {
strbuf_release(sb); strbuf_grow(sb, 0);
sb->eof = 1; if (feof(fp))
return; return EOF;
}
strbuf_reset(sb); strbuf_reset(sb);
while ((ch = fgetc(fp)) != EOF) { while ((ch = fgetc(fp)) != EOF) {
@ -161,11 +159,9 @@ void read_line(struct strbuf *sb, FILE *fp, int term)
strbuf_grow(sb, 1); strbuf_grow(sb, 1);
sb->buf[sb->len++] = ch; sb->buf[sb->len++] = ch;
} }
if (ch == EOF && sb->len == 0) { if (ch == EOF && sb->len == 0)
strbuf_release(sb); return EOF;
sb->eof = 1;
}
strbuf_grow(sb, 1);
sb->buf[sb->len] = '\0'; sb->buf[sb->len] = '\0';
return 0;
} }

View File

@ -44,11 +44,10 @@
struct strbuf { struct strbuf {
size_t alloc; size_t alloc;
size_t len; size_t len;
int eof;
char *buf; char *buf;
}; };
#define STRBUF_INIT { 0, 0, 0, NULL } #define STRBUF_INIT { 0, 0, NULL }
/*----- strbuf life cycle -----*/ /*----- strbuf life cycle -----*/
extern void strbuf_init(struct strbuf *, size_t); extern void strbuf_init(struct strbuf *, size_t);
@ -101,6 +100,6 @@ extern size_t strbuf_fread(struct strbuf *, size_t, FILE *);
/* XXX: if read fails, any partial read is undone */ /* XXX: if read fails, any partial read is undone */
extern ssize_t strbuf_read(struct strbuf *, int fd, size_t hint); extern ssize_t strbuf_read(struct strbuf *, int fd, size_t hint);
extern void read_line(struct strbuf *, FILE *, int); extern int strbuf_getline(struct strbuf *, FILE *, int);
#endif /* STRBUF_H */ #endif /* STRBUF_H */