| /* |
| * 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 (!prefixcmp(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 (!prefixcmp(command, "copy ")) { |
| buffer_copy_bytes(buf, strtouint32(arg)); |
| return; |
| } |
| case 's': |
| if (!prefixcmp(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; |
| } |