commit 0457a601412511b01e395284b467b0a166a1e2f9
parent 7fb0e9f06d56266d2fb8e07bdac7c17b8cf013d0
Author: Samdal <samdal@protonmail.com>
Date: Wed, 16 Nov 2022 18:09:59 +0100
fix dup and add dup example
Diffstat:
2 files changed, 21 insertions(+), 7 deletions(-)
diff --git a/nisse.h b/nisse.h
@@ -91,7 +91,7 @@ extern nde_t nisse_parse_file(char* filename);
extern nde_t nisse_parse_memory(char* mem, int sz);
extern void nisse_free_nde(nde_t* nde);
-void nisse_dup_nde(nde_t* nde);
+extern nde_t nisse_dup_nde(nde_t* nde, int free_old_nde);
@@ -412,18 +412,23 @@ nisse_free_nde(nde_t* nde)
}
}
-void
-nisse_dup_nde(nde_t* nde)
+nde_t
+nisse_dup_nde(nde_t* nde, int free_old_nde)
{
if (nde->type == NISSE_TYPE_STRING) {
- nde->str = strdup(nde->str);
+ char* str = strdup(nde->str);
+ if (free_old_nde && nde->is_str_allocated) free(nde->str);
nde->is_str_allocated = 1;
+ nde->str = str;
} else if (nde->type == NISSE_TYPE_ARRAY) {
- for (int i = 0; i < nde->nde_len; i++) nisse_free_nde(nde->nde + i);
nde_t* n = malloc(nde->nde_len * sizeof(*n));
memcpy(n, nde->nde, nde->nde_len * sizeof(*n));
+ if (free_old_nde && nde->is_nde_allocated) free(nde->nde);
+ nde->nde = n;
nde->is_nde_allocated = 1;
+ for (int i = 0; i < nde->nde_len; i++) nisse_dup_nde(nde->nde + i, free_old_nde);
}
+ return *nde;
}
#endif // NISSE_IMPL
diff --git a/test.c b/test.c
@@ -6,7 +6,6 @@
** This structure contains enough information for nisse to serialise
*/
-nde_t fmt_v3 = nisse_andea(3, nisse_andef(0), nisse_andef(0), nisse_andef(0));
nde_t fmt_item = nisse_andea(1, nisse_tndea("type", 0,));
nde_t fmt_ranged = nisse_andea(2, nisse_andea(1, nisse_andes("damage")),
nisse_andea(1, nisse_andes("range")));
@@ -98,6 +97,14 @@ nde_t nde_arr[] = {
#define ARR_SZ(__ARR) sizeof(__ARR) / sizeof(__ARR[0])
+static nde_t
+get_v3_fmt()
+{
+ // This would normaly be an error since the compound literals are stack allocated,
+ // but the dup command converts everything to heap allocation.
+ return nisse_dup_nde(&(nde_t)nisse_andea(3, nisse_andef(0), nisse_andef(0), nisse_andef(0)), 1);
+}
+
int main()
{
nde_t test = {.type = NISSE_TYPE_ARRAY, .nde_len = ARR_SZ(nde_arr), .nde = nde_arr};
@@ -139,13 +146,15 @@ int main()
}
#endif
-
nde_t* v3a = nisse_nde_get_tagged(&nde, "v3 array");
assert(v3a);
+ nde_t fmt_v3 = get_v3_fmt();
for (int i = 1; i < v3a->nde_len; i++)
if (!nisse_nde_fits_format(v3a->nde+ i, &fmt_v3))
printf("infalid v3 array %d!\n", i);
nisse_write_to_file("./test2.nisse", nde);
+
nisse_free_nde(&nde);
+ nisse_free_nde(&fmt_v3);
}