From 850c5ea44ce0b4aac3be7c4d14b38ec901e777d1 Mon Sep 17 00:00:00 2001 From: Jonathan Nieder Date: Sun, 2 Jan 2011 18:50:16 -0600 Subject: [PATCH] vcs-svn: make test-line-buffer input format more flexible Imitate the input format of test-obj-pool to support arbitrary sequences of commands rather than alternating read/copy. This should make it easier to add tests that exercise other line_buffer functions. Signed-off-by: Jonathan Nieder --- t/t0080-vcs-svn.sh | 18 +++++++-------- test-line-buffer.c | 56 +++++++++++++++++++++++++++++----------------- 2 files changed, 45 insertions(+), 29 deletions(-) diff --git a/t/t0080-vcs-svn.sh b/t/t0080-vcs-svn.sh index d3225ada6..8be97002a 100755 --- a/t/t0080-vcs-svn.sh +++ b/t/t0080-vcs-svn.sh @@ -85,40 +85,40 @@ test_expect_success 'line buffer' ' printf "%s\n" "" foo >expected6 && test-line-buffer <<-\EOF >actual1 && - 5 + read 5 HELLO EOF test-line-buffer <<-\EOF >actual2 && - 0 + read 0 - 5 + copy 5 HELLO EOF q_to_nul <<-\EOF | - 1 + read 1 Q EOF test-line-buffer >actual3 && q_to_nul <<-\EOF | - 0 + read 0 - 1 + copy 1 Q EOF test-line-buffer >actual4 && test-line-buffer <<-\EOF >actual5 && - 5 + read 5 foo EOF test-line-buffer <<-\EOF >actual6 && - 0 + read 0 - 5 + copy 5 foo EOF diff --git a/test-line-buffer.c b/test-line-buffer.c index f9af892d2..383f35bba 100644 --- a/test-line-buffer.c +++ b/test-line-buffer.c @@ -1,11 +1,5 @@ /* * test-line-buffer.c: code to exercise the svn importer's input helper - * - * Input format: - * number NL - * (number bytes) NL - * number NL - * ... */ #include "git-compat-util.h" @@ -20,28 +14,50 @@ static uint32_t strtouint32(const char *s) return (uint32_t) n; } +static void handle_command(const char *command, const char *arg, struct line_buffer *buf) +{ + switch (*command) { + case 'c': + if (!prefixcmp(command, "copy ")) { + buffer_copy_bytes(buf, strtouint32(arg) + 1); + return; + } + case 'r': + if (!prefixcmp(command, "read ")) { + const char *s = buffer_read_string(buf, strtouint32(arg)); + printf("%s\n", s); + buffer_skip_bytes(buf, 1); /* consume newline */ + return; + } + default: + die("unrecognized command: %s", command); + } +} + +static void handle_line(const char *line, struct line_buffer *stdin_buf) +{ + const char *arg = strchr(line, ' '); + if (!arg) + die("no argument in line: %s", line); + handle_command(line, arg + 1, stdin_buf); +} + int main(int argc, char *argv[]) { - struct line_buffer buf = LINE_BUFFER_INIT; + struct line_buffer stdin_buf = LINE_BUFFER_INIT; char *s; if (argc != 1) - usage("test-line-buffer < input.txt"); - if (buffer_init(&buf, NULL)) + usage("test-line-buffer < script"); + + if (buffer_init(&stdin_buf, NULL)) die_errno("open error"); - while ((s = buffer_read_line(&buf))) { - s = buffer_read_string(&buf, strtouint32(s)); - fputs(s, stdout); - fputc('\n', stdout); - buffer_skip_bytes(&buf, 1); - if (!(s = buffer_read_line(&buf))) - break; - buffer_copy_bytes(&buf, strtouint32(s) + 1); - } - if (buffer_deinit(&buf)) + while ((s = buffer_read_line(&stdin_buf))) + handle_line(s, &stdin_buf); + if (buffer_deinit(&stdin_buf)) die("input error"); if (ferror(stdout)) die("output error"); - buffer_reset(&buf); + buffer_reset(&stdin_buf); return 0; } -- 2.30.2