From c0c7bf8c27d8a4281368255899253fa4f09dd901 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Per=20=C3=98yvind=20Karlsen?= Date: Sun, 3 Oct 2010 06:55:59 +0000 Subject: * fix iterator breakage that caused ie. dependency solving to break * cleanup a bit --- URPM.xs | 137 ++++++++++++++++++++++++++++++---------------------------------- 1 file 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); -- cgit v1.2.1