/* * 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; }