/* A key/value dict system in C */ #include #include #include #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