summaryrefslogtreecommitdiffstats
path: root/src/utils/list.c
diff options
context:
space:
mode:
authorJohann CAHIER <johann.cahier@iot.bzh>2019-05-16 17:35:59 +0200
committerJohann CAHIER <johann.cahier@iot.bzh>2019-05-24 10:04:47 +0200
commit5dd410aab93c4ea5c3c04662585c072172ea5547 (patch)
tree3e8a46b7bf643bc918cda5a25872d5b43d4b632c /src/utils/list.c
parent8c0851b6fdf7690ae25a6fbd83e0f2795a8cdf8b (diff)
Better memory management in chained list
key is now managed internally, using a copy. add_elt() / add_key() now provide a 'suffix' parameter. If suffix is given, it is appended to the key. If NULL, or empty string ("") is given, nothing is appended. NOTE : value is still owned by json object. Bug-AGL: SPEC-2416 Change-Id: I624a2dd211801c2d24b2c6739f2c7536a047ea32 Signed-off-by: Johann CAHIER <johann.cahier@iot.bzh>
Diffstat (limited to 'src/utils/list.c')
-rw-r--r--src/utils/list.c29
1 files changed, 23 insertions, 6 deletions
diff --git a/src/utils/list.c b/src/utils/list.c
index c5152a3..030c759 100644
--- a/src/utils/list.c
+++ b/src/utils/list.c
@@ -25,14 +25,31 @@ void destroy_list(struct list* l)
struct list* save;
while (l != NULL) {
save = l->next;
+ free(l->key);
free(l);
l = save;
}
}
-void add_elt(struct list** l, const char* key, json_object* value)
+void add_elt(struct list** l, const char* key, const char* suffix, json_object* value)
{
- struct list* new_elt;
+ struct list* new_elt = NULL;
+ char *suffixed_key = NULL;
+ size_t key_len = strlen(key), suffix_len = -1;
+
+ if (suffix == NULL) {
+ suffix = "";
+ suffix_len=0;
+ } else {
+ suffix_len = strlen(suffix);
+ }
+ suffixed_key = malloc(key_len + suffix_len + 1);
+ if (!suffixed_key) {
+ fprintf(stderr, "list.c, add_elt() : can't allocate 'suffixed_key' (out of memory)");
+ exit(1);
+ }
+ strncpy(suffixed_key, key, key_len);
+ strncpy(suffixed_key+key_len, suffix, suffix_len+1);
// search tail
new_elt = *l;
@@ -44,19 +61,19 @@ void add_elt(struct list** l, const char* key, json_object* value)
// alloc new elem
new_elt = malloc(sizeof(struct list));
if (!new_elt) {
- fprintf(stderr, "OUT of memory");
+ fprintf(stderr, "list.c, add_elt() : can't allocate 'new_elt' (out of memory)");
exit(1);
}
*l = new_elt;
- new_elt->key = key;
+ new_elt->key = suffixed_key;
new_elt->value = value;
new_elt->next = NULL;
}
-void add_key(struct list** l, const char* key)
+void add_key(struct list** l, const char* key, const char* suffix)
{
- add_elt(l, key, NULL);
+ add_elt(l, key, suffix, NULL);
}
int set_value(struct list* l, json_object* val, int index)