void yum_xml_parse_filelists (const char *filename, CountFn count_callback, PackageFn package_callback, gpointer user_data, GError **err) { FilelistSAXContext ctx; SAXContext *sctx = &ctx.sctx; int rc; ctx.state = FILELIST_PARSER_TOPLEVEL; ctx.current_file = NULL; sax_context_init(sctx, "filelists.xml", count_callback, package_callback, user_data, err); xmlSubstituteEntitiesDefault (1); rc = xmlSAXUserParseFile (&filelist_sax_handler, &ctx, filename); if (sctx->current_package) { g_warning ("Incomplete package lost"); package_free (sctx->current_package); } if (ctx.current_file) g_free (ctx.current_file); g_string_free (sctx->text_buffer, TRUE); }
static void primary_parser_package_end (PrimarySAXContext *ctx, const char *name) { SAXContext *sctx = &ctx->sctx; Package *p = sctx->current_package; g_assert (p != NULL); if (!strcmp (name, "package")) { if (sctx->package_fn && !*sctx->error) sctx->package_fn (p, sctx->user_data); package_free (p); sctx->current_package = NULL; sctx->want_text = FALSE; ctx->state = PRIMARY_PARSER_TOPLEVEL; } else if (sctx->text_buffer->len == 0) /* Nothing interesting to do here */ return; else if (!strcmp (name, "name")) p->name = g_string_chunk_insert_len (p->chunk, sctx->text_buffer->str, sctx->text_buffer->len); else if (!strcmp (name, "arch")) p->arch = g_string_chunk_insert_len (p->chunk, sctx->text_buffer->str, sctx->text_buffer->len); else if (!strcmp (name, "checksum")) p->pkgId = g_string_chunk_insert_len (p->chunk, sctx->text_buffer->str, sctx->text_buffer->len); else if (!strcmp (name, "summary")) p->summary = g_string_chunk_insert_len (p->chunk, sctx->text_buffer->str, sctx->text_buffer->len); else if (!strcmp (name, "description")) p->description = g_string_chunk_insert_len (p->chunk, sctx->text_buffer->str, sctx->text_buffer->len); else if (!strcmp (name, "packager")) p->rpm_packager = g_string_chunk_insert_len (p->chunk, sctx->text_buffer->str, sctx->text_buffer->len); else if (!strcmp (name, "url")) p->url = g_string_chunk_insert_len (p->chunk, sctx->text_buffer->str, sctx->text_buffer->len); }
static inline alpm_pkghash_t *pkgcache_add(alpm_pkghash_t *cache, struct pkg *pkg) { struct pkg *old = _alpm_pkghash_find(cache, pkg->name); int vercmp = old == NULL ? 0 : alpm_pkg_vercmp(pkg->version, old->version); if (vercmp == 0 || vercmp == 1) { if (old) { cache = _alpm_pkghash_remove(cache, old, NULL); package_free(old); } return _alpm_pkghash_add(cache, pkg); } return cache; }
// Free an interpreter's state. void hy_free(HyVM *vm) { // Packages for (int i = 0; i < vm->packages_count; i++) { Package *package = vm->packages[i]; package_free(package); } // Arrays free(vm->packages); free(vm->functions); free(vm->numbers); free(vm->strings); // The VM itself free(vm); }
static void other_parser_package_end (OtherSAXContext *ctx, const char *name) { SAXContext *sctx = &ctx->sctx; Package *p = sctx->current_package; g_assert (p != NULL); sctx->want_text = FALSE; if (!strcmp (name, "package")) { if (p->changelogs) p->changelogs = g_slist_reverse (p->changelogs); if (sctx->package_fn && !*sctx->error) sctx->package_fn (p, sctx->user_data); package_free (p); sctx->current_package = NULL; if (ctx->current_entry) { g_free (ctx->current_entry); ctx->current_entry = NULL; } ctx->state = OTHER_PARSER_TOPLEVEL; } else if (!strcmp (name, "changelog")) { ctx->current_entry->changelog = g_string_chunk_insert_len (p->chunk, sctx->text_buffer->str, sctx->text_buffer->len); p->changelogs = g_slist_prepend (p->changelogs, ctx->current_entry); ctx->current_entry = NULL; } }
void ast_free(ast_t* ast) { if(ast == NULL) return; ast_t* child = ast->child; ast_t* next; while(child != NULL) { next = child->sibling; ast_free(child); child = next; } ast_free(ast->type); switch(token_get_id(ast->t)) { case TK_PROGRAM: program_free((program_t*)ast->data); break; case TK_PACKAGE: package_free((package_t*)ast->data); break; case TK_MODULE: source_close((source_t*)ast->data); break; default: break; } token_free(ast->t); symtab_free(ast->symtab); POOL_FREE(ast_t, ast); }
static void filelist_parser_package_end (FilelistSAXContext *ctx, const char *name) { SAXContext *sctx = &ctx->sctx; Package *p = sctx->current_package; g_assert (p != NULL); sctx->want_text = FALSE; if (!strcmp (name, "package")) { if (sctx->package_fn && !*sctx->error) sctx->package_fn (p, sctx->user_data); package_free (p); sctx->current_package = NULL; if (ctx->current_file) { g_free (ctx->current_file); ctx->current_file = NULL; } ctx->state = FILELIST_PARSER_TOPLEVEL; } else if (!strcmp (name, "file")) { PackageFile *file = ctx->current_file; file->name = g_string_chunk_insert_len (p->chunk, sctx->text_buffer->str, sctx->text_buffer->len); if (!file->type) file->type = g_string_chunk_insert_const (p->chunk, "file"); p->files = g_slist_prepend (p->files, file); ctx->current_file = NULL; } }
static struct pkg *load_from_file(int dirfd, const char *filename, const char *arch) { _cleanup_close_ int pkgfd = openat(dirfd, filename, O_RDONLY); if (pkgfd < 0) { err(EXIT_FAILURE, "failed to open %s", filename); } struct pkg *pkg = malloc(sizeof(pkg_t)); zero(pkg, sizeof(pkg_t)); if (load_package(pkg, pkgfd) < 0) goto error; if (arch && pkg->arch && !match_arch(pkg, arch)) goto error; pkg->filename = strdup(filename); return pkg; error: package_free(pkg); return NULL; }