RPM Community Forums

Mailing List Message of <rpm-cvs>

[CVS] RPM: rpm/ CHANGES rpm/rpmdb/ hdrfmt.c header.c header.h

From: Jeff Johnson <jbj@rpm5.org>
Date: Fri 19 Oct 2007 - 18:49:35 CEST
Message-Id: <20071019164935.8E9CA348467@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:   19-Oct-2007 18:49:35
  Branch: HEAD                             Handle: 2007101917493400

  Modified files:
    rpm                     CHANGES
    rpm/rpmdb               hdrfmt.c header.c header.h

  Log:
    - hmmm, --yaml is b0rken atm, todo++;
    - add assert's to control tag container values.
    - teach formatValue() to create an element tag container.
    - change the common integer format from int_32 to int_64 everywhere.
    - teach intFormat() to handle strings.
    - add he->ix, eliminate the less egregious he->freeData overload hack.

  Summary:
    Revision    Changes     Path
    1.1732      +6  -0      rpm/CHANGES
    1.21        +61 -38     rpm/rpmdb/hdrfmt.c
    1.93        +89 -67     rpm/rpmdb/header.c
    1.47        +1  -0      rpm/rpmdb/header.h
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.1731 -r1.1732 CHANGES
  --- rpm/CHANGES	19 Oct 2007 00:36:42 -0000	1.1731
  +++ rpm/CHANGES	19 Oct 2007 16:49:34 -0000	1.1732
  @@ -1,4 +1,10 @@
   4.5 -> 5.0:
  +    - jbj: hmmm, --yaml is b0rken atm, todo++;
  +    - jbj: add assert's to control tag container values.
  +    - jbj: teach formatValue() to create an element tag container.
  +    - jbj: change the common integer format from int_32 to int_64 everywhere.
  +    - jbj: teach intFormat() to handle strings.
  +    - jbj: add he->ix, eliminate the less egregious he->freeData overload hack.
       - jbj: remove useless HE_t indirection with (*he->p).ptr, he->p.ptr instead.
       - jbj: fix several indirection problems.
       - jbj: eliminate data arg in (*headerTagFormatFunction).
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/hdrfmt.c
  ============================================================================
  $ cvs diff -u -r1.20 -r1.21 hdrfmt.c
  --- rpm/rpmdb/hdrfmt.c	19 Oct 2007 00:36:47 -0000	1.20
  +++ rpm/rpmdb/hdrfmt.c	19 Oct 2007 16:49:34 -0000	1.21
  @@ -79,21 +79,25 @@
   		/*@unused@*/ char * formatPrefix, /*@unused@*/ int padding)
   {
       rpmTagData data = { .ptr = he->p.ptr };
  -    const int_32 * item = data.i32p;
  +    int ix = (he->ix > 0 ? he->ix : 0);
       char * val;
   
  -    if (he->t != RPM_INT32_TYPE)
  +assert(ix == 0);
  +    if (he->t != RPM_INT64_TYPE)
   	val = xstrdup(_("(invalid type)"));
  -    else if (*item & RPMSENSE_TRIGGERPREIN)
  -	val = xstrdup("prein");
  -    else if (*item & RPMSENSE_TRIGGERIN)
  -	val = xstrdup("in");
  -    else if (*item & RPMSENSE_TRIGGERUN)
  -	val = xstrdup("un");
  -    else if (*item & RPMSENSE_TRIGGERPOSTUN)
  -	val = xstrdup("postun");
  -    else
  -	val = xstrdup("");
  +    else {
  +	int anint = data.i64p[ix];
  +	if (anint & RPMSENSE_TRIGGERPREIN)
  +	    val = xstrdup("prein");
  +	else if (anint & RPMSENSE_TRIGGERIN)
  +	    val = xstrdup("in");
  +	else if (anint & RPMSENSE_TRIGGERUN)
  +	    val = xstrdup("un");
  +	else if (anint & RPMSENSE_TRIGGERPOSTUN)
  +	    val = xstrdup("postun");
  +	else
  +	    val = xstrdup("");
  +    }
       return val;
   }
   
  @@ -109,16 +113,18 @@
   	/*@modifies formatPrefix @*/
   	/*@requires maxRead(data) >= 0 @*/
   {
  -    rpmTagData data = { .ptr = he->p.ptr };
  +    int ix = (he->ix > 0 ? he->ix : 0);
       char * val;
       char * buf;
   
  -    if (he->t != RPM_INT32_TYPE) {
  +assert(ix == 0);
  +    if (he->t != RPM_INT64_TYPE) {
   	val = xstrdup(_("(invalid type)"));
       } else {
  +	int_32 anint = he->p.i64p[0];
   	val = xmalloc(15 + padding);
   	strcat(formatPrefix, "s");
  -	buf = rpmPermsString(data.i32p[0]);
  +	buf = rpmPermsString(anint);
   	/*@-formatconst@*/
   	sprintf(val, formatPrefix, buf);
   	/*@=formatconst@*/
  @@ -141,17 +147,15 @@
   	/*@requires maxRead(data) >= 0 @*/
   {
       rpmTagData data = { .ptr = he->p.ptr };
  -    /* XXX HACK: he->freeData for element index. */
  -    int element = he->freeData;
  +    int ix = (he->ix >= 0 ? he->ix : 0);
       char * val;
       char buf[15];
  -    int anint;
   
  -assert(element >= 0);
  -    anint = data.i32p[element];
  -    if (he->t != RPM_INT32_TYPE) {
  +assert(ix == 0);
  +    if (he->t != RPM_INT64_TYPE) {
   	val = xstrdup(_("(invalid type)"));
       } else {
  +	unsigned anint = data.i64p[ix];
   	buf[0] = '\0';
   	if (anint & RPMFILE_DOC)
   	    strcat(buf, "d");
  @@ -193,12 +197,14 @@
   	/*@*/
   {
       rpmTagData data = { .ptr = he->p.ptr };
  +    int ix = (he->ix > 0 ? he->ix : 0);
       const char * enc;
       const unsigned char * s;
       size_t ns;
       int atype;
       char * val;
   
  +assert(ix == 0);
       switch (he->t) {
       case RPM_OPENPGP_TYPE:
       case RPM_ASN1_TYPE:		/* XXX WRONG */
  @@ -250,8 +256,10 @@
   	/*@*/
   {
       rpmTagData data = { .ptr = he->p.ptr };
  +    int ix = (he->ix > 0 ? he->ix : 0);
       char * val;
   
  +assert(ix == 0);
       if (!(he->t == RPM_BIN_TYPE || he->t == RPM_ASN1_TYPE || he->t == RPM_OPENPGP_TYPE)) {
   	val = xstrdup(_("(not a blob)"));
       } else {
  @@ -351,6 +359,7 @@
   	/*@modifies formatPrefix @*/
   {
       rpmTagData data = { .ptr = he->p.ptr };
  +    int ix = (he->ix > 0 ? he->ix : 0);
       const char * xtag = NULL;
       size_t nb;
       char * val;
  @@ -360,7 +369,17 @@
       int freeit = 0;
       int xx;
   
  +assert(ix == 0);
  +assert(he->t == RPM_STRING_TYPE || he->t == RPM_INT64_TYPE || he->t == RPM_BIN_TYPE);
       switch (he->t) {
  +    case RPM_STRING_ARRAY_TYPE:
  +	s = data.argv[ix];
  +	xtag = "string";
  +	/* XXX Force utf8 strings. */
  +	s = xstrdup(s);
  +	s = xstrtolocale(s);
  +	freeit = 1;
  +	break;
       case RPM_I18NSTRING_TYPE:
       case RPM_STRING_TYPE:
   	s = data.str;
  @@ -386,19 +405,18 @@
   /*@=globs =mods@*/
       case RPM_CHAR_TYPE:
       case RPM_INT8_TYPE:
  -	anint = data.i8p[0];
  +	anint = data.i8p[ix];
   	break;
       case RPM_INT16_TYPE:
  -	anint = data.ui16p[0];	/* XXX note unsigned */
  +	anint = data.ui16p[ix];	/* XXX note unsigned */
   	break;
       case RPM_INT32_TYPE:
  -	anint = data.i32p[0];
  +	anint = data.i32p[ix];
   	break;
       case RPM_INT64_TYPE:
  -	anint = data.i64p[0];
  +	anint = data.i64p[ix];
   	break;
       case RPM_NULL_TYPE:
  -    case RPM_STRING_ARRAY_TYPE:
       default:
   	return xstrdup(_("(invalid xml type)"));
   	/*@notreached@*/ break;
  @@ -512,7 +530,8 @@
   	/*@modifies formatPrefix @*/
   {
       rpmTagData data = { .ptr = he->p.ptr };
  -    int element = he->freeData;	/* XXX HACK: he->freeData for element index. */
  +    int element = he->ix;
  +    int ix = (he->ix > 0 ? he->ix : 0);
       const char * xtag = NULL;
       const char * ytag = NULL;
       size_t nb;
  @@ -525,11 +544,14 @@
       int xx;
       int c;
   
  +assert(ix == 0);
  +assert(he->t == RPM_STRING_TYPE || he->t == RPM_INT64_TYPE || he->t == RPM_BIN_TYPE);
       switch (he->t) {
  +    case RPM_STRING_ARRAY_TYPE:
       case RPM_I18NSTRING_TYPE:
       case RPM_STRING_TYPE:
   	xx = 0;
  -	s = data.str;
  +	s = (he->t == RPM_STRING_ARRAY_TYPE ? data.argv[ix] : data.str);
   	if (strchr("[", s[0]))	/* leading [ */
   	    xx = 1;
   	if (xx == 0)
  @@ -574,7 +596,7 @@
   	b64encode_chars_per_line = 0;
   /*@-formatconst@*/
   	s = base64Format(he, formatPrefix, padding);
  -	element = -element;	/* XXX skip "    " indent. */
  +	element = -element; 	/* XXX skip "    " indent. */
   /*@=formatconst@*/
   	b64encode_chars_per_line = cpl;
   	xtag = "!!binary ";
  @@ -583,19 +605,18 @@
   /*@=globs =mods@*/
       case RPM_CHAR_TYPE:
       case RPM_INT8_TYPE:
  -	anint = data.i8p[0];
  +	anint = data.i8p[ix];
   	break;
       case RPM_INT16_TYPE:
  -	anint = data.ui16p[0];	/* XXX note unsigned */
  +	anint = data.ui16p[ix];	/* XXX note unsigned */
   	break;
       case RPM_INT32_TYPE:
  -	anint = data.i32p[0];
  +	anint = data.i32p[ix];
   	break;
       case RPM_INT64_TYPE:
  -	anint = data.i64p[0];
  +	anint = data.i64p[ix];
   	break;
       case RPM_NULL_TYPE:
  -    case RPM_STRING_ARRAY_TYPE:
       default:
   	return xstrdup(_("(invalid yaml type)"));
   	/*@notreached@*/ break;
  @@ -668,8 +689,10 @@
   	/*@modifies fileSystem, internalState @*/
   {
       rpmTagData data = { .ptr = he->p.ptr };
  +    int ix = (he->ix > 0 ? he->ix : 0);
       char * val, * t;
   
  +assert(ix == 0);
       if (!(he->t == RPM_BIN_TYPE || he->t == RPM_ASN1_TYPE || he->t == RPM_OPENPGP_TYPE)) {
   	val = xstrdup(_("(not a blob)"));
       } else {
  @@ -775,14 +798,14 @@
   	/*@requires maxRead(data) >= 0 @*/
   {
       rpmTagData data = { .ptr = he->p.ptr };
  +    int ix = (he->ix > 0 ? he->ix : 0);;
       char * val;
   
  -    if (he->t != RPM_INT32_TYPE) {
  +assert(ix == 0);
  +    if (he->t != RPM_INT64_TYPE) {
   	val = xstrdup(_("(invalid type)"));
       } else {
  -	/* XXX HACK: he->freeData for element index. */
  -	int element = he->freeData;
  -	int anint = data.i32p[element];
  +	int anint = data.i64p[ix];
   	char *t, *buf;
   
   	t = buf = alloca(32);
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/header.c
  ============================================================================
  $ cvs diff -u -r1.92 -r1.93 header.c
  --- rpm/rpmdb/header.c	19 Oct 2007 00:36:47 -0000	1.92
  +++ rpm/rpmdb/header.c	19 Oct 2007 16:49:34 -0000	1.93
  @@ -2551,7 +2551,7 @@
    */
   typedef struct headerSprintfArgs_s {
       Header h;
  -    HE_t he;
  +    HE_s he;
       char * fmt;
   /*@temp@*/
       headerTagTableEntry tags;
  @@ -2799,17 +2799,18 @@
   static char * intFormat(HE_t he,
   		char * formatPrefix, int padding, const char *fmt)
   {
  -    /* XXX HACK: he->freeData for element index. */
  -    int ix = (he->freeData >= 0 ? he->freeData : 0);
  +    int ix = (he->ix > 0 ? he->ix : 0);;
       int_64 ival = 0;
  -    char * str = NULL;
  +    const char * istr = NULL;
  +    char * b;
  +    size_t nb = 0;
   
       if (fmt == NULL || *fmt == '\0')
   	fmt = "d";
   
       switch (he->t) {
       default:
  -	str = xstrdup(_("(not a number)"));
  +	return xstrdup(_("(not a number)"));
   	break;
       case RPM_CHAR_TYPE:	
       case RPM_INT8_TYPE:
  @@ -2824,19 +2825,35 @@
       case RPM_INT64_TYPE:
   	ival = he->p.i64p[ix];
   	break;
  +    case RPM_STRING_TYPE:
  +	istr = he->p.str;
  +	break;
  +    case RPM_STRING_ARRAY_TYPE:
  +	istr = he->p.argv[ix];
  +	break;
  +    case RPM_OPENPGP_TYPE:	/* XXX W2DO? */
  +    case RPM_ASN1_TYPE:		/* XXX W2DO? */
  +    case RPM_BIN_TYPE:
  +	break;
       }
   
  -    if (str == NULL) {
  -	char b[1024];
  -	size_t nb = sizeof(b);
  +    if (istr) {		/* string */
  +	nb = strlen(istr) + 1;
  +	strcat(formatPrefix, "s");
  +	b = alloca(nb);
  +	snprintf(b, nb, formatPrefix, istr);
  +	b[nb-1] = '\0';
  +    } else
  +    if (nb == 0) {	/* number */
  +	nb = 64;
   	strcat(formatPrefix, "ll");
   	strcat(formatPrefix, fmt);
  +	b = alloca(nb);
   	snprintf(b, nb, formatPrefix, ival);
   	b[nb-1] = '\0';
  -	str = xstrdup(b);
       }
   
  -    return str;
  +    return xstrdup(b);
   }
   
   /**
  @@ -3429,6 +3446,9 @@
       char buf[20];
       rpmTagCount countBuf;
   
  +    HE_t vhe = memset(alloca(sizeof(*vhe)), 0, sizeof(*vhe));
  +    int_64 ival = 0;
  +
       memset(buf, 0, sizeof(buf));
       if (tag->ext) {
   	if (getExtension(hsa, tag->ext, &he->t, &he->p, &he->c, hsa->ec + tag->extNum))
  @@ -3483,49 +3503,35 @@
   
       if (he->p.ptr)
       switch (he->t) {
  +    default:
  +	val = xstrdup("(unknown type)");
  +	need = tag->pad + strlen(val) + 1;
  +	break;
       case RPM_STRING_ARRAY_TYPE:
  -    {	HE_t _he = memset(alloca(sizeof(*_he)), 0, sizeof(*_he));
  -	_he->tag = he->tag;
  -	_he->t = RPM_STRING_TYPE;
  -	_he->p.str = he->p.argv[element];
  -	_he->c = 1;
  -
  -	if (tag->fmt) {
  -	    /* XXX HACK: he->freeData for element index. */
  -	    _he->freeData = -1;
  -	    val = tag->fmt(_he, buf, tag->pad);
  -	}
  -
  -	if (val) {
  -	    need = strlen(val);
  -	} else {
  -	    need = strlen(_he->p.str) + tag->pad + 20;
  -	    val = xmalloc(need+1);
  -	    strcat(buf, "s");
  -	    /*@-formatconst@*/
  -	    sprintf(val, buf, _he->p.str);
  -	    /*@=formatconst@*/
  -	}
  -
  -    }	break;
  -
  +	vhe->p.str = he->p.argv[element];
  +	vhe->t = RPM_STRING_TYPE;
  +	vhe->c = he->c;
  +	vhe->ix = -1;
  +	if (tag->fmt)
  +	    val = tag->fmt(vhe, buf, tag->pad);
  +	else
  +	    val = intFormat(vhe, buf, tag->pad, "s");
  +assert(val);
  +	if (val)
  +	    need = tag->pad + strlen(val) + 1;
  +	break;
       case RPM_STRING_TYPE:
  -	if (tag->fmt) {
  -	    /* XXX HACK: he->freeData for element index. */
  -	    he->freeData = -1;
  -	    val = tag->fmt(he, buf, tag->pad);
  -	}
  -
  -	if (val) {
  -	    need = strlen(val);
  -	} else {
  -	    need = strlen(he->p.str) + tag->pad + 20;
  -	    val = xmalloc(need+1);
  -	    strcat(buf, "s");
  -	    /*@-formatconst@*/
  -	    sprintf(val, buf, he->p.str);
  -	    /*@=formatconst@*/
  -	}
  +	vhe->p.str = he->p.str;
  +	vhe->t = RPM_STRING_TYPE;
  +	vhe->c = he->c;
  +	vhe->ix = -1;
  +	if (tag->fmt)
  +	    val = tag->fmt(vhe, buf, tag->pad);
  +	else
  +	    val = intFormat(vhe, buf, tag->pad, "s");
  +assert(val);
  +	if (val)
  +	    need = tag->pad + strlen(val) + 1;
   	break;
   
       case RPM_CHAR_TYPE:
  @@ -3533,28 +3539,50 @@
       case RPM_INT16_TYPE:
       case RPM_INT32_TYPE:
       case RPM_INT64_TYPE:
  -	/* XXX HACK: he->freeData for element index. */
  -	he->freeData = (he->c > 1 ? element : -1);
  +	switch (he->t) {
  +	default:
  +assert(0);
  +	    break;
  +	case RPM_CHAR_TYPE:	
  +	case RPM_INT8_TYPE:
  +	    ival = he->p.i8p[element];
  +	    break;
  +	case RPM_INT16_TYPE:
  +	    ival = he->p.ui16p[element];	/* XXX note unsigned. */
  +	    break;
  +	case RPM_INT32_TYPE:
  +	    ival = he->p.i32p[element];
  +	    break;
  +	case RPM_INT64_TYPE:
  +	    ival = he->p.i64p[element];
  +	    break;
  +	}
  +	vhe->t = RPM_INT64_TYPE;
  +	vhe->p.i64p = &ival;
  +	vhe->c = he->c;
  +	vhe->ix = (he->c > 1 ? 0 : -1);
  +
   	if (tag->fmt)
  -	    val = tag->fmt(he, buf, tag->pad);
  +	    val = tag->fmt(vhe, buf, tag->pad);
   	else
  -	    val = decFormat(he, buf, tag->pad);
  +	    val = intFormat(vhe, buf, tag->pad, "d");
   assert(val);
   	if (val)
  -	    need = strlen(val);
  +	    need = tag->pad + strlen(val) + 1;
   	break;
   
       case RPM_OPENPGP_TYPE:	/* XXX W2DO? */
       case RPM_ASN1_TYPE:		/* XXX W2DO? */
       case RPM_BIN_TYPE:
  -	if (tag->fmt) {
  -	    /* XXX HACK: he->freeData for element index. */
  -	    he->freeData = -1;
  +	vhe->t = RPM_BIN_TYPE;
  +	vhe->p.ptr = he->p.ptr;
  +	vhe->c = he->c;
  +	vhe->ix = -1;
  +	if (tag->fmt)
   	    val = tag->fmt(he, buf, tag->pad);
  -	}
   
   	if (val) {
  -	    need = strlen(val);
  +	    need = tag->pad + strlen(val) + 1;
   	} else {
   #ifdef	NOTYET
   	    val = memcpy(xmalloc(he->c), he->p.ptr, he->c);
  @@ -3576,10 +3604,6 @@
   	}
   	break;
   
  -    default:
  -	need = sizeof("(unknown type)") - 1;
  -	val = xstrdup("(unknown type)");
  -	break;
       }
   
   /*@-modobserver -observertrans@*/
  @@ -3864,7 +3888,6 @@
   	/*@requires maxSet(errmsg) >= 0 @*/
   {
       headerSprintfArgs hsa = memset(alloca(sizeof(*hsa)), 0, sizeof(*hsa));
  -    HE_t he = memset(alloca(sizeof(*he)), 0, sizeof(*he));
       sprintfToken nextfmt;
       sprintfTag tag;
       char * t, * te;
  @@ -3873,7 +3896,6 @@
       int need;
    
       hsa->h = headerLink(h);
  -    hsa->he = he;
       hsa->fmt = xstrdup(fmt);
   /*@-castexpose@*/	/* FIX: legacy API shouldn't change. */
       hsa->exts = (headerSprintfExtension) extensions;
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/rpmdb/header.h
  ============================================================================
  $ cvs diff -u -r1.46 -r1.47 header.h
  --- rpm/rpmdb/header.h	19 Oct 2007 00:36:47 -0000	1.46
  +++ rpm/rpmdb/header.h	19 Oct 2007 16:49:34 -0000	1.47
  @@ -181,6 +181,7 @@
       rpmTagData p;
       rpmTagCount c;
       int freeData;
  +    int ix;
   };
   typedef struct _HE_s HE_s;
   #endif
  @@ .
Received on Fri Oct 19 18:49:35 2007
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.