list_t *packages_list_init(void) { list_t *self; FILE *dbfile; char *line, *name, *version; int nread; size_t n; dbfile = fopen("/var/lib/pkg/db", "r"); if (!dbfile) return NULL; self = list_new(); line = NULL; name = NULL; version = NULL; while ((nread = getline(&line, &n, dbfile)) > 0) { *(line + strlen(line) - 1) = 0; if (!name) name = xstrdup(line); else if (!version) version = xstrdup(line); else if (!strlen(line)) { list_append(self, package_new(name, version)); name = version = NULL; } } free(line); fclose(dbfile); return self; }
static void other_parser_toplevel_start (OtherSAXContext *ctx, const char *name, const char **attrs) { SAXContext *sctx = &ctx->sctx; if (!strcmp (name, "package")) { g_assert (sctx->current_package == NULL); ctx->state = OTHER_PARSER_PACKAGE; sctx->current_package = package_new (); parse_package (attrs, sctx->current_package); } else if (sctx->count_fn && !strcmp (name, "otherdata")) { int i; const char *attr; const char *value; for (i = 0; attrs && attrs[i]; i++) { attr = attrs[i]; value = attrs[++i]; if (!strcmp (attr, "packages")) { sctx->count_fn (string_to_guint32_with_default (value, 0), sctx->user_data); break; } } } }