aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPer Øyvind Karlsen <peroyvind@mandriva.org>2010-10-03 06:55:59 +0000
committerPer Øyvind Karlsen <peroyvind@mandriva.org>2010-10-03 06:55:59 +0000
commitc0c7bf8c27d8a4281368255899253fa4f09dd901 (patch)
treeda1333ee9a37798d9ebed69cf908a4e43b67f7cc
parent27c2c6731eab4d317e285e91edab2e49f33f5be4 (diff)
downloadperl-URPM-c0c7bf8c27d8a4281368255899253fa4f09dd901.tar
perl-URPM-c0c7bf8c27d8a4281368255899253fa4f09dd901.tar.gz
perl-URPM-c0c7bf8c27d8a4281368255899253fa4f09dd901.tar.bz2
perl-URPM-c0c7bf8c27d8a4281368255899253fa4f09dd901.tar.xz
perl-URPM-c0c7bf8c27d8a4281368255899253fa4f09dd901.zip
* fix iterator breakage that caused ie. dependency solving to break
* cleanup a bit
-rw-r--r--URPM.xs137
1 files changed, 65 insertions, 72 deletions
diff --git a/URPM.xs b/URPM.xs
index 2ea5fe6..eead444 100644
--- a/URPM.xs
+++ b/URPM.xs
@@ -159,10 +159,13 @@ get_name(Header header, rpmTag tag) {
val->tag = tag;
headerGet(header, val, 0);
- return (val->t == RPM_STRING_TYPE ||
- val->t == RPM_STRING_ARRAY_TYPE ||
- val->t == RPM_I18NSTRING_TYPE) ?
- val->p.str : "";
+ if (val->t == RPM_STRING_TYPE)
+ return val->p.str;
+ else if(val->t == RPM_STRING_ARRAY_TYPE ||
+ val->t == RPM_I18NSTRING_TYPE)
+ return val->p.argv[val->ix];
+ else
+ return "";
}
static int
@@ -436,19 +439,19 @@ return_list_str(char *s, Header header, rpmTag tag_name, rpmTag tag_flags, rpmTa
}
for (list->ix = 0; list->ix < (int)list->c; list->ix++) {
++count;
- uint32_t *flag = (++flags->ix >= 0 && flags->ix < (int)flags->c) ? flags->p.ui32p : NULL;
- if (f(NULL, 0, list->p.str, flag ? *flag : 0,
- (++list_evr->ix >= 0 && list_evr->ix < (int)list_evr->c) ? list_evr->p.str : NULL,
+ uint32_t *flag = (list->ix < (int)flags->c) ? flags->p.ui32p : NULL;
+ if (f(NULL, 0, list->p.argv[list->ix], flag ? flag[list->ix] : 0,
+ (list_evr->ix < (int)list_evr->c) ? list_evr->p.argv[list->ix] : NULL,
param)) {
list->p.ptr = _free(list->p.ptr);
- if (tag_flags) flags->p.ui32p = _free(flags->p.ui32p);
- if (tag_version) list_evr->p.str = _free(list_evr->p.str);
+ if (tag_flags) flags->p.ui32p = _free(flags->p.ptr);
+ if (tag_version) list_evr->p.argv = _free(list_evr->p.ptr);
return -count;
}
}
list->p.ptr = _free(list->p.ptr);
- if (tag_flags) flags->p.ui32p = _free(flags->p.ui32p);
- if (tag_version) list_evr->p.str = _free(list_evr->p.str);
+ if (tag_flags) flags->p.ptr = _free(flags->p.ptr);
+ if (tag_version) list_evr->p.ptr = _free(list_evr->p.ptr);
}
}
return count;
@@ -464,7 +467,7 @@ xpush_simple_list_str(Header header, rpmTag tag_name) {
if (!headerGet(header, list, 0)) return 0;
for (list->ix = 0; list->ix < (int)list->c; list->ix++) {
- XPUSHs(sv_2mortal(newSVpv(list->p.str, 0)));
+ XPUSHs(sv_2mortal(newSVpv(list->p.argv[list->ix], 0)));
}
list->p.ptr = _free(list->p.ptr);
PUTBACK;
@@ -481,7 +484,7 @@ return_list_int32_t(Header header, rpmTag tag_name) {
list->tag = tag_name;
if (headerGet(header, list, 0)) {
for (list->ix = 0; list->ix < (int)list->c; list->ix++) {
- XPUSHs(sv_2mortal(newSViv(*list->p.ui32p)));
+ XPUSHs(sv_2mortal(newSViv(list->p.ui32p[list->ix])));
}
list->p.ptr = _free(list->p.ptr);
}
@@ -497,10 +500,8 @@ return_list_uint_16(Header header, rpmTag tag_name) {
list->tag = tag_name;
if (headerGet(header, list, 0)) {
- int i;
- uint16_t *list_ = list->p.ui16p;
- for(i = 0; i < (int)list->c; i++) {
- XPUSHs(sv_2mortal(newSViv(list_[i])));
+ for(list->ix = 0; list->ix < (int)list->c; list->ix++) {
+ XPUSHs(sv_2mortal(newSViv(list->p.ui16p[list->ix])));
}
list->p.ptr = _free(list->p.ptr);
}
@@ -511,30 +512,29 @@ return_list_uint_16(Header header, rpmTag tag_name) {
void
return_list_tag_modifier(Header header, rpmTag tag_name) {
dSP;
- int i;
HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
he->tag = tag_name;
if (!headerGet(header, he, 0)) return;
- uint32_t *list = he->p.ui32p;
- for (i = 0; i < (int)he->c; i++) {
+ for (he->ix = 0; he->ix < (int)he->c; he->ix++) {
char buff[15];
char *s = buff;
+ uint32_t tags = he->p.ui32p[he->ix];
switch (tag_name) {
case RPMTAG_FILEFLAGS:
- if (list[i] & RPMFILE_CONFIG) *s++ = 'c';
- if (list[i] & RPMFILE_DOC) *s++ = 'd';
- if (list[i] & RPMFILE_GHOST) *s++ = 'g';
- if (list[i] & RPMFILE_LICENSE) *s++ = 'l';
- if (list[i] & RPMFILE_MISSINGOK) *s++ = 'm';
- if (list[i] & RPMFILE_NOREPLACE) *s++ = 'n';
- if (list[i] & RPMFILE_SPECFILE) *s++ = 'S';
- if (list[i] & RPMFILE_README) *s++ = 'R';
- if (list[i] & RPMFILE_EXCLUDE) *s++ = 'e';
- if (list[i] & RPMFILE_ICON) *s++ = 'i';
- if (list[i] & RPMFILE_UNPATCHED) *s++ = 'u';
- if (list[i] & RPMFILE_PUBKEY) *s++ = 'p';
+ if (tags & RPMFILE_CONFIG) *s++ = 'c';
+ if (tags & RPMFILE_DOC) *s++ = 'd';
+ if (tags & RPMFILE_GHOST) *s++ = 'g';
+ if (tags & RPMFILE_LICENSE) *s++ = 'l';
+ if (tags & RPMFILE_MISSINGOK) *s++ = 'm';
+ if (tags & RPMFILE_NOREPLACE) *s++ = 'n';
+ if (tags & RPMFILE_SPECFILE) *s++ = 'S';
+ if (tags & RPMFILE_README) *s++ = 'R';
+ if (tags & RPMFILE_EXCLUDE) *s++ = 'e';
+ if (tags & RPMFILE_ICON) *s++ = 'i';
+ if (tags & RPMFILE_UNPATCHED) *s++ = 'u';
+ if (tags & RPMFILE_PUBKEY) *s++ = 'p';
break;
default:
he->p.ptr = _free(he->p.ptr);
@@ -564,11 +564,10 @@ return_list_tag(URPM__Package pkg, rpmTag tag_name) {
case RPM_UINT16_TYPE:
case RPM_UINT32_TYPE:
{
- int i;
int *r;
r = (int *)list;
- for (i=0; i < (int)he->c; i++) {
- XPUSHs(sv_2mortal(newSViv(r[i])));
+ for (he->ix=0; he->ix < (int)he->c; he->ix++) {
+ XPUSHs(sv_2mortal(newSViv(r[he->ix])));
}
}
break;
@@ -579,12 +578,11 @@ return_list_tag(URPM__Package pkg, rpmTag tag_name) {
break;
case RPM_STRING_ARRAY_TYPE:
{
- int i;
const char **s;
s = (const char **)list;
- for (i = 0; i < (int)he->c; i++) {
- XPUSHs(sv_2mortal(newSVpv(s[i], 0)));
+ for (he->ix = 0; he->ix < (int)he->c; he->ix++) {
+ XPUSHs(sv_2mortal(newSVpv(s[he->ix], 0)));
}
}
break;
@@ -648,7 +646,6 @@ return_files(Header header, int filter_mode) {
char *p;
const char *s;
STRLEN len;
- unsigned int i;
uint32_t *flags = NULL;
uint16_t *fmodes = NULL;
@@ -688,23 +685,23 @@ return_files(Header header, int filter_mode) {
list = he_list->p.argv;
}
- for(i = 0; i < he_baseNames->c; i++) {
+ for(he_baseNames->ix = 0; he_baseNames->ix < (int)he_baseNames->c; he_baseNames->ix++) {
if (list) {
- s = list[i];
- len = strlen(list[i]);
+ s = list[he_baseNames->ix];
+ len = strlen(list[he_baseNames->ix]);
} else {
- len = strlen(dirNames[dirIndexes[i]]);
+ len = strlen(dirNames[dirIndexes[he_baseNames->ix]]);
if (len >= sizeof(buff)) continue;
- memcpy(p = buff, dirNames[dirIndexes[i]], len + 1); p += len;
- len = strlen(baseNames[i]);
+ memcpy(p = buff, dirNames[dirIndexes[he_baseNames->ix]], len + 1); p += len;
+ len = strlen(baseNames[he_baseNames->ix]);
if (p - buff + len >= sizeof(buff)) continue;
- memcpy(p, baseNames[i], len + 1); p += len;
+ memcpy(p, baseNames[he_baseNames->ix], len + 1); p += len;
s = buff;
len = p-buff;
}
if (filter_mode) {
- if ((filter_mode & FILTER_MODE_CONF_FILES) && flags && (flags[i] & RPMFILE_CONFIG) == 0) continue;
+ if ((filter_mode & FILTER_MODE_CONF_FILES) && flags && (flags[he_baseNames->ix] & RPMFILE_CONFIG) == 0) continue;
}
XPUSHs(sv_2mortal(newSVpv(s, len)));
@@ -785,7 +782,6 @@ pack_list(Header header, rpmTag tag_name, rpmTag tag_flags, rpmTag tag_version,
char buff[65536];
uint32_t *flags = NULL;
const char **list_evr = NULL;
- unsigned int i;
char *p = buff;
HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
@@ -805,9 +801,9 @@ pack_list(Header header, rpmTag tag_name, rpmTag tag_flags, rpmTag tag_version,
if(headerGet(header, he_list_evr, 0))
list_evr = he_list_evr->p.argv;
}
- for(i = 0; i < he->c; i++) {
- if (check_flag && !check_flag(flags[i])) continue;
- int len = print_list_entry(p, sizeof(buff)-(p-buff)-1, list[i], flags ? flags[i] : 0, list_evr ? list_evr[i] : NULL);
+ for(he->ix = 0; he->ix < (int)he->c; he->ix++) {
+ if (check_flag && !check_flag(flags[he->ix])) continue;
+ int len = print_list_entry(p, sizeof(buff)-(p-buff)-1, list[he->ix], flags ? flags[he->ix] : 0, list_evr ? list_evr[he->ix] : NULL);
if (len < 0) continue;
p += len;
*p++ = '@';
@@ -900,15 +896,14 @@ update_provides(URPM__Package pkg, HV *provides) {
int len;
HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
uint32_t *flags = NULL;
- unsigned int i;
/* examine requires for files which need to be marked in provides */
he->tag = RPMTAG_REQUIRENAME;
if (headerGet(pkg->h, he, 0)) {
const char **list = he->p.argv;
- for (i = 0; i < he->c; ++i) {
- len = strlen(list[i]);
- if (list[i][0] == '/') (void)hv_fetch(provides, list[i], len, 1);
+ for (he->ix = 0; he->ix < (int)he->c; he->ix++) {
+ len = strlen(list[he->ix]);
+ if (list[he->ix][0] == '/') (void)hv_fetch(provides, list[he->ix], len, 1);
}
}
@@ -922,11 +917,11 @@ update_provides(URPM__Package pkg, HV *provides) {
HE_t he_flags = memset(alloca(sizeof(*he_flags)), 0, sizeof(*he_flags));
flags = he_flags->p.ui32p;
}
- for (i = 0; i < he->c; ++i) {
- len = strlen(list[i]);
- if (!strncmp(list[i], "rpmlib(", 7)) continue;
- update_provide_entry(list[i], len, 1, flags && flags[i] & (RPMSENSE_PREREQ|RPMSENSE_SCRIPT_PREUN|RPMSENSE_SCRIPT_PRE|RPMSENSE_SCRIPT_POSTUN|RPMSENSE_SCRIPT_POST|RPMSENSE_LESS|RPMSENSE_EQUAL|RPMSENSE_GREATER),
- pkg, provides);
+ for (he->ix = 0; he->ix < (int)he->c; he->ix++) {
+ len = strlen(list[he->ix]);
+ if (!strncmp(list[he->ix], "rpmlib(", 7)) continue;
+ update_provide_entry(list[he->ix], len, 1, flags && flags[he->ix] & (RPMSENSE_PREREQ|RPMSENSE_SCRIPT_PREUN|RPMSENSE_SCRIPT_PRE|RPMSENSE_SCRIPT_POSTUN|RPMSENSE_SCRIPT_POST|RPMSENSE_LESS|RPMSENSE_EQUAL|RPMSENSE_GREATER),
+ pkg, provides);
}
}
} else {
@@ -971,9 +966,8 @@ update_obsoletes(URPM__Package pkg, HV *obsoletes) {
he->tag = RPMTAG_OBSOLETENAME;
if (headerGet(pkg->h, he, 0)) {
const char **list = he->p.argv;
- unsigned int i;
- for (i = 0; i < he->c; ++i)
- update_hash_entry(obsoletes, list[i], 0, 1, 0, pkg);
+ for (he->ix = 0; he->ix < (int)he->c; he->ix++)
+ update_hash_entry(obsoletes, list[he->ix], 0, 1, 0, pkg);
}
} else {
char *ps, *s;
@@ -998,7 +992,6 @@ update_provides_files(URPM__Package pkg, HV *provides) {
if (pkg->h) {
STRLEN len;
const char **list = NULL;
- unsigned int i;
HE_t he_baseNames = memset(alloca(sizeof(*he_baseNames)), 0, sizeof(*he_baseNames));
HE_t he_dirIndexes = memset(alloca(sizeof(*he_dirIndexes)), 0, sizeof(*he_dirIndexes));
HE_t he_dirNames = memset(alloca(sizeof(*he_dirNames)), 0, sizeof(*he_dirNames));
@@ -1018,13 +1011,13 @@ update_provides_files(URPM__Package pkg, HV *provides) {
char buff[4096];
char *p;
- for(i = 0; i < he_baseNames->c; i++) {
- len = strlen(dirNames[dirIndexes[i]]);
+ for(he_baseNames->ix = 0; he_baseNames->ix < (int)he_baseNames->c; he_baseNames->ix++) {
+ len = strlen(dirNames[dirIndexes[he_baseNames->ix]]);
if (len >= sizeof(buff)) continue;
- memcpy(p = buff, dirNames[dirIndexes[i]], len + 1); p += len;
- len = strlen(baseNames[i]);
+ memcpy(p = buff, dirNames[dirIndexes[he_baseNames->ix]], len + 1); p += len;
+ len = strlen(baseNames[he_baseNames->ix]);
if (p - buff + len >= sizeof(buff)) continue;
- memcpy(p, baseNames[i], len + 1); p += len;
+ memcpy(p, baseNames[he_baseNames->ix], len + 1); p += len;
update_provide_entry(buff, p-buff, 0, 0, pkg, provides);
}
@@ -1037,10 +1030,10 @@ update_provides_files(URPM__Package pkg, HV *provides) {
he->tag = RPMTAG_OLDFILENAMES;
headerGet(pkg->h, he, 0);
if (list) {
- for (i = 0; i < he->c; i++) {
- len = strlen(list[i]);
+ for (he->ix = 0; he->ix < (int)he->c; he->ix++) {
+ len = strlen(list[he->ix]);
- update_provide_entry(list[i], len, 0, 0, pkg, provides);
+ update_provide_entry(list[he->ix], len, 0, 0, pkg, provides);
}
list = _free(list);