static int test21(void) { unsigned int i; long long int keys[] = { 1LL << 32, 1LL << 33, 1LL << 34 }; long long int values[] = { 1LL << 35, 1LL << 36, 1LL << 37 }; struct hashtbl *h; h = hashtbl_create(ht_size, HASHTBL_MAX_LOAD_FACTOR, 1, hashtbl_int64_hash, hashtbl_int64_equals, NULL, NULL, NULL, NULL); CUT_ASSERT_NOT_NULL(h); CUT_ASSERT_EQUAL(0, hashtbl_count(h)); for (i = 0; i < NELEMENTS(keys); i++) { long long int x = keys[i]; CUT_ASSERT_EQUAL(0, hashtbl_insert(h, &keys[i], &values[i])); CUT_ASSERT_NOT_NULL(hashtbl_lookup(h, &x)); CUT_ASSERT_EQUAL(values[i], *(long long *)hashtbl_lookup(h, &x)); } CUT_ASSERT_EQUAL(NELEMENTS(keys), hashtbl_count(h)); for (i = 0; i < NELEMENTS(keys); i++) { long long x = keys[i]; CUT_ASSERT_EQUAL(0, hashtbl_remove(h, &x)); } CUT_ASSERT_EQUAL(0, hashtbl_count(h)); hashtbl_clear(h); hashtbl_delete(h); return 0; }
static int test11(void) { unsigned int i; int keys[] = { 100, 200, 300 }; int values[] = { 1000, 2000, 3000 }; struct hashtbl *h; h = hashtbl_create(ht_size, HASHTBL_MAX_LOAD_FACTOR, 1, hashtbl_int_hash, hashtbl_int_equals, NULL, NULL, NULL, NULL); CUT_ASSERT_NOT_NULL(h); CUT_ASSERT_EQUAL(0, hashtbl_count(h)); for (i = 0; i < NELEMENTS(keys); i++) { int x = keys[i]; CUT_ASSERT_EQUAL(0, hashtbl_insert(h, &keys[i], &values[i])); CUT_ASSERT_NOT_NULL(hashtbl_lookup(h, &x)); CUT_ASSERT_EQUAL(values[i], *(int *)hashtbl_lookup(h, &x)); } CUT_ASSERT_EQUAL(NELEMENTS(keys), hashtbl_count(h)); for (i = 0; i < NELEMENTS(keys); i++) { int x = keys[i]; CUT_ASSERT_EQUAL(0, hashtbl_remove(h, &x)); } CUT_ASSERT_EQUAL(0, hashtbl_count(h)); hashtbl_clear(h); hashtbl_delete(h); return 0; }
static int test7(void) { struct test_key k; struct test_val v; struct hashtbl *h; h = hashtbl_create(ht_size, HASHTBL_MAX_LOAD_FACTOR, 1, key_hash, key_equals, NULL, NULL, NULL, NULL); CUT_ASSERT_NOT_NULL(h); memset(&k, 0, sizeof(k)); memset(&v, 0, sizeof(v)); k.k = 3; v.v = 300; CUT_ASSERT_EQUAL(0, hashtbl_count(h)); CUT_ASSERT_EQUAL(0, hashtbl_insert(h, &k, &v)); CUT_ASSERT_EQUAL(1, hashtbl_count(h)); CUT_ASSERT_EQUAL(&v, hashtbl_lookup(h, &k)); CUT_ASSERT_EQUAL(300, ((struct test_val *)hashtbl_lookup(h, &k))->v); CUT_ASSERT_EQUAL(0, hashtbl_remove(h, &k)); CUT_ASSERT_EQUAL(0, hashtbl_count(h)); CUT_ASSERT_EQUAL(1, hashtbl_remove(h, &k)); CUT_ASSERT_EQUAL(0, hashtbl_count(h)); hashtbl_clear(h); CUT_ASSERT_EQUAL(0, hashtbl_count(h)); hashtbl_delete(h); return 0; }
static int test9(void) { int test9_max = 100; struct hashtbl *h; int i; h = hashtbl_create(ht_size, HASHTBL_MAX_LOAD_FACTOR, 1, key_hash, key_equals, free, free, NULL, NULL); CUT_ASSERT_NOT_NULL(h); CUT_ASSERT_EQUAL(0, hashtbl_count(h)); for (i = 0; i < test9_max; i++) { struct test_key *k = malloc(sizeof(struct test_key)); struct test_val *v = malloc(sizeof(struct test_val)); CUT_ASSERT_NOT_NULL(k); CUT_ASSERT_NOT_NULL(v); memset(k, 0, sizeof(*k)); memset(v, 0, sizeof(*v)); k->k = i; v->v = i + test9_max; CUT_ASSERT_EQUAL(0, hashtbl_insert(h, k, v)); CUT_ASSERT_EQUAL(i + 1, (int) hashtbl_count(h)); CUT_ASSERT_EQUAL(i + test9_max, ((struct test_val *)hashtbl_lookup(h, k))->v); } hashtbl_apply(h, test9_apply_fn1, &test9_max); for (i = 0; i < test9_max; i++) { struct test_key k; struct test_val *v; memset(&k, 0, sizeof(k)); k.k = i; v = hashtbl_lookup(h, &k); CUT_ASSERT_NOT_NULL(v); CUT_ASSERT_EQUAL(i + test9_max, v->v); } for (i = 99; i >= 0; i--) { struct test_key k; struct test_val *v; memset(&k, 0, sizeof(k)); k.k = i; v = hashtbl_lookup(h, &k); CUT_ASSERT_NOT_NULL(v); CUT_ASSERT_EQUAL(v->v - test9_max, i); } hashtbl_clear(h); CUT_ASSERT_EQUAL(0, hashtbl_count(h)); hashtbl_delete(h); return 0; }
static int test4(void) { struct test_key k1, k2; struct test_val v1, v2; struct hashtbl *h; h = hashtbl_create(ht_size, HASHTBL_MAX_LOAD_FACTOR, 1, key_hash, key_equals, NULL, NULL, NULL, NULL); CUT_ASSERT_NOT_NULL(h); memset(&k1, 0, sizeof(k1)); memset(&k2, 0, sizeof(k2)); memset(&v1, 0, sizeof(v1)); memset(&v2, 0, sizeof(v2)); k1.k = 3; v1.v = 300; CUT_ASSERT_EQUAL(0, hashtbl_count(h)); CUT_ASSERT_EQUAL(0, hashtbl_insert(h, &k1, &v1)); CUT_ASSERT_EQUAL(1, hashtbl_count(h)); CUT_ASSERT_EQUAL(&v1, hashtbl_lookup(h, &k1)); CUT_ASSERT_EQUAL(300, ((struct test_val *)hashtbl_lookup(h, &k1))->v); hashtbl_clear(h); CUT_ASSERT_EQUAL(0, hashtbl_count(h)); k2.k = 4; v2.v = 400; CUT_ASSERT_NOT_NULL(h); CUT_ASSERT_EQUAL(0, hashtbl_count(h)); CUT_ASSERT_EQUAL(0, hashtbl_insert(h, &k2, &v2)); CUT_ASSERT_EQUAL(1, hashtbl_count(h)); CUT_ASSERT_EQUAL(&v2, hashtbl_lookup(h, &k2)); CUT_ASSERT_EQUAL(400, ((struct test_val *)hashtbl_lookup(h, &k2))->v); hashtbl_clear(h); CUT_ASSERT_EQUAL(0, hashtbl_count(h)); hashtbl_delete(h); return 0; }
static int test8(void) { struct hashtbl *h; struct test_key *k = malloc(sizeof(struct test_key)); struct test_val *v1 = malloc(sizeof(struct test_val)); struct test_val *v2 = malloc(sizeof(struct test_val)); h = hashtbl_create(ht_size, HASHTBL_MAX_LOAD_FACTOR, 1, key_hash, key_equals, free, free, NULL, NULL); CUT_ASSERT_NOT_NULL(h); CUT_ASSERT_NOT_NULL(k); CUT_ASSERT_NOT_NULL(v1); CUT_ASSERT_NOT_NULL(v2); memset(k, 0, sizeof(*k)); memset(v1, 0, sizeof(*v1)); memset(v2, 0, sizeof(*v2)); k->k = 3; v1->v = 300; v2->v = 600; CUT_ASSERT_EQUAL(0, hashtbl_count(h)); CUT_ASSERT_EQUAL(0, hashtbl_insert(h, k, v1)); CUT_ASSERT_EQUAL(1, hashtbl_count(h)); CUT_ASSERT_EQUAL(v1, hashtbl_lookup(h, k)); CUT_ASSERT_EQUAL(300, ((struct test_val *)hashtbl_lookup(h, k))->v); /* Replace value for same key. */ CUT_ASSERT_EQUAL(0, hashtbl_insert(h, k, v2)); CUT_ASSERT_EQUAL(1, hashtbl_count(h)); CUT_ASSERT_EQUAL(v2, hashtbl_lookup(h, k)); CUT_ASSERT_EQUAL(600, ((struct test_val *)hashtbl_lookup(h, k))->v); CUT_ASSERT_EQUAL(0, hashtbl_remove(h, k)); CUT_ASSERT_EQUAL(0, hashtbl_count(h)); hashtbl_clear(h); CUT_ASSERT_EQUAL(0, hashtbl_count(h)); hashtbl_delete(h); return 0; }
static int test2(void) { struct test_key k; struct hashtbl *h; h = hashtbl_create(ht_size, HASHTBL_MAX_LOAD_FACTOR, 1, key_hash, key_equals, NULL, NULL, NULL, NULL); CUT_ASSERT_NOT_NULL(h); memset(&k, 0, sizeof(k)); k.k = 2; CUT_ASSERT_EQUAL(0, hashtbl_count(h)); CUT_ASSERT_NULL(hashtbl_lookup(h, &k)); hashtbl_clear(h); CUT_ASSERT_EQUAL(0, hashtbl_count(h)); hashtbl_delete(h); return 0; }
static int test1(void) { struct hashtbl *h; struct hashtbl_iter iter; h = hashtbl_create(ht_size, HASHTBL_MAX_LOAD_FACTOR, 1, key_hash, key_equals, NULL, NULL, NULL, NULL); CUT_ASSERT_NOT_NULL(h); CUT_ASSERT_EQUAL(0, hashtbl_count(h)); hashtbl_clear(h); CUT_ASSERT_EQUAL(0, hashtbl_count(h)); hashtbl_iter_init(h, &iter); CUT_ASSERT_FALSE(hashtbl_iter_next(h, &iter)); hashtbl_delete(h); return 0; }
static int test14(void) { unsigned int i; char *keys[] = { "100", "200", "300" }; char *vals[] = { "1000", "2000", "3000" }; struct hashtbl *h; struct hashtbl_iter iter; int key_sum = 0; int val_sum = 0; h = hashtbl_create(ht_size, HASHTBL_MAX_LOAD_FACTOR, 1, hashtbl_string_hash, hashtbl_string_equals, NULL, NULL, NULL, NULL); CUT_ASSERT_NOT_NULL(h); CUT_ASSERT_EQUAL(0, hashtbl_count(h)); for (i = 0; i < NELEMENTS(keys); i++) { CUT_ASSERT_EQUAL(0, hashtbl_insert(h, keys[i], vals[i])); CUT_ASSERT_EQUAL(vals[i], hashtbl_lookup(h, keys[i])); CUT_ASSERT_TRUE(STREQ(vals[i], (char *)hashtbl_lookup(h, keys[i]))); } hashtbl_iter_init(h, &iter); while (hashtbl_iter_next(h, &iter)) { key_sum += atoi(iter.key); val_sum += atoi(iter.val); } CUT_ASSERT_EQUAL(600, key_sum); CUT_ASSERT_EQUAL(6000, val_sum); hashtbl_clear(h); hashtbl_delete(h); return 0; }
/* parse the supplied dependency file */ static void parse_dep_file(void *dmap, size_t len){ char *m = dmap, *end = m + len, *tgt, *prereq; int fd; unsigned int size; unsigned int confh_len = strlen(conf_header); char *fmap; /* clear hash table */ hashtbl_clear(); /* find target */ while(m < end && (*m == ' ' || *m == '\\' || *m == '\n')) m++; tgt = m; while(m < end && *m != ':') m++; if(m < end) *m = 0; m++; /* print target */ printf("%s:", tgt); /* handle prerequisites */ while(m < end){ // find next prerequisites while(m < end && (*m == ' ' || *m == '\\' || *m == '\n')) m++; prereq = m; while(m < end && *m != ' ' && *m != '\n' && *m != '\\') m++; // break if prerequisite is actually a target if(m > 0 && m[-1] == ':'){ *m = 0; m++; printf("\n\n%s", prereq); break; } if(m < end) *m = 0; if(m >= end || tgt >= end || prereq >= end) break; // parse prerequisite that are not the conf_header if(strrcmp(prereq, m - prereq, conf_header, confh_len)){ printf(" \\\n %s", prereq); if(file_map(prereq, &fd, (void*)&fmap, &size) != 0) return; parse_prereq(fmap, size); file_unmap(fd, fmap, size); } m++; } /* print the remainder of the dependency file, * i.e. remaining targets */ printf("\n%s", m); }