/* This file is part of ct. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Takwrap. If not, see . */ #include "hashtable.h" // =================================================================== // Helper declarations // =================================================================== ht_entry_t * new_ll_node(const uint64_t key, void *data); // =================================================================== // Exported functions // =================================================================== hashtable_t *ht_init(void) { hashtable_t *table = malloc(sizeof(struct hashtable_s)); table->num_entries = 0; for (uint32_t k=0; k<=HASHTABLE_SIZE; k++) table->entries[k] = NULL; return EXIT_SUCCESS; } void ht_free(void *data_free(void*), hashtable_t *table) { ht_entry_t *n, *nn; for (uint32_t k=0; k<=HASHTABLE_SIZE; k++) { n = table->entries[k]; while (n) { nn = n->next; data_free(n->data); free(n); n = nn; } } } ht_entry_t *ht_seek(const uint64_t key, hashtable_t *table) { ht_entry_t *lookup = table->entries[key & HASHTABLE_SIZE]; while (lookup && lookup->key != key) lookup = lookup->next; return lookup; } int ht_insert(const uint64_t key, void *data, hashtable_t *table) { ht_entry_t *new = new_ll_node(key, data), *n; // TODO: trap const uint32_t idx = key & HASHTABLE_SIZE; if ((n = table->entries[idx]) != NULL) { for (; n->next != NULL; n = n->next); n->next = new; } else { table->entries[idx] = new; } table->num_entries++; return EXIT_SUCCESS; } // =================================================================== // Helper function implementations // =================================================================== ht_entry_t *new_ll_node(const uint64_t key, void *data) { ht_entry_t *new = malloc(sizeof(struct ht_node_s)); // TODO: trap errno new->key = key; new->next = NULL; new->data = data; return new; }