]> git.draconx.ca Git - cdecl99.git/commitdiff
Free memory in randomdecl.
authorNick Bowler <nbowler@draconx.ca>
Thu, 1 Mar 2012 02:56:36 +0000 (21:56 -0500)
committerNick Bowler <nbowler@draconx.ca>
Sat, 3 Mar 2012 03:33:33 +0000 (22:33 -0500)
Kind of silly to continuously allocate memory for a program intended to
run a long time.

test/declgen.c
test/declgen.h
test/randomdecl.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;
+       }
+}
index 159c794aafc790b2fa58fb852394ce6807d5d305..414f04e2bc3bed106f2dc95d05517b49086da762 100644 (file)
@@ -16,6 +16,11 @@ struct cdecl_declspec *gen_randomize_specs(struct gen_rng *rng,
                                            struct cdecl_declspec *specs);
 struct cdecl_declspec *gen_declspecs(struct gen_rng *rng, unsigned flags);
 struct cdecl_declarator *gen_declarators(struct gen_rng *rng);
+
 struct gen_rng *gen_alloc_rng(const char *seed);
+void gen_free_rng(struct gen_rng *rng);
+
+void gen_free_declspecs(struct cdecl_declspec *x);
+void gen_free_declarators(struct cdecl_declarator *x);
 
 #endif
index 5e8a4a94f59ac54d1653d43dd7e884eb98df9444..0d53af32c2fe4fb293f2c6ed7686668d13771525 100644 (file)
@@ -114,11 +114,14 @@ int main(int argc, char **argv)
 
        for (unsigned long i = 0; !count || i < count; i++) {
                decl = random_decl(rng);
-               if (!decl)
-                       return EXIT_FAILURE;
-
                test_print_decl(decl);
+
+               gen_free_declspecs(decl->specifiers);
+               gen_free_declarators(decl->declarators);
+               free(decl);
        }
 
+       gen_free_rng(rng);
+
        return EXIT_SUCCESS;
 }