};
struct parsedata {
+ Pool *pool;
+ Repo *repo;
+ Repodata *data;
const char *filename;
const char *basename;
int depth;
int lcontent;
int acontent;
int docontent;
- Pool *pool;
- Repo *repo;
- Repodata *data;
struct stateswitch *swtab[NUMSTATES];
enum state sbtab[NUMSTATES];
+ struct joindata jd;
const char *tmplang;
Id reqtype;
* find value for xml attribute
* I: txt, name of attribute
* I: atts, list of key/value attributes
- * I: dup, strdup it
* O: pointer to value of matching key, or NULL
*
*/
static inline const char *
-find_attr(const char *txt, const char **atts, int dup)
+find_attr(const char *txt, const char **atts)
{
for (; *atts; atts += 2)
{
if (!strcmp(*atts, txt))
- return dup ? solv_strdup(atts[1]) : atts[1];
+ return atts[1];
}
return 0;
}
case STATE_CNAME:
case STATE_DESCRIPTION:
case STATE_CDESCRIPTION:
- pd->tmplang = find_attr("xml:lang", atts, 1);
+ pd->tmplang = join_dup(&pd->jd, find_attr("xml:lang", atts));
break;
case STATE_PACKAGEREQ:
{
- const char *type = find_attr("type", atts, 0);
+ const char *type = find_attr("type", atts);
pd->condreq = 0;
pd->reqtype = SOLVABLE_RECOMMENDS;
if (type && !strcmp(type, "conditional"))
{
- const char *requires = find_attr("requires", atts, 0);
+ const char *requires = find_attr("requires", atts);
if (requires && *requires)
pd->condreq = pool_str2id(pool, requires, 1);
}
case STATE_ID:
case STATE_CID:
- s->name = pool_str2id(pd->pool, join2("pattern", ":", pd->content), 1);
+ s->name = pool_str2id(pd->pool, join2(&pd->jd, pd->state == STATE_ID ? "group" : "category", ":", pd->content), 1);
break;
case STATE_NAME:
case STATE_CNAME:
repodata_set_str(pd->data, pd->handle, pool_id2langid(pd->pool, SOLVABLE_SUMMARY, pd->tmplang, 1), pd->content);
- pd->tmplang = solv_free((void *)pd->tmplang);
break;
case STATE_DESCRIPTION:
case STATE_CDESCRIPTION:
repodata_set_str(pd->data, pd->handle, pool_id2langid(pd->pool, SOLVABLE_DESCRIPTION, pd->tmplang, 1), pd->content);
- pd->tmplang = solv_free((void *)pd->tmplang);
break;
case STATE_PACKAGEREQ:
break;
case STATE_GROUPID:
- id = pool_str2id(pd->pool, join2("pattern", ":", pd->content), 1);
+ id = pool_str2id(pd->pool, join2(&pd->jd, "group", ":", pd->content), 1);
s->requires = repo_addid_dep(pd->repo, s->requires, id, 0);
break;
}
XML_ParserFree(parser);
- solv_free((void *)pd.tmplang);
solv_free(pd.content);
- join_freemem();
+ join_freemem(&pd.jd);
if (!(flags & REPO_NO_INTERNALIZE))
repodata_internalize(data);