X-Git-Url: https://git.draconx.ca/gitweb/cdecl99.git/blobdiff_plain/9628bd06223d7e1730574ca0c93d76b1d39856b4..582d63a4d10968f6729410310fdd520a41941b17:/test/declgen.c diff --git a/test/declgen.c b/test/declgen.c index ac9d23e..9c774ff 100644 --- a/test/declgen.c +++ b/test/declgen.c @@ -390,11 +390,74 @@ struct gen_rng *gen_alloc_rng(const char *seed_str) return NULL; } - rng = malloc(sizeof *rng); - if (rng) { - rng->rng = gsl_rng_alloc(gsl_rng_mt19937); - gsl_rng_set(rng->rng, seed); - } + rng = malloc_nofail(sizeof *rng); + rng->rng = gsl_rng_alloc(gsl_rng_mt19937); + gsl_rng_set(rng->rng, seed); return rng; } + +void gen_free_rng(struct gen_rng *rng) +{ + if (rng) + gsl_rng_free(rng->rng); + free(rng); +} + +static void gen_free_parameters(struct cdecl *x) +{ + struct cdecl *p; + + while (x) { + p = x->next; + + gen_free_declspecs(x->specifiers); + gen_free_declarators(x->declarators); + free(x); + + x = p; + } +} + +void gen_free_declspecs(struct cdecl_declspec *x) +{ + struct cdecl_declspec *p; + + while (x) { + p = x->next; + free(x->ident); + free(x); + x = p; + } +} + +void gen_free_declarators(struct cdecl_declarator *x) +{ + struct cdecl_declarator *p; + + while (x) { + p = x->child; + + switch (x->type) { + case CDECL_DECL_NULL: + break; + case CDECL_DECL_IDENT: + free(x->u.ident); + break; + case CDECL_DECL_POINTER: + gen_free_declspecs(x->u.pointer.qualifiers); + break; + case CDECL_DECL_ARRAY: + free(x->u.array.vla); + break; + case CDECL_DECL_FUNCTION: + gen_free_parameters(x->u.function.parameters); + break; + default: + assert(0); + } + + free(x); + x = p; + } +}