diff options
Diffstat (limited to 'URPM.xs')
| -rw-r--r-- | URPM.xs | 58 |
1 files changed, 32 insertions, 26 deletions
@@ -211,6 +211,7 @@ get_nvra(Header h) { static int do_rpmEVRcompare(const char *a, const char *b) { int compare; + EVR_t lEVR = rpmEVRnew(RPMSENSE_EQUAL, 0), rEVR = rpmEVRnew(RPMSENSE_EQUAL, 0); rpmEVRparse(a, lEVR); @@ -221,6 +222,22 @@ do_rpmEVRcompare(const char *a, const char *b) { return compare; } +static rpmTag +rpmtag_from_string(const char *tag) +{ + static rpmconst c = NULL; + static const char context[] = "rpmtag"; + + if(c == NULL) { + c = rpmconstNew(); + if(!rpmconstInitToContext(c, context)) + croak("unknown context [%s]", context); + } + if(rpmconstFindName(c, tag, 0)) + return rpmconstValue(c); + else croak("unknown tag [%s]", tag); +} + static const char * get_name(Header header, rpmTag tag) { HE_t val = (HE_t)memset(alloca(sizeof(*val)), 0, sizeof(*val)); @@ -641,18 +658,19 @@ return_list_uint_16(Header header, rpmTag tag_name) { } void -return_list_tag_modifier(Header header, rpmTag tag_name) { +return_list_tag_modifier(Header header, const char *tag_name) { dSP; HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he)); + rpmTag tag = isdigit(*tag_name) ? (rpmTag)atoi(tag_name) : rpmtag_from_string(tag_name); - he->tag = tag_name; + he->tag = tag; if (!headerGet(header, he, 0)) return; for (he->ix = 0; he->ix < (int)he->c; he->ix++) { char buff[15]; char *s = buff; rpmTagType tags = he->p.ui32p[he->ix]; - switch (tag_name) { + switch (tag) { case RPMTAG_FILEFLAGS: if (tags & RPMFILE_CONFIG) *s++ = 'c'; if (tags & RPMFILE_DOC) *s++ = 'd'; @@ -679,15 +697,17 @@ return_list_tag_modifier(Header header, rpmTag tag_name) { } void -return_list_tag(URPM__Package pkg, rpmTag tag_name) { +return_list_tag(URPM__Package pkg, const char *tag_name) { dSP; + rpmTag tag = isdigit(*tag_name) ? (rpmTag)atoi(tag_name) : rpmtag_from_string(tag_name); + if (pkg->h != NULL) { HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he)); - he->tag = tag_name; + he->tag = tag; if (headerGet(pkg->h, he, 0)) { void *list = he->p.ptr; - if (tag_name == RPMTAG_ARCH) { + if (tag == RPMTAG_ARCH) { XPUSHs(sv_2mortal(newSVpv(headerIsEntry(pkg->h, RPMTAG_SOURCERPM) ? (char *) list : "src", 0))); } else switch (he->t) { @@ -731,7 +751,7 @@ return_list_tag(URPM__Package pkg, rpmTag tag_name) { char *arch; char *eos; - switch (tag_name) { + switch (tag) { case RPMTAG_NAME: { if(get_fullname_parts(pkg, &name, &epoch, &version, &release, &arch, &disttag, &distepoch, &eos)) @@ -1531,21 +1551,6 @@ static void *rpmRunTransactions_callback(__attribute__((unused)) const void *h, return callback == td->callback_open ? fd : NULL; } -static rpmTag rpmtag_from_string(const char *tag) -{ - static rpmconst c = NULL; - static const char context[] = "rpmtag"; - - if(c == NULL) { - c = rpmconstNew(); - if(!rpmconstInitToContext(c, context)) - croak("unknown context [%s]", context); - } - if(rpmconstFindName(c, tag, 0)) - return rpmconstValue(c); - else croak("unknown tag [%s]", tag); -} - MODULE = URPM PACKAGE = URPM::Package PREFIX = Pkg_ void @@ -2374,7 +2379,7 @@ Pkg_queryformat(pkg, fmt) void Pkg_get_tag(pkg, tagname) URPM::Package pkg - int tagname; + char *tagname PPCODE: PUTBACK; return_list_tag(pkg, tagname); @@ -2383,7 +2388,7 @@ Pkg_get_tag(pkg, tagname) void Pkg_get_tag_modifiers(pkg, tagname) URPM::Package pkg - int tagname; + char *tagname PPCODE: PUTBACK; return_list_tag_modifier(pkg->h, tagname); @@ -2884,7 +2889,8 @@ Db_traverse_tag(db,tag,names,callback) if (SvROK(names) && SvTYPE(SvRV(names)) == SVt_PVAV) { AV* names_av = (AV*)SvRV(names); int len = av_len(names_av); - int i, rpmtag; + int i; + rpmTag rpmtag; rpmtag = rpmtag_from_string(tag); @@ -2932,7 +2938,7 @@ Db_traverse_tag_find(db,tag,name,callback) Header header; rpmmi mi; CODE: - int rpmtag = rpmtag_from_string(tag); + rpmTag rpmtag = rpmtag_from_string(tag); int found = 0; db->ts = rpmtsLink(db->ts, "URPM::DB::traverse_tag"); |
