10 #define _RPMTAG_INTERNAL
23 int (*cmp) (
const void * avp,
const void * bvp))
28 char * s =
rpmExpand(
"%{?_arbitrary_tags}", NULL);
33 aTags =
xcalloc(1,
sizeof(*aTags));
34 if (aTags && aTags[0] && aTags[1])
53 static int tagCmpName(
const void * avp,
const void * bvp)
58 return strcmp(a->name, b->name);
72 int ret = ((int)a->val - (
int)b->val);
75 ret = ((int)strlen(b->name) - (int)strlen(a->name));
87 int (*cmp) (
const void * avp,
const void * bvp))
104 qsort(ip, n,
sizeof(*ip), cmp);
119 if (!strncasecmp(s,
"RPMTAG_",
sizeof(
"RPMTAG_")-1))
120 s +=
sizeof(
"RPMTAG_") - 1;
122 while ((c = (
int)*se++) &&
xisalnum(c))
126 if (*s !=
'\0' && nb > 0) {
141 const char * digest = NULL;
142 size_t digestlen = 0;
143 size_t nb = strlen(s);
149 if (digest && digestlen > 4) {
150 memcpy(&tag, digest + (digestlen - 4), 4);
154 digest =
_free(digest);
186 size_t nameBufLen = 0;
193 if (_rpmTags.aTags == NULL)
195 if (_rpmTags.byValue == NULL)
196 xx =
tagLoadIndex(&_rpmTags.byValue, &_rpmTags.byValueSize,
198 if (_rpmTags.nameBufLen == 0)
199 _rpmTags.nameBufLen = 256;
200 if (_rpmTags.nameBuf == NULL)
201 _rpmTags.nameBuf =
xcalloc(1, _rpmTags.nameBufLen);
202 nameBuf = _rpmTags.nameBuf;
203 nameBuf[0] = nameBuf[1] =
'\0';
204 nameBufLen = _rpmTags.nameBufLen;
208 strncpy(nameBuf,
"Packages", nameBufLen);
211 strncpy(nameBuf,
"Depends", nameBufLen);
214 strncpy(nameBuf,
"Added", nameBufLen);
217 strncpy(nameBuf,
"Removed", nameBufLen);
220 strncpy(nameBuf,
"Available", nameBufLen);
223 strncpy(nameBuf,
"Hdlist", nameBufLen);
226 strncpy(nameBuf,
"Arglist", nameBufLen);
229 strncpy(nameBuf,
"Ftswalk", nameBufLen);
234 strncpy(nameBuf,
"Conflictname", nameBufLen);
237 strncpy(nameBuf,
"Sha1header", nameBufLen);
242 strncpy(nameBuf,
"Filenames", nameBufLen);
246 if (_rpmTags.byValue == NULL)
249 u = _rpmTags.byValueSize;
252 t = _rpmTags.byValue[i];
254 comparison = ((int)tag - (
int)t->val);
258 else if (comparison > 0)
262 while (i > 0 && tag == _rpmTags.byValue[i-1]->val) {
264 t = _rpmTags.byValue[i];
266 s = (*_rpmTags.tagCanonicalize) (t->name);
267 strncpy(nameBuf, s, nameBufLen);
274 if (nameBuf[0] ==
'\0')
275 xx =
snprintf(nameBuf, nameBufLen,
"Tag_0x%08x", (
unsigned) tag);
276 nameBuf[nameBufLen-1] =
'\0';
290 if (_rpmTags.aTags == NULL)
292 if (_rpmTags.byValue == NULL)
306 if (_rpmTags.byValue == NULL)
309 u = _rpmTags.byValueSize;
312 t = _rpmTags.byValue[i];
314 comparison = ((int)tag - (
int)t->val);
318 else if (comparison > 0)
322 while (i > 0 && t->val == _rpmTags.byValue[i-1]->val) {
324 t = _rpmTags.byValue[i];
344 if (!strncasecmp(tagstr,
"RPMTAG_",
sizeof(
"RPMTAG_")-1))
345 tagstr +=
sizeof(
"RPMTAG_") - 1;
364 if (_rpmTags.aTags == NULL)
366 if (_rpmTags.byName == NULL)
368 if (_rpmTags.byName == NULL)
372 u = _rpmTags.byNameSize;
375 t = _rpmTags.byName[i];
377 comparison =
xstrcasecmp(tagstr, t->name + (
sizeof(
"RPMTAG_")-1));
381 else if (comparison > 0)
397 return ((*rpmTags->tagName)(tag));
402 return ((*rpmTags->tagType)(tag));
407 return ((*rpmTags->tagValue)(tagstr));
412 return ((*rpmTags->tagCanonicalize)(s));
417 return ((*rpmTags->tagGenerate)(s));
422 if (_rpmTags == NULL)
425 _rpmTags->nameBuf =
_free(_rpmTags->nameBuf);
426 _rpmTags->byName =
_free(_rpmTags->byName);
427 _rpmTags->byValue =
_free(_rpmTags->byValue);
428 _rpmTags->aTags =
argvFree(_rpmTags->aTags);
434 if (dbiTags != NULL) {
436 for (i = 0; i < dbiNTags; i++) {
437 dbiTags[i].str =
_free(dbiTags[i].str);
440 dbiTags =
_free(dbiTags);
445 #if defined(SUPPORT_IMPLICIT_TAG_DATA_TYPES)
450 void tagTypeValidate(
HE_t he)
454 if (!(he->
tag == 261 || he->
tag == 269))
456 fprintf(stderr,
"==> warning: tag %u type(0x%x) != implicit type(0x%x)\n", (
unsigned) he->
tag, he->
t,
tagType(he->
tag));