void r_free_node(RNode *node, void (*free_fn)(gpointer data)) { gint i; for (i = 0; i < node->num_children; i++) r_free_node(node->children[i], free_fn); if (node->children) g_free(node->children); for (i = 0; i < node->num_pchildren; i++) r_free_pnode(node->pchildren[i], free_fn); if (node->pchildren) g_free(node->pchildren); if (node->key) g_free(node->key); if (node->value && free_fn) free_fn(node->value); g_free(node); }
void r_free_pnode(RNode *node, void (*free_fn)(gpointer data)) { r_free_pnode_only(node->parser); node->key = NULL; r_free_node(node, free_fn); }
void pdb_program_unref(PDBProgram *s) { PDBProgram *self = (PDBProgram *) s; if (--self->ref_cnt == 0) { if (self->rules) r_free_node(self->rules, (void (*)(void *)) pdb_rule_unref); g_free(self); } }
void pdb_rule_set_free(PDBRuleSet *self) { if (self->programs) r_free_node(self->programs, (GDestroyNotify) pdb_program_unref); if (self->version) g_free(self->version); if (self->pub_date) g_free(self->pub_date); self->programs = NULL; self->version = NULL; self->pub_date = NULL; g_free(self); }