nisse

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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:
Mnisse.h | 15++++++++++-----
Mtest.c | 13+++++++++++--
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); }