]> git.draconx.ca Git - cdecl99.git/blobdiff - test/declgen.c
Free memory in randomdecl.
[cdecl99.git] / test / declgen.c
index ac9d23e9f185c0c19151837c43ba05ee57bc0cbb..9c774ff6a97ace92499c5020d5f92718c622c640 100644 (file)
@@ -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;
+       }
+}