You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
2.5 KiB
116 lines
2.5 KiB
/* |
|
* 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; |
|
}
|
|
|