From 6eef93dc05a1b937eb6a50e8d17c825f9bdc4465 Mon Sep 17 00:00:00 2001 From: Eduardo Silva Date: Fri, 16 Feb 2024 18:40:32 -0600 Subject: [PATCH] kvlist: add new functions Signed-off-by: Eduardo Silva --- include/cfl/cfl_kvlist.h | 4 +++ src/cfl_kvlist.c | 57 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/include/cfl/cfl_kvlist.h b/include/cfl/cfl_kvlist.h index d766e96..3f41bef 100644 --- a/include/cfl/cfl_kvlist.h +++ b/include/cfl/cfl_kvlist.h @@ -76,4 +76,8 @@ int cfl_kvlist_count(struct cfl_kvlist *list); struct cfl_variant *cfl_kvlist_fetch(struct cfl_kvlist *list, char *key); int cfl_kvlist_print(FILE *fp, struct cfl_kvlist *list); +int cfl_kvlist_contains(struct cfl_kvlist *kvlist, char *name); +int cfl_kvlist_remove(struct cfl_kvlist *kvlist, char *name); +void cfl_kvpair_destroy(struct cfl_kvpair *pair); + #endif diff --git a/src/cfl_kvlist.c b/src/cfl_kvlist.c index bdfc9f0..f9f13ee 100644 --- a/src/cfl_kvlist.c +++ b/src/cfl_kvlist.c @@ -411,3 +411,60 @@ int cfl_kvlist_print(FILE *fp, struct cfl_kvlist *list) return ret; } + +int cfl_kvlist_contains(struct cfl_kvlist *kvlist, char *name) +{ + struct cfl_list *iterator; + struct cfl_kvpair *pair; + + cfl_list_foreach(iterator, &kvlist->list) { + pair = cfl_list_entry(iterator, + struct cfl_kvpair, _head); + + if (strcasecmp(pair->key, name) == 0) { + return CFL_TRUE; + } + } + + return CFL_FALSE; +} + + +int cfl_kvlist_remove(struct cfl_kvlist *kvlist, char *name) +{ + struct cfl_list *iterator_backup; + struct cfl_list *iterator; + struct cfl_kvpair *pair; + + cfl_list_foreach_safe(iterator, iterator_backup, &kvlist->list) { + pair = cfl_list_entry(iterator, + struct cfl_kvpair, _head); + + if (strcasecmp(pair->key, name) == 0) { + cfl_kvpair_destroy(pair); + } + } + + return CFL_TRUE; +} + + +void cfl_kvpair_destroy(struct cfl_kvpair *pair) +{ + if (pair != NULL) { + if (!cfl_list_entry_is_orphan(&pair->_head)) { + cfl_list_del(&pair->_head); + } + + if (pair->key != NULL) { + cfl_sds_destroy(pair->key); + } + + if (pair->val != NULL) { + cfl_variant_destroy(pair->val); + } + + free(pair); + } +} +