/* * test-line-buffer.c: code to exercise the svn importer's input helper */ #include "git-compat-util.h" #include "strbuf.h" #include "vcs-svn/line_buffer.h" static uint32_t strtouint32(const char *s) { char *end; uintmax_t n = strtoumax(s, &end, 10); if (*s == '\0' || *end != '\0') die("invalid count: %s", s); return (uint32_t) n; } static void handle_command(const char *command, const char *arg, struct line_buffer *buf) { switch (*command) { case 'b': if (starts_with(command, "binary ")) { struct strbuf sb = STRBUF_INIT; strbuf_addch(&sb, '>'); buffer_read_binary(buf, &sb, strtouint32(arg)); fwrite(sb.buf, 1, sb.len, stdout); strbuf_release(&sb); return; } case 'c': if (starts_with(command, "copy ")) { buffer_copy_bytes(buf, strtouint32(arg)); return; } case 's': if (starts_with(command, "skip ")) { buffer_skip_bytes(buf, strtouint32(arg)); 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 stdin_buf = LINE_BUFFER_INIT; struct line_buffer file_buf = LINE_BUFFER_INIT; struct line_buffer *input = &stdin_buf; const char *filename; char *s; if (argc == 1) filename = NULL; else if (argc == 2) filename = argv[1]; else usage("test-line-buffer [file | &fd] < script"); if (buffer_init(&stdin_buf, NULL)) die_errno("open error"); if (filename) { if (*filename == '&') { if (buffer_fdinit(&file_buf, strtouint32(filename + 1))) die_errno("error opening fd %s", filename + 1); } else { if (buffer_init(&file_buf, filename)) die_errno("error opening %s", filename); } input = &file_buf; } while ((s = buffer_read_line(&stdin_buf))) handle_line(s, input); if (filename && buffer_deinit(&file_buf)) die("error reading from %s", filename); if (buffer_deinit(&stdin_buf)) die("input error"); if (ferror(stdout)) die("output error"); return 0; }