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