Id evr;
Id arch;
};
+
struct parsedata {
- char *kind;
+ Pool *pool;
Repo *repo;
Repodata *data;
+ char *kind;
int flags;
- struct parsedata_common common;
int last_found_source;
struct datashare *share_with;
int nshare;
- Id (*dirs)[3]; // dirid, size, nfiles
+ Id (*dirs)[3]; /* dirid, size, nfiles */
int ndirs;
- Id langcache[ID_NUM_INTERNAL];
+ struct joindata jd;
+ char *language; /* the default language */
+ Id langcache[ID_NUM_INTERNAL]; /* cache for the default language */
int lineno;
};
static Id
langtag(struct parsedata *pd, Id tag, const char *language)
{
- if (language && !language[0])
- language = 0;
- if (!language || tag >= ID_NUM_INTERNAL)
+ if (language && *language)
return pool_id2langid(pd->repo->pool, tag, language, 1);
- return pool_id2langid(pd->repo->pool, tag, language, 1);
+ if (!pd->language)
+ return tag;
+ if (tag >= ID_NUM_INTERNAL)
+ return pool_id2langid(pd->repo->pool, tag, pd->language, 1);
if (!pd->langcache[tag])
- pd->langcache[tag] = pool_id2langid(pd->repo->pool, tag, language, 1);
+ pd->langcache[tag] = pool_id2langid(pd->repo->pool, tag, pd->language, 1);
return pd->langcache[tag];
}
exit(1);
}
if (kind)
- id = pool_str2id(pool, join2(kind, ":", sp[0]), 1);
+ id = pool_str2id(pool, join2(&pd->jd, kind, ":", sp[0]), 1);
else
id = pool_str2id(pool, sp[0], 1);
if (i == 3)
Repo *repo = s->repo;
Pool *pool = repo->pool;
char *sp[5];
+ Id name;
+ Id evr;
+ Id arch;
if (split(line, sp, 5) != 4)
{
exit(1);
}
- Id name = pool_str2id(pool, sp[0], 1);
- Id evr = makeevr(pool, join2(sp[1], "-", sp[2]));
- Id arch = pool_str2id(pool, sp[3], 1);
+ name = pool_str2id(pool, sp[0], 1);
+ evr = makeevr(pool, join2(&pd->jd, sp[1], "-", sp[2]));
+ arch = pool_str2id(pool, sp[3], 1);
/* XXX: could record a dep here, depends on where we want to store the data */
if (name == s->name)
repodata_set_void(pd->data, handle, SOLVABLE_SOURCENAME);
add_dirline(struct parsedata *pd, char *line)
{
char *sp[6];
+ long filesz;
+ long filenum;
+ unsigned dirid;
if (split(line, sp, 6) != 5)
return;
pd->dirs = solv_extend(pd->dirs, pd->ndirs, 1, sizeof(pd->dirs[0]), 31);
- long filesz = strtol(sp[1], 0, 0);
+ filesz = strtol(sp[1], 0, 0);
filesz += strtol(sp[2], 0, 0);
- long filenum = strtol(sp[3], 0, 0);
+ filenum = strtol(sp[3], 0, 0);
filenum += strtol(sp[4], 0, 0);
/* hack: we know that there's room for a / */
if (*sp[0] != '/')
*--sp[0] = '/';
- unsigned dirid = repodata_str2dir(pd->data, sp[0], 1);
+ dirid = repodata_str2dir(pd->data, sp[0], 1);
#if 0
fprintf(stderr, "%s -> %d\n", sp[0], dirid);
#endif
line = malloc(1024);
aline = 1024;
- pd.repo = pd.common.repo = repo;
+ pd.pool = pool;
+ pd.repo = repo;
pd.data = data;
- pd.common.pool = pool;
pd.flags = flags;
+ pd.language = language && *language ? solv_strdup(language) : 0;
linep = line;
s = 0;
continue;
if (! (line[0] && line[1] && line[2] && line[3] && (line[4] == ':' || line[4] == '.')))
continue;
+ line_lang[0] = 0;
if (line[4] == '.')
{
char *endlang;
endlang = strchr(line + 5, ':');
if (endlang)
{
+ int langsize = endlang - (line + 5);
keylen = endlang - line - 1;
- strncpy(line_lang, line + 5, 5);
- line_lang[endlang - line - 5] = 0;
+ if (langsize > 5)
+ langsize = 5;
+ strncpy(line_lang, line + 5, langsize);
+ line_lang[langsize] = 0;
}
}
- else
- line_lang[0] = 0;
tag = tag_from_string(line);
if (indelta)
if (split(line + 5, sp, 5) != 5)
continue;
repodata_set_id(data, handle, DELTA_SEQ_NAME, pool_str2id(pool, sp[0], 1));
- evr = makeevr(pool, join2(sp[1], "-", sp[2]));
+ evr = makeevr(pool, join2(&pd.jd, sp[1], "-", sp[2]));
repodata_set_id(data, handle, DELTA_SEQ_EVR, evr);
/* repodata_set_id(data, handle, DELTA_SEQ_ARCH, pool_str2id(pool, sp[3], 1)); */
repodata_set_str(data, handle, DELTA_SEQ_NUM, sp[4]);
}
handle = repodata_new_handle(data);
repodata_set_id(data, handle, DELTA_PACKAGE_NAME, pool_str2id(pool, sp[0], 1));
- repodata_set_id(data, handle, DELTA_PACKAGE_EVR, makeevr(pool, join2(sp[1], "-", sp[2])));
+ repodata_set_id(data, handle, DELTA_PACKAGE_EVR, makeevr(pool, join2(&pd.jd, sp[1], "-", sp[2])));
repodata_set_id(data, handle, DELTA_PACKAGE_ARCH, pool_str2id(pool, sp[3], 1));
repodata_add_flexarray(data, SOLVID_META, REPOSITORY_DELTAINFO, handle);
indelta = 1;
Id name, evr, arch;
/* we don't use the create flag here as a simple pre-check for existance */
if (pd.kind)
- name = pool_str2id(pool, join2(pd.kind, ":", sp[0]), 0);
+ name = pool_str2id(pool, join2(&pd.jd, pd.kind, ":", sp[0]), 0);
else
name = pool_str2id(pool, sp[0], 0);
- evr = makeevr(pool, join2(sp[1], "-", sp[2]));
+ evr = makeevr(pool, join2(&pd.jd, sp[1], "-", sp[2]));
arch = pool_str2id(pool, sp[3], 0);
if (name && arch)
{
/* normal operation. create a new solvable. */
s = pool_id2solvable(pool, repo_add_solvable(repo));
if (pd.kind)
- s->name = pool_str2id(pool, join2(pd.kind, ":", sp[0]), 1);
+ s->name = pool_str2id(pool, join2(&pd.jd, pd.kind, ":", sp[0]), 1);
else
s->name = pool_str2id(pool, sp[0], 1);
- s->evr = makeevr(pool, join2(sp[1], "-", sp[2]));
+ s->evr = makeevr(pool, join2(&pd.jd, sp[1], "-", sp[2]));
s->arch = pool_str2id(pool, sp[3], 1);
s->vendor = defvendor;
createdpkgs = 1;
repodata_set_str(data, handle, SOLVABLE_AUTHORS, line + 6);
continue;
case CTAG('=', 'S', 'u', 'm'):
- repodata_set_str(data, handle, langtag(&pd, SOLVABLE_SUMMARY, language ? language : line_lang), line + 3 + keylen );
+ repodata_set_str(data, handle, langtag(&pd, SOLVABLE_SUMMARY, line_lang), line + 3 + keylen);
continue;
case CTAG('=', 'D', 'e', 's'):
- repodata_set_str(data, handle, langtag(&pd, SOLVABLE_DESCRIPTION, language ? language : line_lang), line + 3 + keylen );
+ repodata_set_str(data, handle, langtag(&pd, SOLVABLE_DESCRIPTION, line_lang), line + 3 + keylen);
continue;
case CTAG('=', 'E', 'u', 'l'):
- repodata_set_str(data, handle, langtag(&pd, SOLVABLE_EULA, language), line + 6);
+ repodata_set_str(data, handle, langtag(&pd, SOLVABLE_EULA, line_lang), line + 6);
continue;
case CTAG('=', 'I', 'n', 's'):
- repodata_set_str(data, handle, langtag(&pd, SOLVABLE_MESSAGEINS, language), line + 6);
+ repodata_set_str(data, handle, langtag(&pd, SOLVABLE_MESSAGEINS, line_lang), line + 6);
continue;
case CTAG('=', 'D', 'e', 'l'):
- repodata_set_str(data, handle, langtag(&pd, SOLVABLE_MESSAGEDEL, language), line + 6);
+ repodata_set_str(data, handle, langtag(&pd, SOLVABLE_MESSAGEDEL, line_lang), line + 6);
continue;
case CTAG('=', 'V', 'i', 's'):
{
unsigned k;
k = atoi(line + 6);
if (k || !strcasecmp(line + 6, "true"))
- repodata_set_void(data, handle, SOLVABLE_ISVISIBLE );
+ repodata_set_void(data, handle, SOLVABLE_ISVISIBLE);
}
continue;
case CTAG('=', 'S', 'h', 'r'):
exit(1);
}
name = pool_str2id(pool, sp[0], 1);
- evr = makeevr(pool, join2(sp[1], "-", sp[2]));
+ evr = makeevr(pool, join2(&pd.jd, sp[1], "-", sp[2]));
arch = pool_str2id(pool, sp[3], 1);
if (last_found_pack >= pd.nshare)
{
repodata_set_str(data, handle, SOLVABLE_ICON, line + 6);
break;
case CTAG('=', 'E', 'x', 't'):
- repodata_add_poolstr_array(data, handle, SOLVABLE_EXTENDS, join2("pattern", ":", line + 6));
+ repodata_add_poolstr_array(data, handle, SOLVABLE_EXTENDS, join2(&pd.jd, "pattern", ":", line + 6));
break;
case CTAG('=', 'I', 'n', 'c'):
- repodata_add_poolstr_array(data, handle, SOLVABLE_INCLUDES, join2("pattern", ":", line + 6));
+ repodata_add_poolstr_array(data, handle, SOLVABLE_INCLUDES, join2(&pd.jd, "pattern", ":", line + 6));
break;
case CTAG('=', 'C', 'k', 's'):
set_checksum(&pd, data, handle, SOLVABLE_CHECKSUM, line + 6);
break;
case CTAG('=', 'L', 'a', 'n'):
- language = solv_strdup(line + 6);
+ pd.language = solv_free(pd.language);
+ if (line[6])
+ pd.language = solv_strdup(line + 6);
break;
case CTAG('=', 'F', 'l', 's'):
if (!(flags & REPO_NO_INTERNALIZE))
repodata_internalize(data);
- if (pd.common.tmp)
- free(pd.common.tmp);
+ solv_free(pd.language);
free(line);
- join_freemem();
+ join_freemem(&pd.jd);
return 0;
}