Skip to content

Instantly share code, notes, and snippets.

@paulc
Created April 21, 2022 22:11
Show Gist options
  • Save paulc/7035b58974a20a2b4e8671219f7313ca to your computer and use it in GitHub Desktop.
Save paulc/7035b58974a20a2b4e8671219f7313ca to your computer and use it in GitHub Desktop.
Simple TAILQ based kv
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <stdio.h>
#include <sys/queue.h>
typedef struct _kv {
char *k;
char *v;
TAILQ_ENTRY(_kv) _tailq;
} kv;
typedef TAILQ_HEAD(_kvlist, _kv) kvlist;
static bool kv_set(kvlist *keys, char *k, char *v) {
kv *item;
// Check for existing kv
TAILQ_FOREACH(item, keys, _tailq) {
if (strcmp(item->k,k) == 0) {
char *old_v = item->v;
if ((item->v = strdup(v)) == NULL) {
return false;
}
free(old_v);
return true;
}
}
// Create new kv
if ((item = calloc(1,sizeof(kv))) == NULL ||
(item->k = strdup(k)) == NULL ||
(item->v = strdup(v)) == NULL) {
goto error;
}
TAILQ_INSERT_TAIL(keys, item, _tailq);
return true;
error:
free(item->v);
free(item->k);
free(item);
return false;
}
static char *kv_get(kvlist *keys, char *k) {
kv *item;
TAILQ_FOREACH(item, keys, _tailq) {
if (strcmp(item->k,k) == 0) {
return item->v;
}
}
return NULL;
}
static void kv_free(kvlist *keys) {
kv *n1, *n2;
n1 = TAILQ_FIRST(keys);
while (n1 != NULL) {
n2 = TAILQ_NEXT(n1, _tailq);
free(n1->k);
free(n1->v);
free(n1);
n1 = n2;
}
}
int main(int argc, char **argv) {
kvlist keys = TAILQ_HEAD_INITIALIZER(keys);
kv_set(&keys, "aa", "123");
kv_set(&keys, "bb", "456");
kv_set(&keys, "cc", "789");
kv_set(&keys, "aa", "999");
printf(">>> %s = %s\n", "aa", kv_get(&keys,"aa"));
printf(">>> %s = %s\n", "bb", kv_get(&keys,"bb"));
printf(">>> %s = %s\n", "zz", kv_get(&keys,"zz"));
kv_free(&keys);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment