| /* |
| * test-obj-pool.c: code to exercise the svn importer's object pool |
| */ |
| |
| #include "cache.h" |
| #include "vcs-svn/obj_pool.h" |
| |
| enum pool { POOL_ONE, POOL_TWO }; |
| obj_pool_gen(one, int, 1) |
| obj_pool_gen(two, int, 4096) |
| |
| static uint32_t strtouint32(const char *s) |
| { |
| char *end; |
| uintmax_t n = strtoumax(s, &end, 10); |
| if (*s == '\0' || (*end != '\n' && *end != '\0')) |
| die("invalid offset: %s", s); |
| return (uint32_t) n; |
| } |
| |
| static void handle_command(const char *command, enum pool pool, const char *arg) |
| { |
| switch (*command) { |
| case 'a': |
| if (!prefixcmp(command, "alloc ")) { |
| uint32_t n = strtouint32(arg); |
| printf("%"PRIu32"\n", |
| pool == POOL_ONE ? |
| one_alloc(n) : two_alloc(n)); |
| return; |
| } |
| case 'c': |
| if (!prefixcmp(command, "commit ")) { |
| pool == POOL_ONE ? one_commit() : two_commit(); |
| return; |
| } |
| if (!prefixcmp(command, "committed ")) { |
| printf("%"PRIu32"\n", |
| pool == POOL_ONE ? |
| one_pool.committed : two_pool.committed); |
| return; |
| } |
| case 'f': |
| if (!prefixcmp(command, "free ")) { |
| uint32_t n = strtouint32(arg); |
| pool == POOL_ONE ? one_free(n) : two_free(n); |
| return; |
| } |
| case 'n': |
| if (!prefixcmp(command, "null ")) { |
| printf("%"PRIu32"\n", |
| pool == POOL_ONE ? |
| one_offset(NULL) : two_offset(NULL)); |
| return; |
| } |
| case 'o': |
| if (!prefixcmp(command, "offset ")) { |
| uint32_t n = strtouint32(arg); |
| printf("%"PRIu32"\n", |
| pool == POOL_ONE ? |
| one_offset(one_pointer(n)) : |
| two_offset(two_pointer(n))); |
| return; |
| } |
| case 'r': |
| if (!prefixcmp(command, "reset ")) { |
| pool == POOL_ONE ? one_reset() : two_reset(); |
| return; |
| } |
| case 's': |
| if (!prefixcmp(command, "set ")) { |
| uint32_t n = strtouint32(arg); |
| if (pool == POOL_ONE) |
| *one_pointer(n) = 1; |
| else |
| *two_pointer(n) = 1; |
| return; |
| } |
| case 't': |
| if (!prefixcmp(command, "test ")) { |
| uint32_t n = strtouint32(arg); |
| printf("%d\n", pool == POOL_ONE ? |
| *one_pointer(n) : *two_pointer(n)); |
| return; |
| } |
| default: |
| die("unrecognized command: %s", command); |
| } |
| } |
| |
| static void handle_line(const char *line) |
| { |
| const char *arg = strchr(line, ' '); |
| enum pool pool; |
| |
| if (arg && !prefixcmp(arg + 1, "one")) |
| pool = POOL_ONE; |
| else if (arg && !prefixcmp(arg + 1, "two")) |
| pool = POOL_TWO; |
| else |
| die("no pool specified: %s", line); |
| |
| handle_command(line, pool, arg + strlen("one ")); |
| } |
| |
| int main(int argc, char *argv[]) |
| { |
| struct strbuf sb = STRBUF_INIT; |
| if (argc != 1) |
| usage("test-obj-str < script"); |
| |
| while (strbuf_getline(&sb, stdin, '\n') != EOF) |
| handle_line(sb.buf); |
| strbuf_release(&sb); |
| return 0; |
| } |