/** * Free di_packages_allocator */ void di_packages_allocator_free (di_packages_allocator *allocator) { di_mem_chunk_destroy (allocator->package_mem_chunk); di_mem_chunk_destroy (allocator->package_dependency_mem_chunk); di_mem_chunk_destroy (allocator->slist_node_mem_chunk); di_free (allocator); }
/** * Free di_packages */ void di_packages_free (di_packages *packages) { if (!packages) return; di_hash_table_destroy (packages->table); di_free (packages); }
static void di_tree_node_destroy (di_tree *tree, di_tree_node *node) { if (!node) return; di_tree_node_destroy (tree, node->left); di_tree_node_destroy (tree, node->right); if (tree->key_destroy_func) tree->key_destroy_func (node->key); if (tree->value_destroy_func) tree->value_destroy_func (node->value); di_free (node); }
void di_tree_destroy (di_tree *tree) { di_tree_node_destroy (tree, tree->root); di_free (tree); }
void *status_read(void) { FILE *f; void *status = 0; struct package_t *m = 0, *p = 0, *t = 0; if ((f = fopen(STATUSFILE, "r")) == NULL) { perror(STATUSFILE); return 0; } if (getenv(UDPKG_QUIET) == NULL) printf("(Reading database...)\n"); while (!feof(f)) { m = (struct package_t *)di_malloc(sizeof(struct package_t)); memset(m, 0, sizeof(struct package_t)); control_read(f, m); if (m->package) { /* * If there is an item in the tree by this name, * it must be a virtual package; insert real * package in preference. */ tdelete(m, &status, package_compare); tsearch(m, &status, package_compare); if (m->provides) { /* * A "Provides" triggers the insertion * of a pseudo package into the status * binary-tree. */ p = (struct package_t *)di_malloc(sizeof(struct package_t)); memset(p, 0, sizeof(struct package_t)); p->package = strdup(m->provides); t = *(struct package_t **)tsearch(p, &status, package_compare); if (!(t == p)) { di_free(p->package); di_free(p); } else { /* * Pseudo package status is the * same as the status of the * package providing it * FIXME: (not quite right, if 2 * packages of different statuses * provide it). */ t->status = m->status; } } } else { di_free(m); } } fclose(f); return status; }