]>
Commit | Line | Data |
---|---|---|
3bbaec00 DB |
1 | /* |
2 | * test-line-buffer.c: code to exercise the svn importer's input helper | |
3bbaec00 DB |
3 | */ |
4 | ||
5 | #include "git-compat-util.h" | |
e832f43c | 6 | #include "strbuf.h" |
3bbaec00 DB |
7 | #include "vcs-svn/line_buffer.h" |
8 | ||
9 | static uint32_t strtouint32(const char *s) | |
10 | { | |
11 | char *end; | |
12 | uintmax_t n = strtoumax(s, &end, 10); | |
13 | if (*s == '\0' || *end != '\0') | |
14 | die("invalid count: %s", s); | |
15 | return (uint32_t) n; | |
16 | } | |
17 | ||
850c5ea4 JN |
18 | static void handle_command(const char *command, const char *arg, struct line_buffer *buf) |
19 | { | |
20 | switch (*command) { | |
e832f43c JN |
21 | case 'b': |
22 | if (!prefixcmp(command, "binary ")) { | |
23 | struct strbuf sb = STRBUF_INIT; | |
24 | strbuf_addch(&sb, '>'); | |
25 | buffer_read_binary(buf, &sb, strtouint32(arg)); | |
26 | fwrite(sb.buf, 1, sb.len, stdout); | |
27 | strbuf_release(&sb); | |
28 | return; | |
29 | } | |
850c5ea4 JN |
30 | case 'c': |
31 | if (!prefixcmp(command, "copy ")) { | |
7b990c90 | 32 | buffer_copy_bytes(buf, strtouint32(arg)); |
850c5ea4 JN |
33 | return; |
34 | } | |
7b990c90 JN |
35 | case 's': |
36 | if (!prefixcmp(command, "skip ")) { | |
37 | buffer_skip_bytes(buf, strtouint32(arg)); | |
850c5ea4 JN |
38 | return; |
39 | } | |
40 | default: | |
41 | die("unrecognized command: %s", command); | |
42 | } | |
43 | } | |
44 | ||
45 | static void handle_line(const char *line, struct line_buffer *stdin_buf) | |
46 | { | |
47 | const char *arg = strchr(line, ' '); | |
48 | if (!arg) | |
49 | die("no argument in line: %s", line); | |
50 | handle_command(line, arg + 1, stdin_buf); | |
51 | } | |
52 | ||
3bbaec00 DB |
53 | int main(int argc, char *argv[]) |
54 | { | |
850c5ea4 | 55 | struct line_buffer stdin_buf = LINE_BUFFER_INIT; |
d280f683 JN |
56 | struct line_buffer file_buf = LINE_BUFFER_INIT; |
57 | struct line_buffer *input = &stdin_buf; | |
58 | const char *filename; | |
3bbaec00 DB |
59 | char *s; |
60 | ||
d280f683 JN |
61 | if (argc == 1) |
62 | filename = NULL; | |
63 | else if (argc == 2) | |
64 | filename = argv[1]; | |
65 | else | |
cb3f87cf | 66 | usage("test-line-buffer [file | &fd] < script"); |
850c5ea4 JN |
67 | |
68 | if (buffer_init(&stdin_buf, NULL)) | |
3bbaec00 | 69 | die_errno("open error"); |
d280f683 | 70 | if (filename) { |
cb3f87cf JN |
71 | if (*filename == '&') { |
72 | if (buffer_fdinit(&file_buf, strtouint32(filename + 1))) | |
73 | die_errno("error opening fd %s", filename + 1); | |
74 | } else { | |
75 | if (buffer_init(&file_buf, filename)) | |
76 | die_errno("error opening %s", filename); | |
77 | } | |
d280f683 JN |
78 | input = &file_buf; |
79 | } | |
80 | ||
850c5ea4 | 81 | while ((s = buffer_read_line(&stdin_buf))) |
d280f683 JN |
82 | handle_line(s, input); |
83 | ||
84 | if (filename && buffer_deinit(&file_buf)) | |
85 | die("error reading from %s", filename); | |
850c5ea4 | 86 | if (buffer_deinit(&stdin_buf)) |
3bbaec00 DB |
87 | die("input error"); |
88 | if (ferror(stdout)) | |
89 | die("output error"); | |
850c5ea4 | 90 | buffer_reset(&stdin_buf); |
3bbaec00 DB |
91 | return 0; |
92 | } |