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);
}
Example #3
0
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;
}
Example #4
0
// 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;
    }
}
Example #6
0
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;
    }
}
Example #8
0
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;
}