};
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;
Solvable *solvable;
Id handle;
-
- Id langcache[ID_NUM_INTERNAL];
};
* 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;
}
/*
- * create localized tag
- */
-
-static Id
-langtag(struct parsedata *pd, Id tag, const char *language)
-{
- if (language && !language[0])
- language = 0;
- if (!language || tag >= ID_NUM_INTERNAL || 1)
- return pool_id2langid(pd->repo->pool, tag, language, 1);
- if (!pd->langcache[tag])
- pd->langcache[tag] = pool_id2langid(pd->repo->pool, tag, language, 1);
- return pd->langcache[tag];
-}
-
-
-/*
* XML callback: startElement
*/
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, langtag(pd, SOLVABLE_SUMMARY, pd->tmplang), pd->content);
- pd->tmplang = solv_free((void *)pd->tmplang);
+ repodata_set_str(pd->data, pd->handle, pool_id2langid(pd->pool, SOLVABLE_SUMMARY, pd->tmplang, 1), pd->content);
break;
case STATE_DESCRIPTION:
case STATE_CDESCRIPTION:
- repodata_set_str(pd->data, pd->handle, langtag(pd, SOLVABLE_DESCRIPTION, pd->tmplang), pd->content);
- pd->tmplang = solv_free((void *)pd->tmplang);
+ repodata_set_str(pd->data, pd->handle, pool_id2langid(pd->pool, SOLVABLE_DESCRIPTION, pd->tmplang, 1), pd->content);
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);