RPM Community Forums

Mailing List Message of <rpm-cvs>

[CVS] RPM: rpm/ CHANGES rpm/build/ files.c pack.c parsePreamble.c pars...

From: Jeff Johnson <jbj@rpm5.org>
Date: Wed 17 Oct 2007 - 20:32:58 CEST
Message-Id: <20071017183258.502E9348460@rpm5.org>
  RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  jbj@rpm5.org
  Module: rpm                              Date:   17-Oct-2007 20:32:58
  Branch: HEAD                             Handle: 2007101719325305

  Modified files:
    rpm                     CHANGES
    rpm/build               files.c pack.c parsePreamble.c parseSpec.c
                            reqprov.c
    rpm/lib                 depends.c formats.c package.c psm.c rpmchecksig.c
                            rpmds.c rpmfc.c rpmfi.c rpminstall.c rpmrollback.c
                            rpmte.c rpmts.c transaction.c
    rpm/python              header-py.c
    rpm/rpmdb               fprint.c hdrNVR.c hdrfmt.c header.c header.h
                            pkgio.c rpmdb.c signature.c
    rpm/tools               rpmcache.c

  Log:
    - jbj: remove the pointless ;-) indirection in *(HE_t) for type/count.

  Summary:
    Revision    Changes     Path
    1.1723      +1  -0      rpm/CHANGES
    1.274       +20 -28     rpm/build/files.c
    2.238       +10 -16     rpm/build/pack.c
    2.136       +13 -19     rpm/build/parsePreamble.c
    2.109       +2  -4      rpm/build/parseSpec.c
    1.74        +6  -8      rpm/build/reqprov.c
    1.352       +10 -16     rpm/lib/depends.c
    2.113       +19 -19     rpm/lib/formats.c
    2.175       +10 -12     rpm/lib/package.c
    2.246       +57 -77     rpm/lib/psm.c
    1.159       +12 -20     rpm/lib/rpmchecksig.c
    2.74        +13 -19     rpm/lib/rpmds.c
    1.26        +3  -5      rpm/lib/rpmfc.c
    2.90        +47 -51     rpm/lib/rpmfi.c
    1.176       +5  -7      rpm/lib/rpminstall.c
    1.21        +11 -17     rpm/lib/rpmrollback.c
    2.61        +17 -23     rpm/lib/rpmte.c
    2.112       +3  -5      rpm/lib/rpmts.c
    1.345       +6  -12     rpm/lib/transaction.c
    1.65        +37 -49     rpm/python/header-py.c
    1.19        +5  -7      rpm/rpmdb/fprint.c
    1.18        +10 -16     rpm/rpmdb/hdrNVR.c
    1.15        +23 -36     rpm/rpmdb/hdrfmt.c
    1.86        +50 -55     rpm/rpmdb/header.c
    1.40        +23 -23     rpm/rpmdb/header.h
    1.19        +5  -9      rpm/rpmdb/pkgio.c
    1.190       +63 -75     rpm/rpmdb/rpmdb.c
    1.12        +3  -5      rpm/rpmdb/signature.c
    2.19        +2  -4      rpm/tools/rpmcache.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.1722 -r1.1723 CHANGES
  --- rpm/CHANGES	17 Oct 2007 16:53:21 -0000	1.1722
  +++ rpm/CHANGES	17 Oct 2007 18:32:53 -0000	1.1723
  @@ -1,4 +1,5 @@
   4.5 -> 5.0:
  +    - jbj: remove the pointless ;-) indirection in *(HE_t) for type/count.
       - jbj: drill rpmTagData everywhere.
       - jbj: start regularizing hae/hme calls.
       - jbj: drill rpmTagCount everywhere.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/build/files.c
  ============================================================================
  $ cvs diff -u -r1.273 -r1.274 files.c
  --- rpm/build/files.c	17 Oct 2007 16:53:22 -0000	1.273
  +++ rpm/build/files.c	17 Oct 2007 18:32:54 -0000	1.274
  @@ -271,10 +271,8 @@
   	/*@modifies internalState @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       int_32 currentTime = time(NULL);
       int_32 * mtime;
  @@ -282,12 +280,12 @@
       int i;
   
       he->tag = RPMTAG_FILEMTIMES;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       mtime = he_p.i32p;
       he->tag = RPMTAG_OLDFILENAMES;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       
  -    for (i = 0; i < he_c; i++) {
  +    for (i = 0; i < he->c; i++) {
   	xx = currentTime - mtime[i];
   	if (xx < 0) xx = -xx;
   	if (xx > tc)
  @@ -1170,10 +1168,8 @@
   	/*@modifies h @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       HAE_t hae = (HAE_t)headerAddEntry;
       HRE_t hre = (HRE_t)headerRemoveEntry;
  @@ -1199,9 +1195,9 @@
       }
   
       he->tag = RPMTAG_OLDFILENAMES;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       fileNames = he_p.argv;
  -    count = he_c;
  +    count = he->c;
       if (!xx || fileNames == NULL || count <= 0)
   	return;		/* no file list */
   
  @@ -1255,20 +1251,20 @@
   exit:
       if (count > 0) {
   	he->tag = RPMTAG_DIRINDEXES;
  -	he_t = RPM_INT32_TYPE;
  +	he->t = RPM_INT32_TYPE;
   	he_p.i32p = dirIndexes;
  -	he_c = count;
  -	xx = hae(h, he->tag, he_t, he_p, he_c);
  +	he->c = count;
  +	xx = hae(h, he->tag, he->t, he_p, he->c);
   	he->tag = RPMTAG_BASENAMES;
  -	he_t = RPM_STRING_ARRAY_TYPE;
  +	he->t = RPM_STRING_ARRAY_TYPE;
   	he_p.argv = baseNames;
  -	he_c = count;
  -	xx = hae(h, he->tag, he_t, he_p, he_c);
  +	he->c = count;
  +	xx = hae(h, he->tag, he->t, he_p, he->c);
   	he->tag = RPMTAG_DIRNAMES;
  -	he_t = RPM_STRING_ARRAY_TYPE;
  +	he->t = RPM_STRING_ARRAY_TYPE;
   	he_p.argv = dirNames;
  -	he_c = dirIndex + 1;
  -	xx = hae(h, he->tag, he_t, he_p, he_c);
  +	he->c = dirIndex + 1;
  +	xx = hae(h, he->tag, he->t, he_p, he->c);
       }
   
       fileNames = _free(fileNames);
  @@ -2165,10 +2161,8 @@
   		rpmGlobalMacroContext, fileSystem, internalState @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       struct FileList_s fl;
       char *s, **files, **fp;
  @@ -2233,7 +2227,7 @@
       fl.buildRootURL = rpmGenPath(spec->rootURL, "%{?buildroot}", NULL);
   
       he->tag = RPMTAG_DEFAULTPREFIX;
  -    xx = hge(pkg->header, he->tag, he->t, he->p, he->c);
  +    xx = hge(pkg->header, he->tag, &he->t, he->p, &he->c);
       fl.prefix = he_p.str;
   
       fl.fileCount = 0;
  @@ -2695,10 +2689,8 @@
   	/*@modifies check_fileList @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       Package pkg;
       int res = 0;
  @@ -2715,7 +2707,7 @@
   	(void) headerMacrosLoad(pkg->header);
   
   	he->tag = RPMTAG_NVRA;
  -	xx = hge(pkg->header, he->tag, he->t, he->p, he->c);
  +	xx = hge(pkg->header, he->tag, &he->t, he->p, &he->c);
   	rpmlog(RPMLOG_NOTICE, _("Processing files: %s\n"), he_p.str);
   	he_p.ptr = _free(he_p.ptr);
   		   
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/build/pack.c
  ============================================================================
  $ cvs diff -u -r2.237 -r2.238 pack.c
  --- rpm/build/pack.c	17 Oct 2007 16:53:22 -0000	2.237
  +++ rpm/build/pack.c	17 Oct 2007 18:32:54 -0000	2.238
  @@ -174,16 +174,14 @@
   	/*@modifies h, rpmGlobalMacroContext, fileSystem, internalState @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       StringBuf sb = newStringBuf();
       int xx;
   
       he->tag = tag;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       if (xx) {
   	appendLineStringBuf(sb, he_p.str);
   	(void) headerRemoveEntry(h, tag);
  @@ -440,10 +438,8 @@
   void providePackageNVR(Header h)
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       const char *N, *V, *R;
       int_32 E;
  @@ -465,7 +461,7 @@
       pEVR = p = alloca(21 + strlen(V) + 1 + strlen(R) + 1);
       *p = '\0';
       he->tag = RPMTAG_EPOCH;
  -    gotE = hge(h, he->tag, he->t, he->p, he->c);
  +    gotE = hge(h, he->tag, &he->t, he->p, &he->c);
       E = (he_p.i32p ? *he_p.i32p : 0);
       he_p.ptr = _free(he_p.ptr);
       if (gotE) {
  @@ -479,9 +475,9 @@
        * If no provides at all are available, we can just add.
        */
       he->tag = RPMTAG_PROVIDENAME;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       provides = he_p.argv;
  -    providesCount = he_c;
  +    providesCount = he->c;
       if (!xx)
   	goto exit;
   
  @@ -489,7 +485,7 @@
        * Otherwise, fill in entries on legacy packages.
        */
       he->tag = RPMTAG_PROVIDEVERSION;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       providesEVR = he_p.argv;
       if (!xx) {
   	for (i = 0; i < providesCount; i++) {
  @@ -504,7 +500,7 @@
       }
   
       he->tag = RPMTAG_PROVIDEFLAGS;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       provideFlags = he_p.i32p;
   
       /*@-nullderef@*/	/* LCL: providesEVR is not NULL */
  @@ -863,10 +859,8 @@
   int packageBinaries(Spec spec)
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       struct cpioSourceArchive_s csabuf;
       CSA_t csa = &csabuf;
  @@ -917,7 +911,7 @@
   	    binFormat = _free(binFormat);
   	    if (binRpm == NULL) {
   		he->tag = RPMTAG_NVRA;
  -		xx = hge(pkg->header, he->tag, he->t, he->p, he->c);
  +		xx = hge(pkg->header, he->tag, &he->t, he->p, &he->c);
   		rpmlog(RPMLOG_ERR, _("Could not generate output "
   		     "filename for package %s: %s\n"), he_p.str, errorString);
   		he_p.ptr = _free(he_p.ptr);
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/build/parsePreamble.c
  ============================================================================
  $ cvs diff -u -r2.135 -r2.136 parsePreamble.c
  --- rpm/build/parsePreamble.c	17 Oct 2007 16:53:22 -0000	2.135
  +++ rpm/build/parsePreamble.c	17 Oct 2007 18:32:54 -0000	2.136
  @@ -212,25 +212,23 @@
   	/*@*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       int xx;
   
       he->tag = tag;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       if (!xx)
   	return -1;
   /*@-boundsread@*/
  -    while (he_c--) {
  -	if (!xstrcasecmp(he_p.argv[he_c], name))
  +    while (he->c--) {
  +	if (!xstrcasecmp(he_p.argv[he->c], name))
   	    break;
       }
       he_p.ptr = _free(he_p.ptr);
   /*@=boundsread@*/
  -    return (he_c >= 0 ? 1 : 0);
  +    return (he->c >= 0 ? 1 : 0);
   }
   
   /**
  @@ -443,10 +441,8 @@
   spectag stashSt(Spec spec, Header h, int tag, const char * lang)
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       spectag t = NULL;
       int xx;
  @@ -465,7 +461,7 @@
   	t->t_msgid = NULL;
   	if (!(t->t_lang && strcmp(t->t_lang, RPMBUILD_DEFAULT_LANG))) {
   	    he->tag = RPMTAG_NAME;
  -	    xx = hge(h, he->tag, he->t, he->p, he->c);
  +	    xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	    if (xx) {
   		char buf[1024];
   		sprintf(buf, "%s(%s)", he_p.str, tagName(tag));
  @@ -504,10 +500,8 @@
   		rpmGlobalMacroContext, fileSystem, internalState @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       char * field = spec->line;
       char * end;
  @@ -607,18 +601,18 @@
       case RPMTAG_PREFIXES:
   	addOrAppendListEntry(pkg->header, tag, field);
   	he->tag = tag;
  -	xx = hge(pkg->header, he->tag, he->t, he->p, he->c);
  +	xx = hge(pkg->header, he->tag, &he->t, he->p, &he->c);
   	if (tag == RPMTAG_PREFIXES)
  -	while (he_c--) {
  -	    if (he_p.argv[he_c][0] != '/') {
  +	while (he->c--) {
  +	    if (he_p.argv[he->c][0] != '/') {
   		rpmlog(RPMLOG_ERR,
   			 _("line %d: Prefixes must begin with \"/\": %s\n"),
   			 spec->lineNum, spec->line);
   		he_p.ptr = _free(he_p.ptr);
   		return RPMRC_FAIL;
   	    }
  -	    len = strlen(he_p.argv[he_c]);
  -	    if (he_p.argv[he_c][len - 1] == '/' && len > 1) {
  +	    len = strlen(he_p.argv[he->c]);
  +	    if (he_p.argv[he->c][len - 1] == '/' && len > 1) {
   		rpmlog(RPMLOG_ERR,
   			 _("line %d: Prefixes must not end with \"/\": %s\n"),
   			 spec->lineNum, spec->line);
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/build/parseSpec.c
  ============================================================================
  $ cvs diff -u -r2.108 -r2.109 parseSpec.c
  --- rpm/build/parseSpec.c	17 Oct 2007 16:53:22 -0000	2.108
  +++ rpm/build/parseSpec.c	17 Oct 2007 18:32:54 -0000	2.109
  @@ -435,10 +435,8 @@
   		const char *cookie, int anyarch, int force, int verify)
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       rpmParseState parsePart = PART_PREAMBLE;
       int initialPackage = 1;
  @@ -608,7 +606,7 @@
       for (pkg = spec->packages; pkg != NULL; pkg = pkg->next) {
   	if (!headerIsEntry(pkg->header, RPMTAG_DESCRIPTION)) {
   	    he->tag = RPMTAG_NVRA;
  -	    xx = hge(pkg->header, he->tag, he->t, he->p, he->c);
  +	    xx = hge(pkg->header, he->tag, &he->t, he->p, &he->c);
   	    rpmlog(RPMLOG_ERR, _("Package has no %%description: %s\n"),
   			he_p.str);
   	    he_p.ptr = _free(he_p.ptr);
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/build/reqprov.c
  ============================================================================
  $ cvs diff -u -r1.73 -r1.74 reqprov.c
  --- rpm/build/reqprov.c	17 Oct 2007 16:53:22 -0000	1.73
  +++ rpm/build/reqprov.c	17 Oct 2007 18:32:54 -0000	1.74
  @@ -15,10 +15,8 @@
   		int index)
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       const char ** names;
       rpmTag nametag = 0;
  @@ -64,9 +62,9 @@
       
       /* Check for duplicate dependencies. */
       he->tag = nametag;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       names = he_p.argv;
  -    len = he_c;
  +    len = he->c;
       if (xx) {
   	const char ** versions = NULL;
   	int_32 *flags = NULL;
  @@ -75,15 +73,15 @@
   
   	if (flagtag) {
   	    he->tag = versiontag;
  -	    xx = hge(h, he->tag, he->t, he->p, he->c);
  +	    xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	    versions = he_p.argv;
   	    he->tag = flagtag;
  -	    xx = hge(h, he->tag, he->t, he->p, he->c);
  +	    xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	    flags = he_p.i32p;
   	}
   	if (indextag) {
   	    he->tag = indextag;
  -	    xx = hge(h, he->tag, he->t, he->p, he->c);
  +	    xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	    indexes = he_p.i32p;
   	}
   
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/depends.c
  ============================================================================
  $ cvs diff -u -r1.351 -r1.352 depends.c
  --- rpm/lib/depends.c	17 Oct 2007 16:53:22 -0000	1.351
  +++ rpm/lib/depends.c	17 Oct 2007 18:32:55 -0000	1.352
  @@ -151,20 +151,18 @@
   	/*@*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       const char * one, * two;
       int rc = 0;
       int xx;
   
       he->tag = RPMTAG_HDRID;
  -    xx = hge(first, he->tag, he->t, he->p, he->c);
  +    xx = hge(first, he->tag, &he->t, he->p, &he->c);
       one = he_p.str;
       he->tag = RPMTAG_HDRID;
  -    xx = hge(second, he->tag, he->t, he->p, he->c);
  +    xx = hge(second, he->tag, &he->t, he->p, &he->c);
       two = he_p.str;
   
       if (one && two)
  @@ -195,10 +193,8 @@
   			fnpyKey key, int upgrade, rpmRelocation relocs)
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       rpmdepFlags depFlags = rpmtsDFlags(ts);
       uint_32 tscolor = rpmtsColor(ts);
  @@ -238,16 +234,16 @@
        * Check platform affinity of binary packages.
        */
       he->tag = RPMTAG_ARCH;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       arch = he_p.str;
       he->tag = RPMTAG_OS;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       os = he_p.str;
       if (nplatpat > 1) {
   	const char * platform = NULL;
   
   	he->tag = RPMTAG_PLATFORM;
  -	xx = hge(h, he->tag, he->t, he->p, he->c);
  +	xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	platform = he_p.str;
   	if (!xx || platform == NULL)
   	    platform = rpmExpand(arch, "-unknown-", os, NULL);
  @@ -256,7 +252,7 @@
   	if (rc <= 0) {
   	    rpmps ps = rpmtsProblems(ts);
   	    he->tag = RPMTAG_NVRA;
  -	    xx = hge(h, he->tag, he->t, he->p, he->c);
  +	    xx = hge(h, he->tag, &he->t, he->p, &he->c);
   assert(he_p.str != NULL);
   	    rpmpsAppend(ps, RPMPROB_BADPLATFORM, he_p.str, key,
                           platform, NULL, NULL, 0);
  @@ -1316,10 +1312,8 @@
   	/*@modifies ts, mi, rpmGlobalMacroContext, fileSystem, internalState @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       rpmdepFlags depFlags = rpmtsDFlags(ts);
       uint_32 tscolor = rpmtsColor(ts);
  @@ -1337,7 +1331,7 @@
   	int rc;
   
   	he->tag = RPMTAG_NVRA;
  -	rc = hge(h, he->tag, he->t, he->p, he->c);
  +	rc = hge(h, he->tag, &he->t, he->p, &he->c);
   assert(he_p.str != NULL);
   	if (!(depFlags & RPMDEPS_FLAG_NOREQUIRES))
   	    requires = rpmdsNew(h, RPMTAG_REQUIRENAME, scareMem);
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/formats.c
  ============================================================================
  $ cvs diff -u -r2.112 -r2.113 formats.c
  --- rpm/lib/formats.c	17 Oct 2007 16:53:22 -0000	2.112
  +++ rpm/lib/formats.c	17 Oct 2007 18:32:55 -0000	2.113
  @@ -32,10 +32,10 @@
   {
       const char ** list;
   
  -    if (rpmGetFilesystemList(&list, he->c))
  +    if (rpmGetFilesystemList(&list, &he->c))
   	return 1;
   
  -    if (he->t) *he->t = RPM_STRING_ARRAY_TYPE;
  +    he->t = RPM_STRING_ARRAY_TYPE;
       if (he->p) (*he->p).argv = list;
       he->freeData = 0;
   
  @@ -69,14 +69,14 @@
   	fnames.argv = _free(fnames.argv);
       }
   
  -    if (rpmGetFilesystemList(NULL, he->c))
  +    if (rpmGetFilesystemList(NULL, &he->c))
   	goto exit;
   
  -    *he->t = RPM_INT64_TYPE;
  +    he->t = RPM_INT64_TYPE;
       he->freeData = 1;
   
       if (fnames.ptr == NULL)
  -	usages = xcalloc((*he->c), sizeof(*usages));
  +	usages = xcalloc(he->c, sizeof(*usages));
       else
       if (rpmGetFilesystemUsage(fnames.argv, fsizes.ui32p, numFiles, &usages, 0))	
   	goto exit;
  @@ -102,8 +102,8 @@
   	/*@modifies h, he,
   		rpmGlobalMacroContext, fileSystem, internalState @*/
   {
  -    *he->t = RPM_STRING_ARRAY_TYPE;
  -    rpmfiBuildFClasses(h, &(*he->p).argv, he->c);
  +    he->t = RPM_STRING_ARRAY_TYPE;
  +    rpmfiBuildFClasses(h, &(*he->p).argv, &he->c);
       he->freeData = 1;
       return 0;
   }
  @@ -119,8 +119,8 @@
   	/*@modifies h, he,
   		rpmGlobalMacroContext, fileSystem, internalState @*/
   {
  -    *he->t = RPM_STRING_ARRAY_TYPE;
  -    rpmfiBuildFContexts(h, &(*he->p).argv, he->c);
  +    he->t = RPM_STRING_ARRAY_TYPE;
  +    rpmfiBuildFContexts(h, &(*he->p).argv, &he->c);
       he->freeData = 1;
       return 0;
   }
  @@ -136,8 +136,8 @@
   	/*@modifies h, he,
   		rpmGlobalMacroContext, fileSystem, internalState @*/
   {
  -    *he->t = RPM_STRING_ARRAY_TYPE;
  -    rpmfiBuildFSContexts(h, &(*he->p).argv, he->c);
  +    he->t = RPM_STRING_ARRAY_TYPE;
  +    rpmfiBuildFSContexts(h, &(*he->p).argv, &he->c);
       he->freeData = 1;
       return 0;
   }
  @@ -153,8 +153,8 @@
   	/*@modifies h, he,
   		rpmGlobalMacroContext, fileSystem, internalState @*/
   {
  -    *he->t = RPM_STRING_ARRAY_TYPE;
  -    rpmfiBuildREContexts(h, &(*he->p).argv, he->c);
  +    he->t = RPM_STRING_ARRAY_TYPE;
  +    rpmfiBuildREContexts(h, &(*he->p).argv, &he->c);
       he->freeData = 1;
       return 0;
   }
  @@ -170,8 +170,8 @@
   	/*@modifies h, he,
   		rpmGlobalMacroContext, fileSystem, internalState @*/
   {
  -    *he->t = RPM_STRING_ARRAY_TYPE;
  -    rpmfiBuildFDeps(h, RPMTAG_PROVIDENAME, &(*he->p).argv, he->c);
  +    he->t = RPM_STRING_ARRAY_TYPE;
  +    rpmfiBuildFDeps(h, RPMTAG_PROVIDENAME, &(*he->p).argv, &he->c);
       he->freeData = 1;
       return 0;
   }
  @@ -187,8 +187,8 @@
   	/*@modifies h, he,
   		rpmGlobalMacroContext, fileSystem, internalState @*/
   {
  -    *he->t = RPM_STRING_ARRAY_TYPE;
  -    rpmfiBuildFDeps(h, RPMTAG_REQUIRENAME, &(*he->p).argv, he->c);
  +    he->t = RPM_STRING_ARRAY_TYPE;
  +    rpmfiBuildFDeps(h, RPMTAG_REQUIRENAME, &(*he->p).argv, &he->c);
       he->freeData = 1;
       return 0;
   }
  @@ -243,9 +243,9 @@
   
       /* XXX perhaps return "(none)" inband if no suggests/enhances <shrug>. */
   
  -    *he->t = RPM_STRING_ARRAY_TYPE;
  +    he->t = RPM_STRING_ARRAY_TYPE;
       (*he->p).argv = argv;
  -    *he->c = argc;
  +    he->c = argc;
       he->freeData = 1;
       return 0;
   }
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/package.c
  ============================================================================
  $ cvs diff -u -r2.174 -r2.175 package.c
  --- rpm/lib/package.c	17 Oct 2007 16:53:22 -0000	2.174
  +++ rpm/lib/package.c	17 Oct 2007 18:32:55 -0000	2.175
  @@ -185,10 +185,8 @@
   rpmRC rpmReadPackageFile(rpmts ts, void * _fd, const char * fn, Header * hdrp)
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       pgpDig dig = rpmtsDig(ts);
       FD_t fd = _fd;
  @@ -353,10 +351,10 @@
       /* Retrieve the tag parameters from the signature header. */
       sig = NULL;
       he->tag = sigtag;
  -    xx = hge(sigh, he->tag, he->t, he->p, he->c);
  -    sigtype = he_t;
  +    xx = hge(sigh, he->tag, &he->t, he->p, &he->c);
  +    sigtype = he->t;
       sig = he_p.ptr;
  -    siglen = he_c;
  +    siglen = he->c;
       if (sig == NULL) {
   	rc = RPMRC_FAIL;
   	goto exit;
  @@ -383,10 +381,10 @@
   	size_t nmagic = 0;
   
   	he->tag = RPMTAG_HEADERIMMUTABLE;
  -	xx = hge(h, he->tag, he->t, he->p, he->c);
  -	uht = he_t;
  +	xx = hge(h, he->tag, &he->t, he->p, &he->c);
  +	uht = he->t;
   	uh = he_p.ptr;
  -	uhc = he_c;
  +	uhc = he->c;
   	if (!xx)
   	    break;
   	(void) headerGetMagic(NULL, &hmagic, &nmagic);
  @@ -422,10 +420,10 @@
   	size_t nmagic = 0;
   
   	he->tag = RPMTAG_HEADERIMMUTABLE;
  -	xx = hge(h, he->tag, he->t, he->p, he->c);
  -	uht = he_t;
  +	xx = hge(h, he->tag, &he->t, he->p, &he->c);
  +	uht = he->t;
   	uh = he_p.ptr;
  -	uhc = he_c;
  +	uhc = he->c;
   	if (!xx)
   	    break;
   	(void) headerGetMagic(NULL, &hmagic, &nmagic);
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/psm.c
  ============================================================================
  $ cvs diff -u -r2.245 -r2.246 psm.c
  --- rpm/lib/psm.c	17 Oct 2007 16:53:22 -0000	2.245
  +++ rpm/lib/psm.c	17 Oct 2007 18:32:55 -0000	2.246
  @@ -56,10 +56,8 @@
   int rpmVersionCompare(Header first, Header second)
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       const char * one, * two;
       int_32 Eone, Etwo;
  @@ -67,11 +65,11 @@
       int xx;
   
       he->tag = RPMTAG_EPOCH;
  -    xx = hge(first, he->tag, he->t, he->p, he->c);
  +    xx = hge(first, he->tag, &he->t, he->p, &he->c);
       Eone = (xx && he_p.i32p ? *he_p.i32p : 0);
       he_p.ptr = _free(he_p.ptr);
       he->tag = RPMTAG_EPOCH;
  -    xx = hge(second, he->tag, he->t, he->p, he->c);
  +    xx = hge(second, he->tag, &he->t, he->p, &he->c);
       Etwo = (xx && he_p.i32p ? *he_p.i32p : 0);
       he_p.ptr = _free(he_p.ptr);
   
  @@ -81,10 +79,10 @@
   	return 1;
   
       he->tag = RPMTAG_VERSION;
  -    xx = hge(first, he->tag, he->t, he->p, he->c);
  +    xx = hge(first, he->tag, &he->t, he->p, &he->c);
       one = he_p.str;
       he->tag = RPMTAG_VERSION;
  -    xx = hge(second, he->tag, he->t, he->p, he->c);
  +    xx = hge(second, he->tag, &he->t, he->p, &he->c);
       two = he_p.str;
       rc = rpmvercmp(one, two);
       one = _free(one);
  @@ -93,10 +91,10 @@
   	return rc;
   
       he->tag = RPMTAG_RELEASE;
  -    xx = hge(first, he->tag, he->t, he->p, he->c);
  +    xx = hge(first, he->tag, &he->t, he->p, &he->c);
       one = he_p.str;
       he->tag = RPMTAG_RELEASE;
  -    xx = hge(second, he->tag, he->t, he->p, he->c);
  +    xx = hge(second, he->tag, &he->t, he->p, &he->c);
       two = he_p.str;
       rc = rpmvercmp(one, two);
       one = _free(one);
  @@ -189,10 +187,8 @@
   		const char ** specFilePtr, const char ** cookie)
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       FD_t fd = _fd;
       int scareMem = 0;
  @@ -269,7 +265,7 @@
       if (cookie) {
   	*cookie = NULL;
   	he->tag = RPMTAG_COOKIE;
  -	xx = hge(fi->h, he->tag, he->t, he->p, he->c);
  +	xx = hge(fi->h, he->tag, &he->t, he->p, &he->c);
   	*cookie = he_p.str;
       }
   
  @@ -289,7 +285,7 @@
   
       if (fi->h != NULL) {	/* XXX can't happen */
   	he->tag = RPMTAG_FILEPATHS;
  -	xx = hge(fi->h, he->tag, he->t, he->p, he->c);
  +	xx = hge(fi->h, he->tag, &he->t, he->p, &he->c);
   	fi->apath = he_p.argv;
   
   	if (headerIsEntry(fi->h, RPMTAG_COOKIE))
  @@ -499,10 +495,8 @@
   	/*@modifies psm, fileSystem, internalState @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       const rpmts ts = psm->ts;
       int rootFdno = -1;
  @@ -519,7 +513,7 @@
   	*ssp |= (RPMSCRIPT_STATE_LUA|RPMSCRIPT_STATE_EXEC);
   
       he->tag = RPMTAG_NVRA;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
   assert(xx && he_p.str != NULL);
   
       /* Save the current working directory. */
  @@ -636,10 +630,8 @@
   		fileSystem, internalState @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       const rpmts ts = psm->ts;
       const char ** argv = NULL;
  @@ -667,7 +659,7 @@
   	return RPMRC_OK;
   
       he->tag = RPMTAG_NVRA;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
   assert(he_p.str != NULL);
       NVRA = he_p.str;
   
  @@ -717,13 +709,13 @@
       }
   
       he->tag = RPMTAG_INSTPREFIXES;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       prefixes = he_p.argv;
  -    numPrefixes = he_c;
  +    numPrefixes = he->c;
       if (!xx) {
   	he_p.ptr = _free(he_p.ptr);
   	he->tag = RPMTAG_INSTALLPREFIX;
  -	xx = hge(h, he->tag, he->t, he->p, he->c);
  +	xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	if (xx) {
   	    char * t;
   	    prefixes = xmalloc(sizeof(*prefixes) + strlen(he_p.argv[0]) + 1);
  @@ -967,10 +959,8 @@
   	/*@modifies psm, rpmGlobalMacroContext, fileSystem, internalState @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       rpmfi fi = psm->fi;
       const char * argv0 = NULL;
  @@ -980,17 +970,17 @@
   
   assert(fi->h != NULL);
       he->tag = psm->scriptTag;
  -    xx = hge(fi->h, he->tag, he->t, he->p, he->c);
  +    xx = hge(fi->h, he->tag, &he->t, he->p, &he->c);
       script = he_p.str;
       if (script == NULL)
   	goto exit;
       he->tag = psm->progTag;
  -    xx = hge(fi->h, he->tag, he->t, he->p, he->c);
  +    xx = hge(fi->h, he->tag, &he->t, he->p, &he->c);
       if (he_p.ptr == NULL)
   	goto exit;
   
       /* Coerce strings into header argv return. */
  -    if (he_t == RPM_STRING_TYPE) {
  +    if (he->t == RPM_STRING_TYPE) {
   	const char * s = he_p.str;
   	char * t;
   	he_p.argv = xmalloc(sizeof(*he_p.argv)+strlen(s)+1);
  @@ -1004,7 +994,7 @@
       if (he_p.argv[0][0] == '%')
   	he_p.argv[0] = argv0 = rpmExpand(he_p.argv[0], NULL);
   
  -    rc = runScript(psm, fi->h, tag2sln(psm->scriptTag), he_c, he_p.argv,
  +    rc = runScript(psm, fi->h, tag2sln(psm->scriptTag), he->c, he_p.argv,
   		script, psm->scriptArg, -1);
   
   exit:
  @@ -1033,10 +1023,8 @@
   {
       int scareMem = 0;
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       const rpmts ts = psm->ts;
       rpmds trigger = NULL;
  @@ -1050,10 +1038,10 @@
       int i;
   
       he->tag = RPMTAG_NAME;
  -    xx = hge(sourceH, he->tag, he->t, he->p, he->c);
  +    xx = hge(sourceH, he->tag, &he->t, he->p, &he->c);
       sourceName = he_p.str;
       he->tag = RPMTAG_NAME;
  -    xx = hge(triggeredH, he->tag, he->t, he->p, he->c);
  +    xx = hge(triggeredH, he->tag, &he->t, he->p, &he->c);
       triggerName = he_p.str;
   
       trigger = rpmdsInit(rpmdsNew(triggeredH, RPMTAG_TRIGGERNAME, scareMem));
  @@ -1081,13 +1069,13 @@
   	    continue;
   
   	he->tag = RPMTAG_TRIGGERINDEX;
  -	xx = hge(triggeredH, he->tag, he->t, he->p, he->c);
  +	xx = hge(triggeredH, he->tag, &he->t, he->p, &he->c);
   	triggerIndices = he_p.i32p;
   	he->tag = RPMTAG_TRIGGERSCRIPTS;
  -	xx = hge(triggeredH, he->tag, he->t, he->p, he->c);
  +	xx = hge(triggeredH, he->tag, &he->t, he->p, &he->c);
   	triggerScripts = he_p.argv;
   	he->tag = RPMTAG_TRIGGERSCRIPTPROG;
  -	xx = hge(triggeredH, he->tag, he->t, he->p, he->c);
  +	xx = hge(triggeredH, he->tag, &he->t, he->p, &he->c);
   	triggerProgs = he_p.argv;
   
   	if (triggerIndices && triggerScripts && triggerProgs) {
  @@ -1187,10 +1175,8 @@
   		fileSystem, internalState @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       const rpmts ts = psm->ts;
       rpmfi fi = psm->fi;
  @@ -1207,13 +1193,13 @@
       if (fi->h == NULL)	return rc;	/* XXX can't happen */
   
       he->tag = RPMTAG_TRIGGERNAME;
  -    xx = hge(fi->h, he->tag, he->t, he->p, he->c);
  +    xx = hge(fi->h, he->tag, &he->t, he->p, &he->c);
       triggerNames = he_p.argv;
  -    numTriggers = he_c;
  +    numTriggers = he->c;
       he->tag = RPMTAG_TRIGGERINDEX;
  -    xx = hge(fi->h, he->tag, he->t, he->p, he->c);
  +    xx = hge(fi->h, he->tag, &he->t, he->p, &he->c);
       triggerIndices = he_p.i32p;
  -    numTriggerIndices = he_c;
  +    numTriggerIndices = he->c;
   
       if (!(triggerNames && numTriggers > 0 && triggerIndices && numTriggerIndices > 0))
   	goto exit;
  @@ -1375,16 +1361,14 @@
   	/*@*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       uint_32 val;
       int xx;
   
       he->tag = tag;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       val = (xx && he_p.ui32p ? *he_p.ui32p : 0);
       he_p.ptr = _free(he_p.ptr);
       return val;
  @@ -1401,16 +1385,14 @@
   	/*@modifies th @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       int xx = 1;
   
       he->tag = tag;
  -    if (hge(sh, he->tag, he->t, he->p, he->c) && he_c > 0)
  -	xx = headerAddEntry(th, he->tag, he_t, he_p.ptr, he_c);
  +    if (hge(sh, he->tag, &he->t, he->p, &he->c) && he->c > 0)
  +	xx = headerAddEntry(th, he->tag, he->t, he_p.ptr, he->c);
   assert(xx);
       he_p.ptr = _free(he_p.ptr);
       return 0;
  @@ -1596,10 +1578,8 @@
   rpmRC rpmpsmStage(rpmpsm psm, pkgStage stage)
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       const rpmts ts = psm->ts;
       uint_32 tscolor = rpmtsColor(ts);
  @@ -1695,7 +1675,7 @@
   	     * need the leading / stripped.
   	     */
   	    he->tag = RPMTAG_DEFAULTPREFIX;
  -	    xx = hge(fi->h, he->tag, he->t, he->p, he->c);
  +	    xx = hge(fi->h, he->tag, &he->t, he->p, &he->c);
   	    fi->striplen = (xx && he_p.str ? strlen(he_p.str) + 1 : 1);
   	    he_p.ptr = _free(he_p.ptr);
   	    fi->mapflags =
  @@ -1705,18 +1685,18 @@
   		he->tag = RPMTAG_ORIGPATHS;
   	    else
   		he->tag = RPMTAG_FILEPATHS;
  -	    xx = hge(fi->h, he->tag, he->t, he->p, he->c);
  +	    xx = hge(fi->h, he->tag, &he->t, he->p, &he->c);
   assert(he_p.argv != NULL);
   	    fi->apath = he_p.argv;
   	
   	    if (fi->fuser == NULL) {
   		he->tag = RPMTAG_FILEUSERNAME;
  -		xx = hge(fi->h, he->tag, he->t, he->p, he->c);
  +		xx = hge(fi->h, he->tag, &he->t, he->p, &he->c);
   		fi->fuser = he_p.argv;
   	    }
   	    if (fi->fgroup == NULL) {
   		he->tag = RPMTAG_FILEGROUPNAME;
  -		xx = hge(fi->h, he->tag, he->t, he->p, he->c);
  +		xx = hge(fi->h, he->tag, &he->t, he->p, &he->c);
   		fi->fgroup = he_p.argv;
   	    }
   	    rc = RPMRC_OK;
  @@ -1838,19 +1818,19 @@
   
   		/* Save originnal header's origin (i.e. URL) */
   		he->tag = RPMTAG_PACKAGEORIGIN;
  -		xx = hge(fi->h, he->tag, he->t, he->p, he->c);
  +		xx = hge(fi->h, he->tag, &he->t, he->p, &he->c);
   		origin = he_p.str;
   
   		/* Retrieve original header blob. */
   		he->tag = RPMTAG_HEADERIMMUTABLE;
  -		xx = hge(fi->h, he->tag, he->t, he->p, he->c);
  +		xx = hge(fi->h, he->tag, &he->t, he->p, &he->c);
   		uh = he_p.ptr;
   		if (xx && uh != NULL) {
   		    psm->oh = headerCopyLoad(uh);
   		    uh = _free(uh);
   		} else {
   		    he->tag = RPMTAG_HEADERIMAGE;
  -		    xx = hge(fi->h, he->tag, he->t, he->p, he->c);
  +		    xx = hge(fi->h, he->tag, &he->t, he->p, &he->c);
   		    uh = he_p.ptr;
   		    if (xx && uh != NULL) {
   			HeaderIterator hi;
  @@ -1874,10 +1854,10 @@
   				noArchiveSize = 1;
   			    if (ptr) {
   				he->tag = tag;
  -				he_t = type;
  +				he->t = type;
   				he_p.ptr = (void *) ptr;	/* NOCAST */
  -				he_c = count;
  -				xx = hae(psm->oh, he->tag, he_t, he_p, he_c);
  +				he->c = count;
  +				xx = hae(psm->oh, he->tag, he->t, he_p, he->c);
   			    }
   			}
   			hi = headerFreeIterator(hi);
  @@ -1938,18 +1918,18 @@
   	    {	int_32 tid = rpmtsGetTid(ts);
   
   		he->tag = RPMTAG_REMOVETID;
  -		he_t = RPM_INT32_TYPE;
  +		he->t = RPM_INT32_TYPE;
   		he_p.i32p = &tid;
  -		he_c = 1;
  -		xx = hae(psm->oh, he->tag, he_t, he_p, he_c);
  +		he->c = 1;
  +		xx = hae(psm->oh, he->tag, he->t, he_p, he->c);
   
   		/* Add original header's origin (i.e. URL) */
   		if (origin != NULL) {
   		    he->tag = RPMTAG_PACKAGEORIGIN;
  -		    he_t = RPM_STRING_TYPE;
  +		    he->t = RPM_STRING_TYPE;
   		    he_p.str = origin;
  -		    he_c = 1;
  -		    xx = hae(psm->oh, he->tag, he_t, he_p, he_c);
  +		    he->c = 1;
  +		    xx = hae(psm->oh, he->tag, he->t, he_p, he->c);
   		    origin = _free(origin);
   		}
   
  @@ -2337,7 +2317,7 @@
   	char * t;
   
   	he->tag = RPMTAG_PAYLOADCOMPRESSOR;
  -	xx = hge(fi->h, he->tag, he->t, he->p, he->c);
  +	xx = hge(fi->h, he->tag, &he->t, he->p, &he->c);
   	payload_compressor = he_p.str;
   	if (payload_compressor == NULL)
   	    payload_compressor = xstrdup("gzip");
  @@ -2354,7 +2334,7 @@
   	payload_compressor = _free(payload_compressor);
   
   	he->tag = RPMTAG_PAYLOADFORMAT;
  -	xx = hge(fi->h, he->tag, he->t, he->p, he->c);
  +	xx = hge(fi->h, he->tag, &he->t, he->p, &he->c);
   	payload_format = he_p.str;
   	if (!xx || payload_format == NULL
   	 || !(!strcmp(payload_format, "tar") || !strcmp(payload_format, "ustar"))) {
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmchecksig.c
  ============================================================================
  $ cvs diff -u -r1.158 -r1.159 rpmchecksig.c
  --- rpm/lib/rpmchecksig.c	17 Oct 2007 16:53:22 -0000	1.158
  +++ rpm/lib/rpmchecksig.c	17 Oct 2007 18:32:55 -0000	1.159
  @@ -143,20 +143,18 @@
   	/*@modifies *signid, fileSystem, internalState @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       int rc = 1;
       int xx;
   
       he->tag = sigtag;
  -    xx = hge(sigh, he->tag, he->t, he->p, he->c);
  +    xx = hge(sigh, he->tag, &he->t, he->p, &he->c);
       if (xx && he_p.ptr != NULL) {
   	pgpDig dig = pgpNewDig(0);
   
  -	if (!pgpPrtPkts(he_p.ptr, he_c, dig, 0)) {
  +	if (!pgpPrtPkts(he_p.ptr, he->c, dig, 0)) {
   	    memcpy(signid, dig->signature.signid, sizeof(dig->signature.signid));
   	    rc = 0;
   	}
  @@ -182,10 +180,8 @@
                   fileSystem, internalState @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       rpmgi gi = NULL;
       FD_t fd = NULL;
  @@ -271,7 +267,7 @@
   
   	/* Dump the immutable region (if present). */
   	he->tag = RPMTAG_HEADERSIGNATURES;
  -	xx = hge(sigh, he->tag, he->t, he->p, he->c);
  +	xx = hge(sigh, he->tag, &he->t, he->p, &he->c);
   	if (xx) {
   	    HeaderIterator hi;
   	    int_32 htag;
  @@ -677,10 +673,8 @@
   	/*@modifies fd, *dig, fileSystem, internalState @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       unsigned char buf[4*BUFSIZ];
       ssize_t count;
  @@ -704,7 +698,7 @@
   	    size_t nmagic = 0;
   	
   	    he->tag = RPMTAG_HEADERIMMUTABLE;
  -	    xx = hge(h, he->tag, he->t, he->p, he->c);
  +	    xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	    if (!xx || he_p.ptr == NULL) {
   		h = headerFree(h);
   		rpmlog(RPMLOG_ERR, _("%s: headerGetEntry failed\n"), fn);
  @@ -714,11 +708,11 @@
   	    dig->hdrsha1ctx = rpmDigestInit(PGPHASHALGO_SHA1, RPMDIGEST_NONE);
   	    if (hmagic && nmagic > 0)
   		(void) rpmDigestUpdate(dig->hdrsha1ctx, hmagic, nmagic);
  -	    (void) rpmDigestUpdate(dig->hdrsha1ctx, he_p.ptr, he_c);
  +	    (void) rpmDigestUpdate(dig->hdrsha1ctx, he_p.ptr, he->c);
   	    dig->hdrmd5ctx = rpmDigestInit(dig->signature.hash_algo, RPMDIGEST_NONE);
   	    if (hmagic && nmagic > 0)
   		(void) rpmDigestUpdate(dig->hdrmd5ctx, hmagic, nmagic);
  -	    (void) rpmDigestUpdate(dig->hdrmd5ctx, he_p.ptr, he_c);
  +	    (void) rpmDigestUpdate(dig->hdrmd5ctx, he_p.ptr, he->c);
   	    he_p.ptr = _free(he_p.ptr);
   	}
   	h = headerFree(h);
  @@ -768,10 +762,8 @@
   		const char * fn)
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       int res2, res3;
       char result[1024];
  @@ -868,8 +860,8 @@
   #endif
   	) {
   	    he->tag = sigtag;
  -	    xx = hge(sigh, he->tag, he->t, he->p, he->c);
  -	    xx = pgpPrtPkts(he_p.ptr, he_c, dig, 0);
  +	    xx = hge(sigh, he->tag, &he->t, he->p, &he->c);
  +	    xx = pgpPrtPkts(he_p.ptr, he->c, dig, 0);
   	    he_p.ptr = _free(he_p.ptr);
   #if defined(SUPPORT_RPMV3_VERIFY_RSA)
   	    /* XXX assume same hash_algo in header-only and header+payload */
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmds.c
  ============================================================================
  $ cvs diff -u -r2.73 -r2.74 rpmds.c
  --- rpm/lib/rpmds.c	17 Oct 2007 16:53:22 -0000	2.73
  +++ rpm/lib/rpmds.c	17 Oct 2007 18:32:55 -0000	2.74
  @@ -236,10 +236,8 @@
   {
       int scareMem = (flags & 0x1);
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
   
       rpmTag tagEVR, tagF;
  @@ -288,9 +286,9 @@
   	goto exit;
   
       he->tag = tagN;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       N = he_p.argv;
  -    Count = he_c;
  +    Count = he->c;
       if (xx && N != NULL && Count > 0) {
   	ds = xcalloc(1, sizeof(*ds));
   	ds->Type = Type;
  @@ -304,22 +302,22 @@
   
   	if (tagEVR > 0) {
   	    he->tag = tagEVR;
  -	    xx = hge(h, he->tag, he->t, he->p, he->c);
  +	    xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	    ds->EVR = he_p.argv;
   	}
   	if (tagF > 0) {
   	    he->tag = tagF;
  -	    xx = hge(h, he->tag, he->t, he->p, he->c);
  +	    xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	    ds->Flags = he_p.i32p;
   	}
   	{
   	    he->tag = RPMTAG_ARCH;
  -	    xx = hge(h, he->tag, he->t, he->p, he->c);
  +	    xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	    ds->A = he_p.str;
   	}
   	{
   	    he->tag = RPMTAG_BUILDTIME;
  -	    xx = hge(h, he->tag, he->t, he->p, he->c);
  +	    xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	    ds->BT = (he_p.ui32p ? *he_p.ui32p : 0);
   	    he_p.ptr = _free(he_p.ptr);
   	}
  @@ -477,10 +475,8 @@
   rpmds rpmdsThis(Header h, rpmTag tagN, int_32 Flags)
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       rpmds ds = NULL;
       const char * Type;
  @@ -514,7 +510,7 @@
   	goto exit;
   
       he->tag = RPMTAG_EPOCH;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       E = (he_p.i32p ? *he_p.i32p : 0);
       he_p.ptr = _free(he_p.ptr);
   
  @@ -547,11 +543,11 @@
       ds->Flags = xmalloc(sizeof(*ds->Flags));	ds->Flags[0] = Flags;
   
       he->tag = RPMTAG_ARCH;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       ds->A = he_p.str;
   
       he->tag = RPMTAG_BUILDTIME;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       ds->BT = (he_p.ui32p ? *he_p.ui32p : 0);
       he_p.ptr = _free(he_p.ptr);
   
  @@ -3717,10 +3713,8 @@
   int rpmdsNVRMatchesDep(const Header h, const rpmds req, int nopromote)
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       const char * pkgN, * V, * R;
       int_32 E;
  @@ -3746,7 +3740,7 @@
       (void) headerNEVRA(h, &pkgN, NULL, &V, &R, NULL);
   /*@=mods@*/
       he->tag = RPMTAG_EPOCH;
  -    gotE = hge(h, he->tag, he->t, he->p, he->c);
  +    gotE = hge(h, he->tag, &he->t, he->p, &he->c);
       E = (he_p.i32p ? *he_p.i32p : 0);
       he_p.ptr = _free(he_p.ptr);
   
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmfc.c
  ============================================================================
  $ cvs diff -u -r1.25 -r1.26 rpmfc.c
  --- rpm/lib/rpmfc.c	17 Oct 2007 16:53:22 -0000	1.25
  +++ rpm/lib/rpmfc.c	17 Oct 2007 18:32:55 -0000	1.26
  @@ -1322,10 +1322,8 @@
           /*@modifies rpmGlobalMacroContext, fileSystem, internalState @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       StringBuf sb_stdin = newStringBuf();
       StringBuf sb_stdout = NULL;
  @@ -1343,7 +1341,7 @@
   
   	/* Retrieve scriptlet interpreter. */
   	he->tag = dm->ntag;
  -	xx = hge(pkg->header, he->tag, he->t, he->p, he->c);
  +	xx = hge(pkg->header, he->tag, &he->t, he->p, &he->c);
   	if (!xx || he_p.str == NULL)
   	    continue;
   	xx = strcmp(he_p.str, "/bin/sh") && strcmp(he_p.str, "/bin/bash");
  @@ -1353,7 +1351,7 @@
   
   	/* Retrieve scriptlet body. */
   	he->tag = dm->vtag;
  -	xx = hge(pkg->header, he->tag, he->t, he->p, he->c);
  +	xx = hge(pkg->header, he->tag, &he->t, he->p, &he->c);
   	if (!xx || he_p.str == NULL)
   	    continue;
   	truncStringBuf(sb_stdin);
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmfi.c
  ============================================================================
  $ cvs diff -u -r2.89 -r2.90 rpmfi.c
  --- rpm/lib/rpmfi.c	17 Oct 2007 16:53:22 -0000	2.89
  +++ rpm/lib/rpmfi.c	17 Oct 2007 18:32:55 -0000	2.90
  @@ -686,10 +686,8 @@
   {
       rpmte p = rpmtsRelocateElement(ts);
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       HAE_t hae = (HAE_t) headerAddEntry;
       HME_t hme = (HME_t) headerModifyEntry;
  @@ -722,10 +720,10 @@
       int xx;
   
       he->tag = RPMTAG_PREFIXES;
  -    xx = hge(origH, he->tag, he->t, he->p, he->c);
  -    validType = he_t;
  +    xx = hge(origH, he->tag, &he->t, he->p, &he->c);
  +    validType = he->t;
       validRelocations = he_p.argv;
  -    numValid = he_c;
  +    numValid = he->c;
       if (!xx)
   	numValid = 0;
   
  @@ -746,10 +744,10 @@
   	if (numValid) {
   	    if (!headerIsEntry(origH, RPMTAG_INSTPREFIXES)) {
   		he->tag = RPMTAG_INSTPREFIXES;
  -		he_t = validType;
  +		he->t = validType;
   		he_p.argv = validRelocations;
  -		he_c = numValid;
  -		xx = hae(origH, he->tag, he_t, he_p, he_c);
  +		he->c = numValid;
  +		xx = hae(origH, he->tag, he->t, he_p, he->c);
   	    }
   	    validRelocations = _free(validRelocations);
   	}
  @@ -874,10 +872,10 @@
   
   	if (numActual) {
   	    he->tag = RPMTAG_INSTPREFIXES;
  -	    he_t = RPM_STRING_ARRAY_TYPE;
  +	    he->t = RPM_STRING_ARRAY_TYPE;
   	    he_p.argv = actualRelocations;
  -	    he_c = numActual;
  -	    xx = hae(h, he->tag, he_t, he_p, he_c);
  +	    he->c = numActual;
  +	    xx = hae(h, he->tag, he->t, he_p, he->c);
   	}
   
   	actualRelocations = _free(actualRelocations);
  @@ -885,24 +883,24 @@
       }
   
       he->tag = RPMTAG_BASENAMES;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       baseNames = he_p.argv;
  -    fileCount = he_c;
  +    fileCount = he->c;
       he->tag = RPMTAG_DIRINDEXES;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       dirIndexes = he_p.i32p;
       he->tag = RPMTAG_DIRNAMES;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       dirNames = he_p.argv;
  -    dirCount = he_c;
  +    dirCount = he->c;
       he->tag = RPMTAG_FILEFLAGS;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       fFlags = he_p.ui32p;
       he->tag = RPMTAG_FILECOLORS;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       fColors = he_p.ui32p;
       he->tag = RPMTAG_FILEMODES;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       fModes = he_p.ui16p;
   
       dColors = alloca(dirCount * sizeof(*dColors));
  @@ -1104,50 +1102,50 @@
       /* Save original filenames in header and replace (relocated) filenames. */
       if (nrelocated) {
   	he->tag = RPMTAG_BASENAMES;
  -	xx = hge(h, he->tag, he->t, he->p, he->c);
  +	xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	he->tag = RPMTAG_ORIGBASENAMES;
  -	xx = hae(h, he->tag, he_t, he_p, he_c);
  +	xx = hae(h, he->tag, he->t, he_p, he->c);
   	he_p.ptr = _free(he_p.ptr);
   
   	he->tag = RPMTAG_DIRNAMES;
  -	xx = hge(h, he->tag, he->t, he->p, he->c);
  +	xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	he->tag = RPMTAG_ORIGDIRNAMES;
  -	xx = hae(h, he->tag, he_t, he_p, he_c);
  +	xx = hae(h, he->tag, he->t, he_p, he->c);
   	he_p.ptr = _free(he_p.ptr);
   
   	he->tag = RPMTAG_DIRINDEXES;
  -	xx = hge(h, he->tag, he->t, he->p, he->c);
  +	xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	he->tag = RPMTAG_ORIGDIRINDEXES;
  -	xx = hae(h, he->tag, he_t, he_p, he_c);
  +	xx = hae(h, he->tag, he->t, he_p, he->c);
   	he_p.ptr = _free(he_p.ptr);
   
   	he->tag = RPMTAG_BASENAMES;
  -	he_t = RPM_STRING_ARRAY_TYPE;
  +	he->t = RPM_STRING_ARRAY_TYPE;
   	he_p.argv = baseNames;
  -	he_c = fileCount;
  -	xx = hme(h, he->tag, he_t, he_p, he_c);
  +	he->c = fileCount;
  +	xx = hme(h, he->tag, he->t, he_p, he->c);
   	fi->bnl = _free(fi->bnl);
  -	xx = hge(h, he->tag, he->t, he->p, he->c);
  +	xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	fi->bnl = he_p.argv;
  -	fi->fc = he_c;
  +	fi->fc = he->c;
   
   	he->tag = RPMTAG_DIRNAMES;
  -	he_t = RPM_STRING_ARRAY_TYPE;
  +	he->t = RPM_STRING_ARRAY_TYPE;
   	he_p.argv = dirNames;
  -	he_c = dirCount;
  -	xx = hme(h, he->tag, he_t, he_p, he_c);
  +	he->c = dirCount;
  +	xx = hme(h, he->tag, he->t, he_p, he->c);
   	fi->dnl = _free(fi->dnl);
  -	xx = hge(h, he->tag, he->t, he->p, he->c);
  +	xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	fi->dnl = he_p.argv;
  -	fi->dc = he_c;
  +	fi->dc = he->c;
   
   	he->tag = RPMTAG_DIRINDEXES;
  -	he_t = RPM_INT32_TYPE;
  +	he->t = RPM_INT32_TYPE;
   	he_p.i32p = dirIndexes;
  -	he_c = fileCount;
  -	xx = hme(h, he->tag, he_t, he_p, he_c);
  +	he->c = fileCount;
  +	xx = hme(h, he->tag, he->t, he_p, he->c);
   	fi->dil = _free(fi->dil);
  -	xx = hge(h, he->tag, he->t, he->p, he->c);
  +	xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	fi->dil = he_p.ui32p;
       }
   
  @@ -1266,22 +1264,20 @@
   
   #define _fdupestring(_h, _tag, _data) \
       he->tag = _tag; \
  -    xx = hge((_h), he->tag, he->t, he->p, he->c); \
  +    xx = hge((_h), he->tag, &he->t, he->p, &he->c); \
       _data = he_p.str;
   
   #define _fdupedata(_h, _tag, _data) \
       he->tag = _tag; \
  -    xx = hge((_h), he->tag, he->t, he->p, he->c); \
  +    xx = hge((_h), he->tag, &he->t, he->p, &he->c); \
       _data = he_p.ptr;
   
   rpmfi rpmfiNew(const rpmts ts, Header h, rpmTag tagN, int flags)
   {
       int scareMem = (flags & 0x1);
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       rpmte p;
       rpmfi fi = NULL;
  @@ -1321,7 +1317,7 @@
   
       /* 0 means unknown */
       he->tag = RPMTAG_ARCHIVESIZE;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       fi->archivePos = 0;
       fi->archiveSize = (xx && he_p.ui32p ? *he_p.ui32p : 0);
       he_p.ptr = _free(he_p.ptr);
  @@ -1335,16 +1331,16 @@
       _fdupestring(h, RPMTAG_VERIFYSCRIPTPROG, fi->verifyscriptprog);
   
       he->tag = RPMTAG_BASENAMES;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       fi->bnl = he_p.argv;
  -    fi->fc = he_c;
  +    fi->fc = he->c;
       if (!xx) {
   	fi->fc = 0;
   	fi->dc = 0;
   	goto exit;
       }
       _fdupedata(h, RPMTAG_DIRNAMES, fi->dnl);
  -    fi->dc = he_c;
  +    fi->dc = he->c;
       _fdupedata(h, RPMTAG_DIRINDEXES, fi->dil);
       _fdupedata(h, RPMTAG_FILEMODES, fi->fmodes);
       _fdupedata(h, RPMTAG_FILEFLAGS, fi->fflags);
  @@ -1357,11 +1353,11 @@
       for (i = 0; i < fi->fc; i++)
   	fi->color |= fi->fcolors[i];
       _fdupedata(h, RPMTAG_CLASSDICT, fi->cdict);
  -    fi->ncdict = he_c;
  +    fi->ncdict = he->c;
       _fdupedata(h, RPMTAG_FILECLASS, fi->fcdictx);
   
       _fdupedata(h, RPMTAG_DEPENDSDICT, fi->ddict);
  -    fi->nddict = he_c;
  +    fi->nddict = he->c;
       _fdupedata(h, RPMTAG_FILEDEPENDSX, fi->fddictx);
       _fdupedata(h, RPMTAG_FILEDEPENDSN, fi->fddictn);
   
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpminstall.c
  ============================================================================
  $ cvs diff -u -r1.175 -r1.176 rpminstall.c
  --- rpm/lib/rpminstall.c	17 Oct 2007 16:53:22 -0000	1.175
  +++ rpm/lib/rpminstall.c	17 Oct 2007 18:32:55 -0000	1.176
  @@ -307,10 +307,8 @@
   int rpmcliInstall(rpmts ts, QVA_t ia, const char ** argv)
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       int numFailed = 0;
       int numRPMS = 0;
  @@ -423,14 +421,14 @@
   	/* === Check for relocatable package. */
   	if (relocations) {
   	    he->tag = RPMTAG_PREFIXES;
  -	    xx = hge(h, he->tag, he->t, he->p, he->c);
  -	    if (xx && he_c == 1) {
  +	    xx = hge(h, he->tag, &he->t, he->p, &he->c);
  +	    if (xx && he->c == 1) {
   		relocations->oldPath = xstrdup(he_p.argv[0]);
   		he_p.ptr = _free(he_p.ptr);
   	    } else {
   		he_p.ptr = _free(he_p.ptr);
   		he->tag = RPMTAG_NVRA;
  -		xx = hge(h, he->tag, he->t, he->p, he->c);
  +		xx = hge(h, he->tag, &he->t, he->p, &he->c);
   		rpmlog(RPMLOG_ERR,
   			       _("package %s is not relocatable\n"), he_p.str);
   		he_p.ptr = _free(he_p.ptr);
  @@ -447,7 +445,7 @@
   	    int count;
   
   	    he->tag = RPMTAG_NAME;
  -	    xx = hge(h, he->tag, he->t, he->p, he->c);
  +	    xx = hge(h, he->tag, &he->t, he->p, &he->c);
   assert(xx != 0 && he_p.str != NULL);
   	    mi = rpmtsInitIterator(ts, RPMTAG_NAME, he_p.str, 0);
   	    he_p.ptr = _free(he_p.ptr);
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmrollback.c
  ============================================================================
  $ cvs diff -u -r1.20 -r1.21 rpmrollback.c
  --- rpm/lib/rpmrollback.c	17 Oct 2007 16:53:22 -0000	1.20
  +++ rpm/lib/rpmrollback.c	17 Oct 2007 18:32:55 -0000	1.21
  @@ -91,10 +91,8 @@
   IDTX IDTXload(rpmts ts, rpmTag tag, uint_32 rbtid)
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       IDTX idtx = NULL;
       rpmdbMatchIterator mi;
  @@ -108,7 +106,7 @@
   #endif
       while ((h = rpmdbNextIterator(mi)) != NULL) {
   	he->tag = tag;
  -	xx = hge(h, he->tag, he->t, he->p, he->c);
  +	xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	if (!xx || he_p.i32p == NULL)
   	    continue;
   	tid = (he_p.i32p ? *he_p.i32p : 0);
  @@ -145,10 +143,8 @@
   IDTX IDTXglob(rpmts ts, const char * globstr, rpmTag tag, uint_32 rbtid)
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       IDTX idtx = NULL;
       Header h;
  @@ -200,7 +196,7 @@
   assert(!strcmp(av[i], origin));
   }
   	he->tag = tag;
  -	xx = hge(h, he->tag, he->t, he->p, he->c);
  +	xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	if (!xx || he_p.i32p == NULL)
   	    goto bottom;
   	tid = (he_p.i32p ? *he_p.i32p : 0);
  @@ -295,10 +291,8 @@
   	/*@modifies ts, p, ip, rpmGlobalMacroContext, fileSystem, internalState @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       int rc = 0;
       int xx;
  @@ -319,9 +313,9 @@
   	    int bingo;
   
   	    he->tag = RPMTAG_BLINKPKGID;
  -	    xx = hge(ip->h, he->tag, he->t, he->p, he->c);
  +	    xx = hge(ip->h, he->tag, &he->t, he->p, &he->c);
   	    flinkPkgid = he_p.argv;
  -	    pn = he_c;
  +	    pn = he->c;
   
   	    /* XXX Always erase packages at beginning of upgrade chain. */
   	    if (pn == 1 && flinkPkgid[0] != NULL && !strcmp(flinkPkgid[0], RPMTE_CHAIN_END)) {
  @@ -330,13 +324,13 @@
   	    }
   
   	    he->tag = RPMTAG_BLINKHDRID;
  -	    xx = hge(ip->h, he->tag, he->t, he->p, he->c);
  +	    xx = hge(ip->h, he->tag, &he->t, he->p, &he->c);
   	    flinkHdrid = he_p.argv;
  -	    hn = he_c;
  +	    hn = he->c;
   	    he->tag = RPMTAG_BLINKNEVRA;
  -	    xx = hge(ip->h, he->tag, he->t, he->p, he->c);
  +	    xx = hge(ip->h, he->tag, &he->t, he->p, &he->c);
   	    flinkNEVRA = he_p.argv;
  -	    nn = he_c;
  +	    nn = he->c;
   
   	    /*
   	     * Link data may be missing and can have multiple entries.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmte.c
  ============================================================================
  $ cvs diff -u -r2.60 -r2.61 rpmte.c
  --- rpm/lib/rpmte.c	17 Oct 2007 16:53:22 -0000	2.60
  +++ rpm/lib/rpmte.c	17 Oct 2007 18:32:55 -0000	2.61
  @@ -96,15 +96,13 @@
   {
       int scareMem = 0;
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       int xx;
   
       he->tag = RPMTAG_NVRA;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
   assert(he_p.str != NULL);
       p->NEVR = he_p.str;
       p->name = xstrdup(p->NEVR);
  @@ -116,18 +114,18 @@
       p->db_instance = 0;
   
       he->tag = RPMTAG_HDRID;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       p->hdrid = he_p.str;
   
       he->tag = RPMTAG_PKGID;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       if (he_p.ui8p != NULL) {
   	static const char hex[] = "0123456789abcdef";
   	char * t;
   	int i;
   
  -	p->pkgid = t = xmalloc((2*he_c) + 1);
  -	for (i = 0 ; i < he_c; i++) {
  +	p->pkgid = t = xmalloc((2*he->c) + 1);
  +	for (i = 0 ; i < he->c; i++) {
   	    *t++ = hex[ (unsigned)((he_p.ui8p[i] >> 4) & 0x0f) ];
   	    *t++ = hex[ (unsigned)((he_p.ui8p[i]     ) & 0x0f) ];
   	}
  @@ -137,11 +135,11 @@
   	p->pkgid = NULL;
   
       he->tag = RPMTAG_ARCH;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       p->arch = he_p.str;
   
       he->tag = RPMTAG_OS;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       p->os = he_p.str;
   
       p->isSource =
  @@ -151,7 +149,7 @@
       p->NEVRA = xstrdup(p->NEVR);
   
       he->tag = RPMTAG_EPOCH;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       if (he_p.i32p != NULL) {
   	p->epoch = xmalloc(20);
   	sprintf(p->epoch, "%d", *he_p.i32p);
  @@ -219,10 +217,8 @@
   		alKey pkgKey)
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       rpmte p = xcalloc(1, sizeof(*p));
       int xx;
  @@ -236,7 +232,7 @@
   	/* XXX 256 is only an estimate of signature header. */
   	p->pkgFileSize = 96 + 256;
   	he->tag = RPMTAG_SIGSIZE;
  -	xx = hge(h, he->tag, he->t, he->p, he->c);
  +	xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	if (xx && he_p.ui32p)
   	    p->pkgFileSize += *he_p.ui32p;
   	he_p.ptr = _free(he_p.ptr);
  @@ -607,10 +603,8 @@
   int rpmteChain(rpmte p, rpmte q, Header oh, const char * msg)
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       const char * blinkNEVRA = NULL;
       const char * blinkPkgid = NULL;
  @@ -620,7 +614,7 @@
       if (msg == NULL)
   	msg = "";
       he->tag = RPMTAG_NVRA;
  -    xx = hge(oh, he->tag, he->t, he->p, he->c);
  +    xx = hge(oh, he->tag, &he->t, he->p, &he->c);
   assert(he_p.str != NULL);
       blinkNEVRA = he_p.str;
   
  @@ -630,14 +624,14 @@
        * tags appended.
        */
       he->tag = RPMTAG_PKGID;
  -    xx = hge(oh, he->tag, he->t, he->p, he->c);
  +    xx = hge(oh, he->tag, &he->t, he->p, &he->c);
       if (xx && he_p.ui8p != NULL) {
   	static const char hex[] = "0123456789abcdef";
   	char * t;
   	int i;
   
  -	blinkPkgid = t = xmalloc((2*he_c) + 1);
  -	for (i = 0 ; i < he_c; i++) {
  +	blinkPkgid = t = xmalloc((2*he->c) + 1);
  +	for (i = 0 ; i < he->c; i++) {
   	    *t++ = hex[ ((he_p.ui8p[i] >> 4) & 0x0f) ];
   	    *t++ = hex[ ((he_p.ui8p[i]     ) & 0x0f) ];
   	}
  @@ -647,7 +641,7 @@
   	blinkPkgid = NULL;
   
       he->tag = RPMTAG_HDRID;
  -    xx = hge(oh, he->tag, he->t, he->p, he->c);
  +    xx = hge(oh, he->tag, &he->t, he->p, &he->c);
       blinkHdrid = he_p.str;
   
   /*@-modfilesys@*/
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmts.c
  ============================================================================
  $ cvs diff -u -r2.111 -r2.112 rpmts.c
  --- rpm/lib/rpmts.c	17 Oct 2007 16:53:22 -0000	2.111
  +++ rpm/lib/rpmts.c	17 Oct 2007 18:32:55 -0000	2.112
  @@ -305,10 +305,8 @@
   int rpmtsSolve(rpmts ts, rpmds ds, /*@unused@*/ const void * data)
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       const char * errstr;
       const char * str = NULL;
  @@ -359,7 +357,7 @@
   	    continue;
   
   	he->tag = RPMTAG_NAME;
  -	xx = hge(h, he->tag, he->t, he->p, he->c);
  +	xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	hnamelen = ((xx && he_p.str) ? strlen(he_p.str) : 0);
   	he_p.ptr = _free(he_p.ptr);
   
  @@ -369,7 +367,7 @@
   
   	/* XXX Prefer the newest build if given alternatives. */
   	he->tag = RPMTAG_BUILDTIME;
  -	xx = hge(h, he->tag, he->t, he->p, he->c);
  +	xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	htime = (xx && he_p.i32p ? *he_p.i32p : 0);
   	he_p.ptr = _free(he_p.ptr);
   
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/transaction.c
  ============================================================================
  $ cvs diff -u -r1.344 -r1.345 transaction.c
  --- rpm/lib/transaction.c	17 Oct 2007 16:53:22 -0000	1.344
  +++ rpm/lib/transaction.c	17 Oct 2007 18:32:55 -0000	1.345
  @@ -101,10 +101,8 @@
   	/*@modifies ts, p, fi, rpmGlobalMacroContext, fileSystem, internalState @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       const char * altNVRA = NULL;
       uint_32 tscolor = rpmtsColor(ts);
  @@ -125,7 +123,7 @@
   			&shared->otherPkg, sizeof(shared->otherPkg));
   	while ((h = rpmdbNextIterator(mi)) != NULL) {
   	    he->tag = RPMTAG_NVRA;
  -	    xx = hge(h, he->tag, he->t, he->p, he->c);
  +	    xx = hge(h, he->tag, &he->t, he->p, &he->c);
   assert(he_p.str != NULL);
   	    altNVRA = he_p.str;
   	    otherFi = rpmfiNew(ts, h, RPMTAG_BASENAMES, scareMem);
  @@ -251,10 +249,8 @@
   	/*@modifies ts, fi, rpmGlobalMacroContext, fileSystem, internalState @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       Header h;
       const unsigned char * otherStates;
  @@ -271,7 +267,7 @@
       }
   
       he->tag = RPMTAG_FILESTATES;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       otherStates = he_p.ptr;
   
       /* XXX there's an obscure segfault here w/o NULL check ... */
  @@ -619,10 +615,8 @@
   	/*@modifies ts @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       int_32 reqFlags = (RPMSENSE_LESS | RPMSENSE_EQUAL);
       const char * reqEVR;
  @@ -650,7 +644,7 @@
       if (rc == 0) {
   	rpmps ps = rpmtsProblems(ts);
   	he->tag = RPMTAG_NVRA;
  -	rc = hge(h, he->tag, he->t, he->p, he->c);
  +	rc = hge(h, he->tag, &he->t, he->p, &he->c);
   assert(he_p.str != NULL);
   	rpmpsAppend(ps, RPMPROB_OLDPACKAGE,
   		rpmteNEVR(p), rpmteKey(p),
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/python/header-py.c
  ============================================================================
  $ cvs diff -u -r1.64 -r1.65 header-py.c
  --- rpm/python/header-py.c	17 Oct 2007 16:53:24 -0000	1.64
  +++ rpm/python/header-py.c	17 Oct 2007 18:32:57 -0000	1.65
  @@ -173,10 +173,8 @@
           /*@modifies h @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       HAE_t hae = (HAE_t)headerAddEntry;
       HRE_t hre = (HRE_t)headerRemoveEntry;
  @@ -185,10 +183,10 @@
       /*@-branchstate@*/
       if (!headerIsEntry(h, RPMTAG_OLDFILENAMES)) {
   	he->tag = RPMTAG_FILEPATHS;
  -	xx = hge(h, he->tag, he->t, he->p, he->c);
  -	if (he_p.ptr == NULL || he_c <= 0)
  +	xx = hge(h, he->tag, &he->t, he->p, &he->c);
  +	if (he_p.ptr == NULL || he->c <= 0)
   	    return;
  -	xx = hae(h, RPMTAG_OLDFILENAMES, he_t, he_p.ptr, he_c);
  +	xx = hae(h, RPMTAG_OLDFILENAMES, he->t, he_p.ptr, he->c);
   	he_p.ptr = _free(he_p.ptr);
       }
       /*@=branchstate@*/
  @@ -207,10 +205,8 @@
   	/*@modifies h @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       HAE_t hae = (HAE_t)headerAddEntry;
       HRE_t hre = (HRE_t)headerRemoveEntry;
  @@ -235,9 +231,9 @@
       }
   
       he->tag = RPMTAG_OLDFILENAMES;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       fileNames = he_p.argv;
  -    count = he_c;
  +    count = he->c;
       if (!xx || fileNames == NULL || count <= 0)
   	return;		/* no file list */
   
  @@ -309,10 +305,8 @@
   	/*@*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       int xx;
   
  @@ -322,13 +316,13 @@
   	compressFilelist(h);
   
       he->tag = RPMTAG_FILEPATHS;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
   
  -    if (he_p.ptr == NULL || he_c <= 0)
  +    if (he_p.ptr == NULL || he->c <= 0)
   	return;
   
       /* XXX Legacy tag needs to go away. */
  -    headerAddEntry(h, RPMTAG_OLDFILENAMES, he_t, he_p.ptr, he_c);
  +    headerAddEntry(h, RPMTAG_OLDFILENAMES, he->t, he_p.ptr, he->c);
   
       he_p.ptr = _free(he_p.ptr);
   }
  @@ -343,10 +337,8 @@
   static void providePackageNVR(Header h)
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       const char *N, *V, *R;
       int_32 E;
  @@ -368,7 +360,7 @@
       pEVR = p = alloca(21 + strlen(V) + 1 + strlen(R) + 1);
       *p = '\0';
       he->tag = RPMTAG_EPOCH;
  -    gotE = hge(h, he->tag, he->t, he->p, he->c);
  +    gotE = hge(h, he->tag, &he->t, he->p, &he->c);
       E = (he_p.i32p ? *he_p.i32p : 0);
       he_p.ptr = _free(he_p.ptr);
       if (gotE) {
  @@ -382,9 +374,9 @@
        * If no provides at all are available, we can just add.
        */
       he->tag = RPMTAG_PROVIDENAME;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       provides = he_p.argv;
  -    providesCount = he_c;
  +    providesCount = he->c;
       if (!xx)
   	goto exit;
   
  @@ -392,7 +384,7 @@
        * Otherwise, fill in entries on legacy packages.
        */
       he->tag = RPMTAG_PROVIDEVERSION;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       providesEVR = he_p.argv;
       if (!xx) {
   	for (i = 0; i < providesCount; i++) {
  @@ -407,7 +399,7 @@
       }
   
       he->tag = RPMTAG_PROVIDEFLAGS;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       provideFlags = he_p.i32p;
   
       /*@-nullderef@*/	/* LCL: providesEVR is not NULL */
  @@ -712,10 +704,8 @@
   	/*@modifies *type, *p, *c @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       int xx;
   
  @@ -723,14 +713,14 @@
       case RPMTAG_OLDFILENAMES:
       {	
   	he->tag = RPMTAG_FILEPATHS;
  -	xx = hge(h, he->tag, he->t, he->p, he->c);
  +	xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	if (p)
   	    *p = he_p.ptr;
   	else
   	    he_p.ptr = _free(he_p.ptr);
  -	if (c)	*c = he_c;
  -	if (type)	*type = he_t;
  -	return (he_c > 0 ? 1 : 0);
  +	if (c)	*c = he->c;
  +	if (type)	*type = he->t;
  +	return (he->c > 0 ? 1 : 0);
       }	/*@notreached@*/ break;
   
       case RPMTAG_GROUP:
  @@ -768,10 +758,8 @@
   static PyObject * hdr_subscript(hdrObject * s, PyObject * item)
   	/*@*/
   {
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       int_32 tag = -1;
       void * data;
  @@ -814,7 +802,7 @@
               return NULL;
           }
           
  -	if (!rpmHeaderGetEntry(s->h, tag, &he_t, &data, &he_c)) {
  +	if (!rpmHeaderGetEntry(s->h, tag, &he->t, &data, &he->c)) {
   	    switch (tag) {
   	    case RPMTAG_EPOCH:
   	    case RPMTAG_NAME:
  @@ -874,17 +862,17 @@
           break;
       }
   
  -    switch (he_t) {
  +    switch (he->t) {
       case RPM_OPENPGP_TYPE:
       case RPM_ASN1_TYPE:
       case RPM_BIN_TYPE:
  -	o = PyString_FromStringAndSize(data, he_c);
  +	o = PyString_FromStringAndSize(data, he->c);
   	break;
   
       case RPM_INT64_TYPE:
  -	if (he_c != 1 || forceArray) {
  +	if (he->c != 1 || forceArray) {
   	    metao = PyList_New(0);
  -	    for (i = 0; i < he_c; i++) {
  +	    for (i = 0; i < he->c; i++) {
   		o = PyInt_FromLong(((long long *) data)[i]);
   		PyList_Append(metao, o);
   		Py_DECREF(o);
  @@ -895,9 +883,9 @@
   	}
   	break;
       case RPM_INT32_TYPE:
  -	if (he_c != 1 || forceArray) {
  +	if (he->c != 1 || forceArray) {
   	    metao = PyList_New(0);
  -	    for (i = 0; i < he_c; i++) {
  +	    for (i = 0; i < he->c; i++) {
   		o = PyInt_FromLong(((int *) data)[i]);
   		PyList_Append(metao, o);
   		Py_DECREF(o);
  @@ -910,9 +898,9 @@
   
       case RPM_CHAR_TYPE:
       case RPM_INT8_TYPE:
  -	if (he_c != 1 || forceArray) {
  +	if (he->c != 1 || forceArray) {
   	    metao = PyList_New(0);
  -	    for (i = 0; i < he_c; i++) {
  +	    for (i = 0; i < he->c; i++) {
   		o = PyInt_FromLong(((char *) data)[i]);
   		PyList_Append(metao, o);
   		Py_DECREF(o);
  @@ -924,9 +912,9 @@
   	break;
   
       case RPM_INT16_TYPE:
  -	if (he_c != 1 || forceArray) {
  +	if (he->c != 1 || forceArray) {
   	    metao = PyList_New(0);
  -	    for (i = 0; i < he_c; i++) {
  +	    for (i = 0; i < he->c; i++) {
   		o = PyInt_FromLong(((short *) data)[i]);
   		PyList_Append(metao, o);
   		Py_DECREF(o);
  @@ -941,7 +929,7 @@
   	stringArray = data;
   
   	metao = PyList_New(0);
  -	for (i = 0; i < he_c; i++) {
  +	for (i = 0; i < he->c; i++) {
   	    o = PyString_FromString(stringArray[i]);
   	    PyList_Append(metao, o);
   	    Py_DECREF(o);
  @@ -951,11 +939,11 @@
   	break;
   
       case RPM_STRING_TYPE:
  -	if (he_c != 1 || forceArray) {
  +	if (he->c != 1 || forceArray) {
   	    stringArray = data;
   
   	    metao = PyList_New(0);
  -	    for (i=0; i < he_c; i++) {
  +	    for (i=0; i < he->c; i++) {
   		o = PyString_FromString(stringArray[i]);
   		PyList_Append(metao, o);
   		Py_DECREF(o);
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/fprint.c
  ============================================================================
  $ cvs diff -u -r1.18 -r1.19 fprint.c
  --- rpm/rpmdb/fprint.c	17 Oct 2007 16:53:24 -0000	1.18
  +++ rpm/rpmdb/fprint.c	17 Oct 2007 18:32:57 -0000	1.19
  @@ -249,10 +249,8 @@
   	/*@modifies h, cache, *fpList @*/;
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       const char ** baseNames;
       const char ** dirNames;
  @@ -261,17 +259,17 @@
       int xx;
   
       he->tag = RPMTAG_BASENAMES;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);)
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       baseNames = he_p.argv;
  -    fileCount = he_c;
  +    fileCount = he->c;
       if (!xx)
   	return;
   
       he->tag = RPMTAG_DIRNAMES;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);)
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       dirNames = he_p.argv;
       he->tag = RPMTAG_DIRINDEXES;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);)
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       dirIndexes = he_p.ui32p;
   
       fpLookupList(cache, dirNames, baseNames, dirIndexes, fileCount, fpList);
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/hdrNVR.c
  ============================================================================
  $ cvs diff -u -r1.17 -r1.18 hdrNVR.c
  --- rpm/rpmdb/hdrNVR.c	17 Oct 2007 16:53:24 -0000	1.17
  +++ rpm/rpmdb/hdrNVR.c	17 Oct 2007 18:32:57 -0000	1.18
  @@ -36,10 +36,8 @@
   	/*@modifies rpmGlobalMacroContext @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       struct tagMacro * tagm;
       char numbuf[32];
  @@ -59,10 +57,10 @@
   
       for (tagm = tagMacros; tagm->macroname != NULL; tagm++) {
   	he->tag = tagm->tag;
  -	xx = hge(h, he->tag, he->t, he->p, he->c);
  +	xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	if (!xx)
   	    continue;
  -	switch (he_t) {
  +	switch (he->t) {
   	case RPM_INT32_TYPE:
   	    sprintf(numbuf, "%d", *he_p.i32p);
   	    addMacro(NULL, tagm->macroname, NULL, numbuf, -1);
  @@ -92,20 +90,18 @@
   	/*@modifies rpmGlobalMacroContext @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       struct tagMacro * tagm;
       int xx;
   
       for (tagm = tagMacros; tagm->macroname != NULL; tagm++) {
   	he->tag = tagm->tag;
  -	xx = hge(h, he->tag, he->t, he->p, he->c);
  +	xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	if (!xx)
   	    continue;
  -	switch (he_t) {
  +	switch (he->t) {
   	case RPM_INT32_TYPE:
   	    delMacro(NULL, tagm->macroname);
   	    /*@switchbreak@*/ break;
  @@ -182,19 +178,17 @@
   uint_32 hGetColor(Header h)
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       uint_32 hcolor = 0;
       int xx;
   
       he->tag = RPMTAG_FILECOLORS;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  -    if (xx && he_p.ptr != NULL && he_c > 0) {
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
  +    if (xx && he_p.ptr != NULL && he->c > 0) {
   	int i;
  -	for (i = 0; i < he_c; i++)
  +	for (i = 0; i < he->c; i++)
   	    hcolor |= he_p.ui32p[i];
       }
       he_p.ptr = _free(he_p.ptr);
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/hdrfmt.c
  ============================================================================
  $ cvs diff -u -r1.14 -r1.15 hdrfmt.c
  --- rpm/rpmdb/hdrfmt.c	17 Oct 2007 16:53:24 -0000	1.14
  +++ rpm/rpmdb/hdrfmt.c	17 Oct 2007 18:32:57 -0000	1.15
  @@ -843,13 +843,14 @@
       char ** array;
   
       he->tag = RPMTAG_INSTALLPREFIX;
  -    if (headerGetEntry(h, RPMTAG_INSTALLPREFIX, he->t, he->p, he->c)) {
  +    if (headerGetEntry(h, RPMTAG_INSTALLPREFIX, &he->t, he->p, &he->c)) {
   	he->freeData = 0;
   	return 0;
       }
       he->tag = RPMTAG_INSTPREFIXES;
  -    if (headerGetEntry(h, he->tag, &ipt, &array, he->c)) {
  -	if (he->t) *he->t = RPM_STRING_TYPE;
  +    if (headerGetEntry(h, he->tag, &ipt, &array, &he->c)) {
  +	he->t = RPM_STRING_TYPE;
  +	he->c = 1;
   	if (he->p) (*he->p).str = xstrdup(array[0]);
   	he->freeData = 1;
   	array = headerFreeData(array, ipt);
  @@ -889,10 +890,8 @@
       xx = headerGetEntry(h, RPMTAG_TRIGGERVERSION, NULL, &versions, NULL);
       xx = headerGetEntry(h, RPMTAG_TRIGGERSCRIPTS, NULL, &s, &numScripts);
   
  -    if (he->t)
  -	*he->t = RPM_STRING_ARRAY_TYPE;
  -    if (he->c)
  -	*he->c = numScripts;
  +    he->t = RPM_STRING_ARRAY_TYPE;
  +    he->c = numScripts;
       if (he->p == NULL)
   	goto exit;
   
  @@ -953,10 +952,8 @@
       xx = headerGetEntry(h, RPMTAG_TRIGGERFLAGS, NULL, &flags, NULL);
       xx = headerGetEntry(h, RPMTAG_TRIGGERSCRIPTS, NULL, &s, &numScripts);
   
  -    if (he->t)
  -	*he->t = RPM_STRING_ARRAY_TYPE;
  -    if (he->c)
  -	*he->c = numScripts;
  +    he->t = RPM_STRING_ARRAY_TYPE;
  +    he->c = numScripts;
       if (he->p == NULL)
   	goto exit;
   
  @@ -1013,12 +1010,10 @@
       char * dstring = rpmExpand(_macro_i18ndomains, NULL);
       int rc = 1;		/* assume failure */
   
  -    if (he->t)
  -	*he->t = RPM_STRING_TYPE;
  +    he->t = RPM_STRING_TYPE;
       if (he->p)
   	(*he->p).ptr = NULL;
  -    if (he->c)
  -	*he->c = 0;
  +    he->c = 0;
       he->freeData = 0;
   
       if (dstring && *dstring) {
  @@ -1073,8 +1068,7 @@
   		    he->freeData = 1;
   		} else
   		    he->freeData = 0;
  -		if (he->c)
  -		    *he->c = 1;
  +		he->c = 1;
   	    }
   	}
       }
  @@ -1085,7 +1079,7 @@
       if (!rc)
   	return rc;
   
  -    rc = headerGetEntry(h, he->tag, he->t, he->p, he->c);
  +    rc = headerGetEntry(h, he->tag, &he->t, he->p, &he->c);
       if (rc) {
   	rc = 0;
   	if (he->p) {
  @@ -1098,14 +1092,12 @@
   /*@=nullstate@*/
       }
   
  -    if (he->t)
  -	*he->t = RPM_STRING_TYPE;
  +    he->t = RPM_STRING_TYPE;
  +    he->c = 0;
       if (he->p) {
   	(*he->p).ptr = NULL;
   	he->freeData = 0;
       }
  -    if (he->c)
  -	*he->c = 0;
       return 1;
   }
   
  @@ -1124,8 +1116,7 @@
       if (!rc || d == NULL || c == 0) {
   	if (he->p)
   	    (*he->p).ptr = NULL;
  -	if (he->c)
  -	    *he->c = 0;
  +	he->c = 0;
   	he->freeData = 0;
   	return 1;
       }
  @@ -1156,12 +1147,10 @@
       } else
   	he->freeData = 0;
   
  -    if (he->t)
  -	*he->t = t;
  +    he->t = t;
       if (he->p)
   	(*he->p).ptr = (void **)d;
  -    if (he->c)
  -	*he->c = c;
  +    he->c = c;
       return 0;
   }
   
  @@ -1235,16 +1224,14 @@
   		fileSystem, internalState @*/
   {
       he->tag = RPMTAG_DBINSTANCE;
  -    if (he->t)
  -	*he->t = RPM_INT32_TYPE;
  +    he->t = RPM_INT32_TYPE;
       if (he->p) {
   	(*he->p).i32p = xcalloc(1, sizeof(*(*he->p).i32p));
   	(*he->p).i32p[0] = headerGetInstance(h);
   	he->freeData = 1;
       } else
   	he->freeData = 0;
  -    if (he->c)
  -	*he->c = 1;
  +    he->c = 1;
   
       return 0;
   }
  @@ -1294,9 +1281,9 @@
   	/*@modifies h, he, rpmGlobalMacroContext,
   		fileSystem, internalState @*/
   {
  -    if (he->t) *he->t = RPM_STRING_TYPE;
  +    he->t = RPM_STRING_TYPE;
       if (he->p) (*he->p).str = hGetNVRA(h);
  -    if (he->c) *he->c = 1;
  +    he->c = 1;
       he->freeData = 1;
       return 0;
   }
  @@ -1388,8 +1375,8 @@
   static int _fnTag(Header h, HE_t he)
   	/*@modifies he @*/
   {
  -    if (he->t) *he->t = RPM_STRING_ARRAY_TYPE;
  -    rpmfiBuildFNames(h, he->tag, (he->p ? &(*he->p).argv : NULL), he->c);
  +    he->t = RPM_STRING_ARRAY_TYPE;
  +    rpmfiBuildFNames(h, he->tag, (he->p ? &(*he->p).argv : NULL), &he->c);
       he->freeData = 1;
       return 0;
   }
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/header.c
  ============================================================================
  $ cvs diff -u -r1.85 -r1.86 header.c
  --- rpm/rpmdb/header.c	17 Oct 2007 00:32:26 -0000	1.85
  +++ rpm/rpmdb/header.c	17 Oct 2007 18:32:57 -0000	1.86
  @@ -1819,9 +1819,7 @@
       const char * name = tagName(tag);
       headerSprintfExtension exts = (headerSprintfExtension)headerCompoundFormats;
       headerSprintfExtension ext;
  -    rpmTagType he_t = 0;
       hRET_t he_p = { .ptr = NULL };
  -    int_32 he_c = 0;
       HE_t he = alloca(sizeof(*he));
       size_t nb = 0;
       int extNum;
  @@ -1833,11 +1831,9 @@
       memset(&he_p, 0, sizeof(he_p));
       memset(he, 0, sizeof(*he));
       he->tag = tag;
  -    he->t = &he_t;
   /*@-immediatetrans@*/
       he->p = (p ? &he_p : NULL);
   /*@=immediatetrans@*/
  -    he->c = &he_c;
   
       /* Search extensions for specific tag override. */
       for (ext = exts, extNum = 0; ext != NULL && ext->type != HEADER_EXT_LAST;
  @@ -1852,12 +1848,12 @@
       if (ext && ext->name != NULL && ext->type == HEADER_EXT_TAG)
   	rc = ext->u.tagFunction(h, he);
       else
  -	rc = intGetEntry(h, he->tag, he->t, he->p, he->c, 0);
  +	rc = intGetEntry(h, he->tag, &he->t, he->p, &he->c, 0);
   
       if (!rc)
   	goto exit;
   
  -    switch (*he->t) {
  +    switch (he->t) {
       case RPM_NULL_TYPE:
       default:
   assert(0);	/* XXX stop unimplemented oversights. */
  @@ -1869,16 +1865,16 @@
   	/*@fallthrough@*/
       case RPM_CHAR_TYPE:
       case RPM_INT8_TYPE:
  -	nb = he_c * sizeof(*he_p.i8p);
  +	nb = he->c * sizeof(*he_p.i8p);
   	break;
       case RPM_INT16_TYPE:
  -	nb = he_c * sizeof(*he_p.i16p);
  +	nb = he->c * sizeof(*he_p.i16p);
   	break;
       case RPM_INT32_TYPE:
  -	nb = he_c * sizeof(*he_p.i32p);
  +	nb = he->c * sizeof(*he_p.i32p);
   	break;
       case RPM_INT64_TYPE:
  -	nb = he_c * sizeof(*he_p.i64p);
  +	nb = he->c * sizeof(*he_p.i64p);
   	break;
       case RPM_I18NSTRING_TYPE:
       case RPM_STRING_TYPE:
  @@ -1899,11 +1895,11 @@
   
   exit:
       if (type)
  -	*type = *he->t;
  +	*type = he->t;
       if (p)
   	p->ptr = he_p.ptr;
       if (c)
  -	*c = *he->c;
  +	*c = he->c;
   
       if (sw != NULL)	(void) rpmswExit(sw, 0);
   
  @@ -3167,16 +3163,21 @@
       if (!ec->avail) {
   	HE_s he_s;
   	HE_t he = &he_s;
  +	int xx;
  +
   	he->tag = 0;
   /*@-immediatetrans@*/
  -	he->t = &ec->type;
  +	he->t = 0;
   /*@-type@*/
   	he->p = &ec->data;
   /*@=type@*/
  -	he->c = &ec->count;
  +	he->c = 0;
   /*@=immediatetrans@*/
   	he->freeData = 0;
  -	if (fn(hsa->h, he))
  +	xx = fn(hsa->h, he);
  +	ec->type = he->t;
  +	ec->count = he->c;
  +	if (xx)
   	    return 1;
   	ec->freeit = he->freeData;
   	ec->avail = 1;
  @@ -3200,10 +3201,8 @@
   static char * formatValue(headerSprintfArgs hsa, sprintfTag tag, int element)
   	/*@modifies hsa @*/
   {
  -    rpmTagType he_t = 0;
       hRET_t he_p = { .ptr = NULL };
  -    int_32 he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       char * val = NULL;
       size_t need = 0;
  @@ -3216,25 +3215,25 @@
   
       memset(buf, 0, sizeof(buf));
       if (tag->ext) {
  -	if (getExtension(hsa, tag->ext, he->t, he->p, he->c, hsa->ec + tag->extNum))
  +	if (getExtension(hsa, tag->ext, &he->t, he->p, &he->c, hsa->ec + tag->extNum))
   	{
  -	    he_c = 1;
  -	    he_t = RPM_STRING_TYPE;	
  +	    he->c = 1;
  +	    he->t = RPM_STRING_TYPE;	
   	    he_p.str = "(none)";
   	}
       } else {
  -	if (!headerGetEntry(hsa->h, tag->tag, he->t, he->p, he->c)) {
  -	    he_c = 1;
  -	    he_t = RPM_STRING_TYPE;	
  +	if (!headerGetEntry(hsa->h, tag->tag, &he->t, he->p, &he->c)) {
  +	    he->c = 1;
  +	    he->t = RPM_STRING_TYPE;	
   	    he_p.str = "(none)";
   	}
   
   	/* XXX this test is unnecessary, array sizes are checked */
  -	switch (he_t) {
  +	switch (he->t) {
   	default:
  -	    if (element >= he_c) {
  +	    if (element >= he->c) {
   		/*@-modobserver -observertrans@*/
  -		he_p.ptr = headerFreeData(he_p.ptr, he_t);
  +		he_p.ptr = headerFreeData(he_p.ptr, he->t);
   		/*@=modobserver =observertrans@*/
   
   		hsa->errmsg = _("(index out of range)");
  @@ -3253,26 +3252,26 @@
       if (tag->arrayCount) {
   /*@-modobserver -observertrans@*/
   	if (he->freeData) {
  -	    he_p.ptr = headerFreeData(he_p.ptr, he_t);
  +	    he_p.ptr = headerFreeData(he_p.ptr, he->t);
   	    he->freeData = 0;
   	}
   /*@=modobserver =observertrans@*/
   
  -	countBuf = he_c;
  +	countBuf = he->c;
   	he_p.i32p = &countBuf;
  -	he_c = 1;
  -	he_t = RPM_INT32_TYPE;
  +	he->c = 1;
  +	he->t = RPM_INT32_TYPE;
       }
   
       (void) stpcpy( stpcpy(buf, "%"), tag->format);
   
       if (he_p.ptr)
  -    switch (he_t) {
  +    switch (he->t) {
       case RPM_STRING_ARRAY_TYPE:
   	strarray.argv = he_p.argv;
   
   	if (tag->fmt)
  -	    val = tag->fmt(RPM_STRING_TYPE, (hPTR_t) strarray.argv[element], buf, tag->pad, (he_c > 1 ? element : -1));	/* NOCAST */
  +	    val = tag->fmt(RPM_STRING_TYPE, (hPTR_t) strarray.argv[element], buf, tag->pad, (he->c > 1 ? element : -1));	/* NOCAST */
   
   	if (val) {
   	    need = strlen(val);
  @@ -3306,7 +3305,7 @@
       case RPM_INT64_TYPE:
   	llVal = he_p.i64p[element];
   	if (tag->fmt)
  -	    val = tag->fmt(RPM_INT64_TYPE, (hPTR_t) &llVal, buf, tag->pad, (he_c > 1 ? element : -1));	/* NOCAST */
  +	    val = tag->fmt(RPM_INT64_TYPE, (hPTR_t) &llVal, buf, tag->pad, (he->c > 1 ? element : -1));	/* NOCAST */
   	if (val) {
   	    need = strlen(val);
   	} else {
  @@ -3323,7 +3322,7 @@
       case RPM_INT8_TYPE:
       case RPM_INT16_TYPE:
       case RPM_INT32_TYPE:
  -	switch (he_t) {
  +	switch (he->t) {
   	case RPM_CHAR_TYPE:	
   	case RPM_INT8_TYPE:
   	    intVal = he_p.i8p[element];
  @@ -3338,7 +3337,7 @@
   	}
   
   	if (tag->fmt)
  -	    val = tag->fmt(RPM_INT32_TYPE, (hPTR_t) &intVal, buf, tag->pad, (he_c > 1 ? element : -1)); /* NOCAST */
  +	    val = tag->fmt(RPM_INT32_TYPE, (hPTR_t) &intVal, buf, tag->pad, (he->c > 1 ? element : -1)); /* NOCAST */
   
   	if (val) {
   	    need = strlen(val);
  @@ -3357,21 +3356,21 @@
       case RPM_BIN_TYPE:
   	/* XXX HACK ALERT: element field abused as no. bytes of binary data. */
   	if (tag->fmt)
  -	    val = tag->fmt(RPM_BIN_TYPE, he_p.ptr, buf, tag->pad, he_c);
  +	    val = tag->fmt(RPM_BIN_TYPE, he_p.ptr, buf, tag->pad, he->c);
   
   	if (val) {
   	    need = strlen(val);
   	} else {
   #ifdef	NOTYET
  -	    val = memcpy(xmalloc(he_c), he_p.ptr, he_c);
  +	    val = memcpy(xmalloc(he->c), he_p.ptr, he->c);
   #else
   	    /* XXX format string not used */
   	    static char hex[] = "0123456789abcdef";
   	    const char * s = he_p.str;
   
  -	    need = 2*he_c + tag->pad;
  +	    need = 2 * he->c + tag->pad;
   	    val = t = xmalloc(need+1);
  -	    while (he_c-- > 0) {
  +	    while (he->c-- > 0) {
   		unsigned int i;
   		i = *s++;
   		*t++ = hex[ (i >> 4) & 0xf ];
  @@ -3390,7 +3389,7 @@
   
   /*@-modobserver -observertrans@*/
       if (he->freeData) {
  -	he_p.ptr = headerFreeData(he_p.ptr, he_t);
  +	he_p.ptr = headerFreeData(he_p.ptr, he->t);
   	he->freeData = 0;
       }
   /*@=modobserver =observertrans@*/
  @@ -3417,10 +3416,8 @@
   		int element)
   	/*@modifies hsa @*/
   {
  -    rpmTagType he_t = 0;
       hRET_t he_p = { .ptr = NULL };
  -    int_32 he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       char numbuf[64];	/* XXX big enuf for "Tag_0x01234567" */
       char * t, * te;
  @@ -3482,19 +3479,19 @@
   		spft->u.tag.justOne) continue;
   
   	    if (spft->u.tag.ext) {
  -		if (getExtension(hsa, spft->u.tag.ext, he->t, NULL, he->c, 
  +		if (getExtension(hsa, spft->u.tag.ext, &he->t, NULL, &he->c, 
   				 hsa->ec + spft->u.tag.extNum))
   		     continue;
   	    } else {
  -		if (!headerGetEntry(hsa->h, spft->u.tag.tag, he->t, NULL, he->c))
  +		if (!headerGetEntry(hsa->h, spft->u.tag.tag, &he->t, NULL, &he->c))
   		    continue;
   	    } 
   
  -	    if (he_t == RPM_BIN_TYPE || he_t == RPM_ASN1_TYPE || he_t == RPM_OPENPGP_TYPE)
  -		he_c = 1;	/* XXX count abused as no. of bytes. */
  +	    if (he->t == RPM_BIN_TYPE || he->t == RPM_ASN1_TYPE || he->t == RPM_OPENPGP_TYPE)
  +		he->c = 1;	/* XXX count abused as no. of bytes. */
   
  -	    if (numElements > 1 && he_c != numElements)
  -	    switch (he_t) {
  +	    if (numElements > 1 && he->c != numElements)
  +	    switch (he->t) {
   	    default:
   		hsa->errmsg =
   			_("array iterator used with different sized arrays");
  @@ -3506,8 +3503,8 @@
   	    case RPM_STRING_TYPE:
   		/*@switchbreak@*/ break;
   	    }
  -	    if (he_c > numElements)
  -		numElements = he_c;
  +	    if (he->c > numElements)
  +		numElements = he->c;
   	}
   
   	if (numElements == -1) {
  @@ -3674,10 +3671,8 @@
   	/*@requires maxSet(errmsg) >= 0 @*/
   {
       headerSprintfArgs hsa = memset(alloca(sizeof(*hsa)), 0, sizeof(*hsa));
  -    rpmTagType he_t = 0;
       hRET_t he_p = { .ptr = NULL };
  -    int_32 he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       sprintfToken nextfmt;
       sprintfTag tag;
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/header.h
  ============================================================================
  $ cvs diff -u -r1.39 -r1.40 header.h
  --- rpm/rpmdb/header.h	17 Oct 2007 16:53:24 -0000	1.39
  +++ rpm/rpmdb/header.h	17 Oct 2007 18:32:57 -0000	1.40
  @@ -131,6 +131,27 @@
   typedef enum rpmTag_e rpmTag;
   
   /** \ingroup header
  + * The basic types of data in tags from headers.
  + */
  +enum rpmTagType_e {
  +    RPM_NULL_TYPE		=  0,
  +    RPM_CHAR_TYPE		=  1,
  +    RPM_INT8_TYPE		=  2,
  +    RPM_INT16_TYPE		=  3,
  +    RPM_INT32_TYPE		=  4,
  +    RPM_INT64_TYPE		=  5,
  +    RPM_STRING_TYPE		=  6,
  +    RPM_BIN_TYPE		=  7,
  +    RPM_STRING_ARRAY_TYPE	=  8,
  +    RPM_I18NSTRING_TYPE		=  9,
  +    RPM_ASN1_TYPE		= 10,
  +    RPM_OPENPGP_TYPE		= 11,
  +    RPM_MASK_TYPE		= 0x0000ffff
  +};
  +#define	RPM_MIN_TYPE		0
  +#define	RPM_MAX_TYPE		11
  +
  +/** \ingroup header
    */
   typedef enum rpmTagType_e rpmTagType;
   
  @@ -156,11 +177,11 @@
   struct _HE_s {
       int_32 tag;
   /*@null@*/
  -    hTYP_t t;
  +    rpmTagType t;
   /*@null@*/
       hRET_t * p;
   /*@null@*/
  -    hCNT_t c;
  +    rpmTagCount c;
       int freeData;
   };
   typedef struct _HE_s HE_s;
  @@ -288,27 +309,6 @@
   /*@=redecl@*/
   
   /** \ingroup header
  - * The basic types of data in tags from headers.
  - */
  -enum rpmTagType_e {
  -    RPM_NULL_TYPE		=  0,
  -    RPM_CHAR_TYPE		=  1,
  -    RPM_INT8_TYPE		=  2,
  -    RPM_INT16_TYPE		=  3,
  -    RPM_INT32_TYPE		=  4,
  -    RPM_INT64_TYPE		=  5,
  -    RPM_STRING_TYPE		=  6,
  -    RPM_BIN_TYPE		=  7,
  -    RPM_STRING_ARRAY_TYPE	=  8,
  -    RPM_I18NSTRING_TYPE		=  9,
  -    RPM_ASN1_TYPE		= 10,
  -    RPM_OPENPGP_TYPE		= 11,
  -    RPM_MASK_TYPE		= 0x0000ffff
  -};
  -#define	RPM_MIN_TYPE		0
  -#define	RPM_MAX_TYPE		11
  -
  -/** \ingroup header
    * New rpm data types under consideration/development.
    * These data types may (or may not) be added to rpm at some point. In order
    * to avoid incompatibility with legacy versions of rpm, these data (sub-)types
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/pkgio.c
  ============================================================================
  $ cvs diff -u -r1.18 -r1.19 pkgio.c
  --- rpm/rpmdb/pkgio.c	17 Oct 2007 16:53:24 -0000	1.18
  +++ rpm/rpmdb/pkgio.c	17 Oct 2007 18:32:57 -0000	1.19
  @@ -74,10 +74,8 @@
   rpmRC rpmtsFindPubkey(rpmts ts, void * _dig)
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       pgpDig dig = (_dig ? _dig : rpmtsDig(ts));
       const void * sig = pgpGetSig(dig);
  @@ -156,12 +154,12 @@
   	he->tag = RPMTAG_PUBKEYS;
   	mi = rpmdbInitIterator(rpmtsGetRdb(ts), RPMTAG_PUBKEYS, sigp->signid, sizeof(sigp->signid));
   	while ((h = rpmdbNextIterator(mi)) != NULL) {
  -	    if (!hge(h, he->tag, he->t, he->p, he->c))
  +	    if (!hge(h, he->tag, &he->t, he->p, &he->c))
   		continue;
   	    hx = rpmdbGetIteratorOffset(mi);
   	    ix = rpmdbGetIteratorFileNum(mi);
   /*@-moduncon -nullstate @*/
  -	    if (ix >= he_c
  +	    if (ix >= he->c
   	     || b64decode(he_p.argv[ix], (void **) &ts->pkpkt, &ts->pkpktlen))
   		ix = -1;
   /*@=moduncon =nullstate @*/
  @@ -541,10 +539,8 @@
   	/*@modifies *ptr, *msg, fileSystem @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       Header * sighp = ptr;
       char buf[BUFSIZ];
  @@ -712,7 +708,7 @@
   	/* Print package component sizes. */
   
   	he->tag = RPMSIGTAG_SIZE;
  -	xx = hge(sigh, he->tag, he->t, he->p, he->c);
  +	xx = hge(sigh, he->tag, &he->t, he->p, &he->c);
   	if (xx) {
   	    size_t datasize = *he_p.ui32p;
   	    rc = printSize(fd, sigSize, pad, datasize);
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/rpmdb.c
  ============================================================================
  $ cvs diff -u -r1.189 -r1.190 rpmdb.c
  --- rpm/rpmdb/rpmdb.c	17 Oct 2007 16:53:24 -0000	1.189
  +++ rpm/rpmdb/rpmdb.c	17 Oct 2007 18:32:57 -0000	1.190
  @@ -860,10 +860,8 @@
   		fileSystem, internalState @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       const char * fn = NULL;
       int xx;
  @@ -884,7 +882,7 @@
   	    xx = Fclose(fd);
   	    fd = NULL;
   	    he->tag = RPMTAG_INSTALLTID;
  -	    if (hge(h, he->tag, he->t, he->p, he->c)) {
  +	    if (hge(h, he->tag, &he->t, he->p, &he->c)) {
   		struct utimbuf stamp;
   		stamp.actime = *he_p.i32p;
   		stamp.modtime = *he_p.i32p;
  @@ -1410,10 +1408,8 @@
   	/*@requires maxSet(matches) >= 0 @*/
   {
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       const char * dirName;
       const char * baseName;
  @@ -1514,13 +1510,13 @@
   	}
   
   	he->tag = RPMTAG_BASENAMES;
  -	xx = hge(h, he->tag, he->t, he->p, he->c);
  +	xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	baseNames = he_p.argv;
   	he->tag = RPMTAG_DIRNAMES;
  -	xx = hge(h, he->tag, he->t, he->p, he->c);
  +	xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	dirNames = he_p.argv;
   	he->tag = RPMTAG_DIRINDEXES;
  -	xx = hge(h, he->tag, he->t, he->p, he->c);
  +	xx = hge(h, he->tag, &he->t, he->p, &he->c);
   	dirIndexes = he_p.ui32p;
   
   	do {
  @@ -2154,10 +2150,8 @@
   	/*@modifies mi->mi_re @*/
   {
       HGE_t hge = (HGE_t) headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       char numbuf[32];
       miRE mire;
  @@ -2181,19 +2175,19 @@
   
   	he->tag = mire->tag;
   
  -	if (!hge(mi->mi_h, he->tag, he->t, he->p, he->c)) {
  +	if (!hge(mi->mi_h, he->tag, &he->t, he->p, &he->c)) {
   	    if (he->tag != RPMTAG_EPOCH) {
   		ntags++;
   		continue;
   	    }
  -	    he_t = RPM_INT32_TYPE;
  -	    he_c = 1;
  -	    he_p.i32p = xcalloc(he_c, sizeof(*he_p.i32p));
  +	    he->t = RPM_INT32_TYPE;
  +	    he->c = 1;
  +	    he_p.i32p = xcalloc(he->c, sizeof(*he_p.i32p));
   	}
   
   	anymatch = 0;		/* no matches yet */
   	while (1) {
  -	    switch (he_t) {
  +	    switch (he->t) {
   	    case RPM_CHAR_TYPE:
   	    case RPM_INT8_TYPE:
   		sprintf(numbuf, "%d", (int) *he_p.i8p);
  @@ -2220,7 +2214,7 @@
   		    anymatch++;
   		/*@switchbreak@*/ break;
   	    case RPM_STRING_ARRAY_TYPE:
  -		for (j = 0; j < he_c; j++) {
  +		for (j = 0; j < he->c; j++) {
   		    rc = mireRegexec(mire, he_p.argv[j]);
   		    if ((!rc && !mire->notmatch) || (rc && mire->notmatch)) {
   			anymatch++;
  @@ -2229,7 +2223,7 @@
   		}
   		/*@switchbreak@*/ break;
   	    case RPM_BIN_TYPE:
  -	    {   const char * s = bin2hex(he_p.ptr, he_c);
  +	    {   const char * s = bin2hex(he_p.ptr, he->c);
   		rc = mireRegexec(mire, s);
   		if ((!rc && !mire->notmatch) || (rc && mire->notmatch))
   		    anymatch++;
  @@ -2785,10 +2779,8 @@
   DBT * data = alloca(sizeof(*data));
   union _dbswap mi_offset;
       HGE_t hge = (HGE_t)headerGetExtension;
  -    rpmTagType he_t = 0;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c = 0;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       Header h;
       sigset_t signalMask;
  @@ -2825,7 +2817,7 @@
   #endif
   
       he->tag = RPMTAG_NVRA;
  -    xx = hge(h, he->tag, he->t, he->p, he->c);
  +    xx = hge(h, he->tag, &he->t, he->p, &he->c);
       rpmlog(RPMLOG_DEBUG, "  --- h#%8u %s\n", hdrNum, he_p.str);
       he_p.ptr = _free(he_p.ptr);
   
  @@ -2843,9 +2835,9 @@
   
   	    dbi = NULL;
   	    he->tag = db->db_tagn[dbix];
  -	    he_t = 0;
  +	    he->t = 0;
   	    he_p.ptr = NULL;
  -	    he_c = 0;
  +	    he->c = 0;
   
   	    switch (he->tag) {
   	    /* Filter out temporary databases */
  @@ -2885,7 +2877,7 @@
   		continue;
   		/*@notreached@*/ /*@switchbreak@*/ break;
   	    default:
  -		if (!hge(h, he->tag, he->t, he->p, he->c))
  +		if (!hge(h, he->tag, &he->t, he->p, &he->c))
   		    continue;
   		/*@switchbreak@*/ break;
   
  @@ -2896,19 +2888,19 @@
   	    int printed;
   
   	    /* XXX Coerce strings into header argv return. */
  -	    if (he_t == RPM_STRING_TYPE) {
  +	    if (he->t == RPM_STRING_TYPE) {
   		const char * s = he_p.str;
   		char * t;
   		he_p.argv = xcalloc(1, sizeof(*he_p.argv)+strlen(s)+1);
   		he_p.argv[0] = t = (char *) &he_p.argv[1];
   		(void) strcpy(t, s);
   		s = _free(s);
  -		he_c = 1;
  +		he->c = 1;
   	    }
   
   	    printed = 0;
   	    xx = dbiCopen(dbi, dbi->dbi_txnid, &dbcursor, DB_WRITECURSOR);
  -	    for (i = 0; i < he_c; i++) {
  +	    for (i = 0; i < he->c; i++) {
   		dbiIndexSet set;
   		int stringvalued;
   
  @@ -2925,7 +2917,7 @@
   
   		/* Identify value pointer and length. */
   		stringvalued = 0;
  -		switch (he_t) {
  +		switch (he->t) {
   		case RPM_NULL_TYPE:		/* XXX never occurs. */
   assert(0);
   		    /*@switchbreak@*/ break;
  @@ -2949,13 +2941,13 @@
   		case RPM_OPENPGP_TYPE:
   		case RPM_ASN1_TYPE:
   		case RPM_BIN_TYPE:
  -		    key->size = he_c;
  +		    key->size = he->c;
   /*@i@*/		    key->data = he_p.ptr;
  -		    he_c = 1;		/* XXX break out of loop. */
  +		    he->c = 1;		/* XXX break out of loop. */
   		    /*@switchbreak@*/ break;
   		case RPM_I18NSTRING_TYPE:	/* XXX never occurs. */
   		case RPM_STRING_TYPE:
  -		    he_c = 1;		/* XXX break out of loop. */
  +		    he->c = 1;		/* XXX break out of loop. */
   		    /*@fallthrough@*/
   		case RPM_STRING_ARRAY_TYPE:
   		    /* Convert from hex to binary. */
  @@ -2992,14 +2984,14 @@
   		}
   
   		if (!printed) {
  -		    if (he_c == 1 && stringvalued) {
  +		    if (he->c == 1 && stringvalued) {
   			rpmlog(RPMLOG_DEBUG,
   				D_("removing \"%s\" from %s index.\n"),
   				(char *)key->data, tagName(dbi->dbi_rpmtag));
   		    } else {
   			rpmlog(RPMLOG_DEBUG,
   				D_("removing %d entries from %s index.\n"),
  -				he_c, tagName(dbi->dbi_rpmtag));
  +				he->c, tagName(dbi->dbi_rpmtag));
   		    }
   		    printed++;
   		}
  @@ -3074,9 +3066,9 @@
   	  }
   
   	    he->tag = 0;
  -	    he_t = 0;
  +	    he->t = 0;
   	    he_p.ptr = _free(he_p.ptr);
  -	    he_c = 0;
  +	    he->c = 0;
   	    bin = _free(bin);
   	}
   
  @@ -3100,10 +3092,8 @@
   DBT * data = alloca(sizeof(*data));
       HGE_t hge = (HGE_t) headerGetExtension;
       HAE_t hae = (HAE_t) headerAddEntry;
  -    rpmTagType he_t;
       rpmTagData he_p = { .ptr = NULL };
  -    rpmTagCount he_c;
  -    HE_s he_s = { .tag = 0, .t = &he_t, .p = &he_p, .c = &he_c, .freeData = 0 };
  +    HE_s he_s = { .tag = 0, .t = 0, .p = &he_p, .c = 0, .freeData = 0 };
       HE_t he = &he_s;
       sigset_t signalMask;
   #if defined(SUPPORT_RPMV3_BASENAMES_HACKS)
  @@ -3136,21 +3126,21 @@
       if (iid != 0 && iid != -1) {
   	int_32 tid = iid;
   	he->tag = RPMTAG_INSTALLTID;
  -	he_t = RPM_INT32_TYPE;
  +	he->t = RPM_INT32_TYPE;
   	he_p.i32p = &tid;
  -	he_c = 1;
  +	he->c = 1;
   	if (!headerIsEntry(h, he->tag))
  -	   xx = hae(h, he->tag, he_t, he_p, he_c);
  +	   xx = hae(h, he->tag, he->t, he_p, he->c);
       }
   
       /* Add the package color if not present. */
       if (!headerIsEntry(h, RPMTAG_PACKAGECOLOR)) {
   	uint32_t hcolor = hGetColor(h);
   	he->tag = RPMTAG_PACKAGECOLOR;
  -	he_t = RPM_INT32_TYPE;
  +	he->t = RPM_INT32_TYPE;
   	he_p.ui32p = &hcolor;
  -	he_c = 1;
  -	xx = hae(h, he->