+struct sigdata *
+fn2sigdata(struct parsedata *pd, const char *fn, int create)
+{
+ Id id = stringpool_str2id(&pd->sigpool, fn, create);
+ if (!id && !create)
+ return 0;
+ if (id >= pd->nsigdata)
+ {
+ int n = id - pd->nsigdata + 1;
+ pd->sigdata = solv_realloc2(pd->sigdata, pd->nsigdata + n, sizeof(struct sigdata));
+ memset(pd->sigdata + pd->nsigdata, 0, n * sizeof(struct sigdata));
+ pd->nsigdata += n;
+ }
+ return pd->sigdata + id;
+}
+
+void
+freesigdata(struct parsedata *pd)
+{
+ int i;
+ for (i = 0; i < pd->nsigdata; i++)
+ solv_free(pd->sigdata[i].sigs);
+ pd->sigdata = solv_free(pd->sigdata);
+ pd->nsigdata = 0;
+}
+
+static void
+set_xdata(struct parsedata *pd, int handle, char *fn, char *pkgjson, int delayedlocation)
+{
+ struct xdata *xd;
+ handle -= pd->repo->start;
+ if (handle >= pd->nxdata)
+ {
+ int n;
+ if (!fn && !pkgjson && !delayedlocation)
+ return;
+ n = handle - pd->nxdata + 16;
+ pd->xdata = solv_realloc2(pd->xdata, pd->nxdata + n, sizeof(struct xdata));
+ memset(pd->xdata + pd->nxdata, 0, n * sizeof(struct xdata));
+ pd->nxdata += n;
+ }
+ xd = pd->xdata + handle;
+ if (xd->fn)
+ solv_free(xd->fn);
+ if (xd->pkgjson)
+ solv_free(xd->pkgjson);
+ xd->fn = fn;
+ xd->pkgjson = pkgjson;
+ xd->delayedlocation = delayedlocation;
+}
+
+static void
+move_xdata(struct parsedata *pd, int fromhandle, int tohandle)
+{
+ char *fn = 0, *pkgjson = 0;
+ int delayedlocation = 0;
+ fromhandle -= pd->repo->start;
+ if (fromhandle < pd->nxdata)
+ {
+ struct xdata *xd = pd->xdata + fromhandle;
+ fn = xd->fn;
+ pkgjson = xd->pkgjson;
+ delayedlocation = xd->delayedlocation;
+ xd->fn = 0;
+ xd->pkgjson = 0;
+ xd->delayedlocation = 0;
+ }
+ set_xdata(pd, tohandle, fn, pkgjson, delayedlocation);
+}
+
+static int parse_package(struct parsedata *pd, struct solv_jsonparser *jp, char *kfn, char *pkgjson);
+
+static int
+parse_package_with_pkgjson(struct parsedata *pd, struct solv_jsonparser *jp, char *kfn)
+{
+ FILE *fp;
+ int type;
+ char *pkgjson = NULL;
+ int line = jp->line;
+
+ type = jsonparser_collect(jp, JP_OBJECT, &pkgjson);
+ if (type == JP_OBJECT_END && (fp = solv_fmemopen(pkgjson, strlen(pkgjson), "r")) != 0)
+ {
+ struct solv_jsonparser jp2;
+ jsonparser_init(&jp2, fp);
+ jp2.line = line;
+ type = jsonparser_parse(&jp2);
+ type = type == JP_OBJECT ? parse_package(pd, &jp2, kfn, pkgjson) : JP_ERROR;
+ jsonparser_free(&jp2);
+ fclose(fp);
+ }
+ solv_free(pkgjson);
+ return type;
+}
+