#include #include #include #include #include typedef struct StringStoreContents { char *key; char *value; } StringStoreContents; struct StringStore { struct StringStoreContents *contents; int size; }; StringStore *stringstore_init(void) { StringStore *stringStore = (StringStore *)malloc(sizeof(StringStore)); memset(stringStore, 0, sizeof(StringStore)); stringStore->size = 0; stringStore->contents = (StringStoreContents *)malloc(sizeof(StringStoreContents)); return stringStore; } StringStore *stringstore_free(StringStore *store) { for (int i = 0; i < store->size; i++) { free(store->contents[i].key); free(store->contents[i].value); } free(store->contents); free(store); return NULL; } int stringstore_add(StringStore *store, const char *key, const char *value) { stringstore_delete(store, key); store->contents = (StringStoreContents *)realloc( store->contents, sizeof(StringStoreContents) * (store->size + 1)); if ((store->contents[store->size].key = strdup(key)) == NULL || (store->contents[store->size].value = strdup(value)) == NULL) { return 0; } store->size++; return 1; } const char *stringstore_retrieve(StringStore *store, const char *key) { for (int i = 0; i < store->size; i++) { if (strcmp(store->contents[i].key, key) == 0) { return store->contents[i].value; } } return NULL; } int stringstore_delete(StringStore *store, const char *key) { for (int i = 0; i < store->size; i++) { if (strcmp(store->contents[i].key, key) == 0) { free(store->contents[i].key); free(store->contents[i].value); if ((i + 1) < store->size) { store->contents[i] = store->contents[i + 1]; } store->size--; return 1; } } return 0; }