10 #define _RPMTAG_INTERNAL
28 int (*cmp) (
const void * avp,
const void * bvp))
33 char * s =
rpmExpand(
"%{?_arbitrary_tags}", NULL);
39 if (aTags && aTags[0] && aTags[1])
40 (void)
argvSort(aTags, (
int (*) (
const char **,
const char **))cmp);
58 static int tagCmpName(
const void * avp,
const void * bvp)
63 return strcmp(a->name, b->name);
77 int ret = ((int)a->val - (
int)b->val);
80 ret = ((int)strlen(b->name) - (int)strlen(a->name));
92 int (*cmp) (
const void * avp,
const void * bvp))
101 for (tte =
rpmTagTable; tte->name != NULL; tte++) {
109 qsort(ip, n,
sizeof(*ip), cmp);
124 if (!strncasecmp(s,
"RPMTAG_",
sizeof(
"RPMTAG_")-1))
125 s +=
sizeof(
"RPMTAG_") - 1;
127 while ((c = (
int)*se++) &&
xisalnum(c))
130 te = t = (
char *)
xmalloc(nb+1);
131 if (*s !=
'\0' && nb > 0) {
146 const char * digest = NULL;
147 size_t digestlen = 0;
148 size_t nb = strlen(s);
154 if (digest && digestlen > 4) {
155 memcpy(&tag, digest + (digestlen - 4), 4);
156 tag = (
rpmTag) (tag & 0x3fffffff);
157 tag = (
rpmTag) (tag | 0x40000000);
159 digest =
_free(digest);
191 size_t nameBufLen = 0;
198 if (_rpmTags.aTags == NULL)
200 if (_rpmTags.byValue == NULL)
201 xx =
tagLoadIndex(&_rpmTags.byValue, &_rpmTags.byValueSize,
203 if (_rpmTags.nameBufLen == 0)
204 _rpmTags.nameBufLen = 256;
205 if (_rpmTags.nameBuf == NULL)
206 _rpmTags.nameBuf = (
char *)
xcalloc(1, _rpmTags.nameBufLen);
207 nameBuf = _rpmTags.nameBuf;
208 nameBuf[0] = nameBuf[1] =
'\0';
209 nameBufLen = _rpmTags.nameBufLen;
213 strncpy(nameBuf,
"Packages", nameBufLen);
216 strncpy(nameBuf,
"Depcache", nameBufLen);
219 strncpy(nameBuf,
"Added", nameBufLen);
222 strncpy(nameBuf,
"Removed", nameBufLen);
225 strncpy(nameBuf,
"Available", nameBufLen);
228 strncpy(nameBuf,
"Hdlist", nameBufLen);
231 strncpy(nameBuf,
"Arglist", nameBufLen);
234 strncpy(nameBuf,
"Ftswalk", nameBufLen);
237 strncpy(nameBuf,
"Seqno", nameBufLen);
240 strncpy(nameBuf,
"Btree", nameBufLen);
243 strncpy(nameBuf,
"Hash", nameBufLen);
246 strncpy(nameBuf,
"Queue", nameBufLen);
249 strncpy(nameBuf,
"Recno", nameBufLen);
252 strncpy(nameBuf,
"Heap", nameBufLen);
257 strncpy(nameBuf,
"Conflictname", nameBufLen);
260 strncpy(nameBuf,
"Sha1header", nameBufLen);
265 strncpy(nameBuf,
"Filenames", nameBufLen);
269 if (_rpmTags.byValue == NULL)
272 u = _rpmTags.byValueSize;
275 t = _rpmTags.byValue[i];
277 comparison = ((int)tag - (
int)t->val);
281 else if (comparison > 0)
285 while (i > 0 && tag == _rpmTags.byValue[i-1]->val) {
287 t = _rpmTags.byValue[i];
289 s = (*_rpmTags.tagCanonicalize) (t->name);
290 strncpy(nameBuf, s, nameBufLen);
297 if (nameBuf[0] ==
'\0')
298 xx =
snprintf(nameBuf, nameBufLen,
"Tag_0x%08x", (
unsigned) tag);
299 nameBuf[nameBufLen-1] =
'\0';
313 if (_rpmTags.aTags == NULL)
315 if (_rpmTags.byValue == NULL)
335 if (_rpmTags.byValue == NULL)
338 u = _rpmTags.byValueSize;
341 t = _rpmTags.byValue[i];
343 comparison = ((int)tag - (
int)t->val);
347 else if (comparison > 0)
351 while (i > 0 && t->val == _rpmTags.byValue[i-1]->val) {
353 t = _rpmTags.byValue[i];
373 if (!strncasecmp(tagstr,
"RPMTAG_",
sizeof(
"RPMTAG_")-1))
374 tagstr +=
sizeof(
"RPMTAG_") - 1;
405 if (_rpmTags.aTags == NULL)
407 if (_rpmTags.byName == NULL)
409 if (_rpmTags.byName == NULL)
413 u = _rpmTags.byNameSize;
416 t = _rpmTags.byName[i];
418 comparison =
xstrcasecmp(tagstr, t->name + (
sizeof(
"RPMTAG_")-1));
422 else if (comparison > 0)
438 return ((*rpmTags->tagName)(tag));
443 return ((*rpmTags->tagType)(tag));
448 return ((*rpmTags->tagValue)(tagstr));
453 return ((*rpmTags->tagCanonicalize)(s));
458 return ((*rpmTags->tagGenerate)(s));
463 if (_rpmTags == NULL)
466 _rpmTags->nameBuf =
_free(_rpmTags->nameBuf);
467 _rpmTags->byName =
_free(_rpmTags->byName);
468 _rpmTags->byValue =
_free(_rpmTags->byValue);
469 _rpmTags->aTags =
argvFree(_rpmTags->aTags);
475 if (dbiTags != NULL) {
477 for (i = 0; i < dbiNTags; i++) {
478 dbiTags[i].str =
_free(dbiTags[i].str);
481 dbiTags =
_free(dbiTags);
486 #if defined(SUPPORT_IMPLICIT_TAG_DATA_TYPES)
491 void tagTypeValidate(
HE_t he);
492 void tagTypeValidate(
HE_t he)
496 #if !defined(SUPPORT_I18NSTRING_TYPE)
503 if ((he->
tag & 0x40000000)
512 if (!(he->
tag == 62))
513 if (!(he->
tag == 261 || he->
tag == 269))
514 if (!(he->
tag == 1000 || he->
tag == 1004 || he->
tag == 1007))
515 if (!(he->
tag == 1086 || he->
tag == 1087))
517 fprintf(stderr,
"==> warning: tag %u type(0x%x) != implicit type(0x%x)\n", (
unsigned) he->
tag, he->
t,
tagType(he->
tag));