void hklr_function_free(HklrFunction* function) { hkl_list_traverse(function->stmt_list, free_statements, NULL); hkl_list_free(function->stmt_list); hkl_list_traverse(function->args_list, free_names, NULL); hkl_list_free(function->args_list); hkl_tree_traverse(function->closure_list, dec_closures, NULL); hkl_tree_free(function->closure_list); hkl_free_object(function); }
int main(int argc, const char* argv[]) { HklTree* testtree = hkl_tree_new(); HklString* testname = hkl_string_new(); // Registered tests // This line gives the function "hashtest" defined in test/hash.c // external linkage. If you don't know what that means, don't worry bout it. // :P :3 extern HklTestFunction hashtest; hkl_string_set_utf8(testname, "hash"); hkl_tree_insert(testtree, testname, &hashtest); extern HklTestFunction gctest; hkl_string_set_utf8(testname, "gc"); hkl_tree_insert(testtree, testname, &gctest); extern HklTestFunction traversaltest; hkl_string_set_utf8(testname, "traversal"); hkl_tree_insert(testtree, testname, &traversaltest); if (argv[1] == NULL) { fprintf(stderr, "No test given. Exiting.\n"); return 1; } hkl_string_set_utf8(testname, argv[1]); HklPair* pair = hkl_tree_search(testtree, testname); if (pair == NULL) { fprintf(stderr, "Test \"%s\" does not exist!\n", argv[1]); return 1; } HklTestFunction test = pair->value; if (test) test(&argv[2]); hkl_string_free(testname); hkl_tree_free(testtree); return 0; }
void hkl_hash_clear(HklHash* hash) { assert(hash != NULL); size_t i; HklHashElement* element = NULL; for (i = 0; i < hash->size; ++i) { element = &hash->buckets[i]; if (element->is_tree) hkl_tree_free((HklTree*) element->data); else if (element->data) hkl_pair_free((HklPair*) element->data); element->is_tree = false; element->data = NULL; } hash->length = 0; }