1
+/*
2
+ * test-obj-pool.c: code to exercise the svn importer's object pool
3
+ */
4
+
5
+#include "cache.h"
6
+#include "vcs-svn/obj_pool.h"
7
+
8
+enum pool { POOL_ONE, POOL_TWO };
9
+obj_pool_gen(one, int, 1)
10
+obj_pool_gen(two, int, 4096)
11
+
12
+static uint32_t strtouint32(const char *s)
13
+{
14
+ char *end;
15
+ uintmax_t n = strtoumax(s, &end, 10);
16
+ if (*s == '\0' || (*end != '\n' && *end != '\0'))
17
+ die("invalid offset: %s", s);
18
+ return (uint32_t) n;
19
+}
20
+
21
+static void handle_command(const char *command, enum pool pool, const char *arg)
22
+{
23
+ switch (*command) {
24
+ case 'a':
25
+ if (!prefixcmp(command, "alloc ")) {
26
+ uint32_t n = strtouint32(arg);
27
+ printf("%"PRIu32"\n",
28
+ pool == POOL_ONE ?
29
+ one_alloc(n) : two_alloc(n));
30
+ return;
31
+ }
32
+ case 'c':
33
+ if (!prefixcmp(command, "commit ")) {
34
+ pool == POOL_ONE ? one_commit() : two_commit();
35
+ return;
36
+ }
37
+ if (!prefixcmp(command, "committed ")) {
38
+ printf("%"PRIu32"\n",
39
+ pool == POOL_ONE ?
40
+ one_pool.committed : two_pool.committed);
41
+ return;
42
+ }
43
+ case 'f':
44
+ if (!prefixcmp(command, "free ")) {
45
+ uint32_t n = strtouint32(arg);
46
+ pool == POOL_ONE ? one_free(n) : two_free(n);
47
+ return;
48
+ }
49
+ case 'n':
50
+ if (!prefixcmp(command, "null ")) {
51
+ printf("%"PRIu32"\n",
52
+ pool == POOL_ONE ?
53
+ one_offset(NULL) : two_offset(NULL));
54
+ return;
55
+ }
56
+ case 'o':
57
+ if (!prefixcmp(command, "offset ")) {
58
+ uint32_t n = strtouint32(arg);
59
+ printf("%"PRIu32"\n",
60
+ pool == POOL_ONE ?
61
+ one_offset(one_pointer(n)) :
62
+ two_offset(two_pointer(n)));
63
+ return;
64
+ }
65
+ case 'r':
66
+ if (!prefixcmp(command, "reset ")) {
67
+ pool == POOL_ONE ? one_reset() : two_reset();
68
+ return;
69
+ }
70
+ case 's':
71
+ if (!prefixcmp(command, "set ")) {
72
+ uint32_t n = strtouint32(arg);
73
+ if (pool == POOL_ONE)
74
+ *one_pointer(n) = 1;
75
+ else
76
+ *two_pointer(n) = 1;
77
+ return;
78
+ }
79
+ case 't':
80
+ if (!prefixcmp(command, "test ")) {
81
+ uint32_t n = strtouint32(arg);
82
+ printf("%d\n", pool == POOL_ONE ?
83
+ *one_pointer(n) : *two_pointer(n));
84
+ return;
85
+ }
86
+ default:
87
+ die("unrecognized command: %s", command);
88
+ }
89
+}
90
+
91
+static void handle_line(const char *line)
92
+{
93
+ const char *arg = strchr(line, ' ');
94
+ enum pool pool;
95
+
96
+ if (arg && !prefixcmp(arg + 1, "one"))
97
+ pool = POOL_ONE;
98
+ else if (arg && !prefixcmp(arg + 1, "two"))
99
+ pool = POOL_TWO;
100
+ else
101
+ die("no pool specified: %s", line);
102
+
103
+ handle_command(line, pool, arg + strlen("one "));
104
+}
105
+
106
+int main(int argc, char *argv[])
107
+{
108
+ struct strbuf sb = STRBUF_INIT;
109
+ if (argc != 1)
110
+ usage("test-obj-str < script");
111
+
112
+ while (strbuf_getline(&sb, stdin, '\n') != EOF)
113
+ handle_line(sb.buf);
114
+ strbuf_release(&sb);
115
+ return 0;
116
+}