static rpmTagType _tagType(rpmTagVal tag) { const struct headerTagTableEntry_s *t; int comparison, i, l, u; if (_rpmTags.byValue == NULL) tagLoadIndex(&_rpmTags.byValue, &_rpmTags.byValueSize, tagCmpValue); if (_rpmTags.byValue) { l = 0; u = _rpmTags.byValueSize; while (l < u) { i = (l + u) / 2; t = _rpmTags.byValue[i]; comparison = (tag - t->val); if (comparison < 0) u = i; else if (comparison > 0) l = i + 1; else { /* Make sure that the bsearch retrieve is stable. */ while (i > 0 && t->val == _rpmTags.byValue[i-1]->val) { i--; } t = _rpmTags.byValue[i]; /* XXX this is dumb */ return (rpmTagType)(t->type | t->retype); } } } return RPM_NULL_TYPE; }
static rpmTagVal _tagValue(const char * tagstr) { const struct headerTagTableEntry_s *t; int comparison, i, l, u; if (!rstrcasecmp(tagstr, "Packages")) return RPMDBI_PACKAGES; if (_rpmTags.byName == NULL) tagLoadIndex(&_rpmTags.byName, &_rpmTags.byNameSize, tagCmpName); if (_rpmTags.byName == NULL) return RPMTAG_NOT_FOUND; l = 0; u = _rpmTags.byNameSize; while (l < u) { i = (l + u) / 2; t = _rpmTags.byName[i]; comparison = rstrcasecmp(tagstr, t->shortname); if (comparison < 0) u = i; else if (comparison > 0) l = i + 1; else return t->val; } return RPMTAG_NOT_FOUND; }
static const char * _tagName(rpmTagVal tag) { const char *name = "(unknown)"; const struct headerTagTableEntry_s *t; int comparison, i, l, u; int xx; if (_rpmTags.byValue == NULL) xx = tagLoadIndex(&_rpmTags.byValue, &_rpmTags.byValueSize, tagCmpValue); switch (tag) { case RPMDBI_PACKAGES: name = "Packages"; break; /* XXX make sure rpmdb indices are identically named. */ case RPMTAG_CONFLICTS: name = "Conflictname"; break; case RPMTAG_HDRID: name = "Sha1header"; break; default: if (_rpmTags.byValue == NULL) break; l = 0; u = _rpmTags.byValueSize; while (l < u) { i = (l + u) / 2; t = _rpmTags.byValue[i]; comparison = (tag - t->val); if (comparison < 0) u = i; else if (comparison > 0) l = i + 1; else { /* Make sure that the bsearch retrieve is stable. */ while (i > 0 && tag == _rpmTags.byValue[i-1]->val) { i--; } t = _rpmTags.byValue[i]; if (t->shortname != NULL) name = t->shortname; break; } } break; } return name; }
int rpmTagGetNames(rpmtd tagnames, int fullname) { const char **names; const char *name; if (_rpmTags.byName == NULL) tagLoadIndex(&_rpmTags.byName, &_rpmTags.byNameSize, tagCmpName); if (tagnames == NULL ||_rpmTags.byName == NULL) return 0; rpmtdReset(tagnames); tagnames->count = _rpmTags.byNameSize; tagnames->data = names = xmalloc(tagnames->count * sizeof(*names)); tagnames->type = RPM_STRING_ARRAY_TYPE; tagnames->flags = RPMTD_ALLOCED | RPMTD_IMMUTABLE; for (int i = 0; i < tagnames->count; i++) { name = fullname ? _rpmTags.byName[i]->name : _rpmTags.byName[i]->shortname; names[i] = name; } return tagnames->count; }