-
-
Save minimum-necessary-change/31133a7c4af0175c8be22cf874a875e0 to your computer and use it in GitHub Desktop.
A key/value dictionary system in C
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* A key/value dict system in C */ | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #define TEST TRUE /* Comment this line out to compile without a main function (used when including into another application). */ | |
| typedef struct dict_t_struct { | |
| char *key; | |
| void *value; | |
| struct dict_t_struct *next; | |
| } dict_t; | |
| dict_t **dict_alloc(void) { | |
| return malloc(sizeof(dict_t)); | |
| } | |
| void dict_dealloc(dict_t *dict) { | |
| dict_t *ptr; | |
| for (ptr = dict; ptr != NULL; ptr = ptr->next) { | |
| free(ptr); | |
| } | |
| } | |
| void *dict_getItem(dict_t *dict, char *key) { | |
| dict_t *ptr; | |
| for (ptr = dict; ptr != NULL; ptr = ptr->next) { | |
| if (strcmp(ptr->key, key) == 0) { | |
| return ptr->value; | |
| } | |
| } | |
| return NULL; | |
| } | |
| void dict_delItem(dict_t **dict, char *key) { | |
| dict_t *ptr, *prev; | |
| for (ptr = *dict, prev = NULL; ptr != NULL; prev = ptr, ptr = ptr->next) { | |
| if (strcmp(ptr->key, key) == 0) { | |
| if (ptr->next != NULL) { | |
| if (prev == NULL) { | |
| *dict = ptr->next; | |
| } else { | |
| prev->next = ptr->next; | |
| } | |
| } else if (prev != NULL) { | |
| prev->next = NULL; | |
| } else { | |
| *dict = NULL; | |
| } | |
| free(ptr->key); | |
| free(ptr); | |
| return; | |
| } | |
| } | |
| } | |
| void dict_addItem(dict_t **dict, char *key, void *value) { | |
| dict_delItem(dict, key); /* If we already have a item with this key, delete it. */ | |
| dict_t *d = malloc(sizeof(struct dict_t_struct)); | |
| d->key = malloc(strlen(key)+1); | |
| strcpy(d->key, key); | |
| d->value = value; | |
| d->next = *dict; | |
| *dict = d; | |
| } | |
| int dict_size(dict_t *dict) { | |
| int size = 0; | |
| dict_t *ptr; | |
| for (ptr = dict; ptr != NULL; ptr = ptr->next) { | |
| size++; | |
| } | |
| return size; | |
| } | |
| dict_t **dict_invert(dict_t *dict) { | |
| dict_t **invert = dict_alloc(); | |
| dict_t *ptr; | |
| for (ptr = dict; ptr != NULL; ptr = ptr->next) { | |
| dict_addItem(invert, ptr->value, ptr->key); | |
| } | |
| return invert; | |
| } | |
| #ifdef TEST | |
| int main(int argc, char **argv) { | |
| /* Create a dict */ | |
| dict_t **dict = dict_alloc(); | |
| /* lets add foo, and bar to the dict */ | |
| dict_addItem(dict, "foo", "bar"); | |
| dict_addItem(dict, "bar", "foo"); | |
| /* and print their values */ | |
| printf("%s %s (size: %i)\n", (char *)dict_getItem(*dict, "foo"), (char *)dict_getItem(*dict, "bar"), dict_size(*dict)); | |
| /* lets delete them */ | |
| dict_delItem(dict, "foo"); | |
| dict_delItem(dict, "bar"); | |
| /* see, their gone, there NULL */ | |
| printf("%s %s (size: %i)\n", (char *)dict_getItem(*dict, "foo"), (char *)dict_getItem(*dict, "bar"), dict_size(*dict)); | |
| /* add them again to proof it works */ | |
| dict_addItem(dict, "foo", "bar"); | |
| dict_addItem(dict, "bar", "foo"); | |
| dict_addItem(dict, "bar", "pan"); | |
| /* see, here */ | |
| printf("%s %s (size: %i)\n", (char *)dict_getItem(*dict, "foo"), (char *)dict_getItem(*dict, "bar"), dict_size(*dict)); | |
| /* invert the dict */ | |
| dict_t **invert = dict_invert(*dict); | |
| printf("%s %s (size: %i)\n", (char *)dict_getItem(*invert, "bar"), (char *)dict_getItem(*invert, "pan"), dict_size(*invert)); | |
| dict_dealloc(*invert); | |
| dict_delItem(dict, "foo"); | |
| dict_delItem(dict, "bar"); | |
| dict_dealloc(*dict); | |
| return 0; | |
| } | |
| #endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment