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;
+ }
+}
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
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;
}