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: 18-Oct-2007 22:31:17
Branch: HEAD Handle: 2007101821311601
Modified files:
rpm CHANGES
rpm/rpmdb hdrfmt.c header.c header.h
Log:
- fix several indirection problems.
- eliminate data arg in (*headerTagFormatFunction).
Summary:
Revision Changes Path
1.1730 +2 -0 rpm/CHANGES
1.19 +44 -40 rpm/rpmdb/hdrfmt.c
1.91 +38 -44 rpm/rpmdb/header.c
1.45 +1 -2 rpm/rpmdb/header.h
____________________________________________________________________________
patch -p0 <<'@@ .'
Index: rpm/CHANGES
============================================================================
$ cvs diff -u -r1.1729 -r1.1730 CHANGES
--- rpm/CHANGES 18 Oct 2007 18:56:56 -0000 1.1729
+++ rpm/CHANGES 18 Oct 2007 20:31:16 -0000 1.1730
@@ -1,4 +1,6 @@
4.5 -> 5.0:
+ - jbj: fix several indirection problems.
+ - jbj: eliminate data arg in (*headerTagFormatFunction).
- jbj: start simplifying the world's most complicated sprintf.
- jbj: fix: trigger conditions not displayed correctly.
- jbj: trade-in element overload hack for another, less egregious, hack.
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/hdrfmt.c
============================================================================
$ cvs diff -u -r1.18 -r1.19 hdrfmt.c
--- rpm/rpmdb/hdrfmt.c 18 Oct 2007 15:59:06 -0000 1.18
+++ rpm/rpmdb/hdrfmt.c 18 Oct 2007 20:31:17 -0000 1.19
@@ -71,15 +71,15 @@
/**
* Identify type of trigger.
* @param he tag container
- * @param data tag value
* @param formatPrefix (unused)
* @param padding (unused)
* @return formatted string
*/
-static /*@only@*/ char * triggertypeFormat(HE_t he, hPTR_t data,
+static /*@only@*/ char * triggertypeFormat(HE_t he,
/*@unused@*/ char * formatPrefix, /*@unused@*/ int padding)
{
- const int_32 * item = (*data).i32p;
+ rpmTagData data = { .ptr = (*he->p).ptr };
+ const int_32 * item = data.i32p;
char * val;
if (he->t != RPM_INT32_TYPE)
@@ -100,16 +100,16 @@
/**
* Format file permissions for display.
* @param he tag container
- * @param data tag value
* @param formatPrefix
* @param padding
* @return formatted string
*/
-static /*@only@*/ char * permsFormat(HE_t he, hPTR_t data,
+static /*@only@*/ char * permsFormat(HE_t he,
char * formatPrefix, int padding)
/*@modifies formatPrefix @*/
/*@requires maxRead(data) >= 0 @*/
{
+ rpmTagData data = { .ptr = (*he->p).ptr };
char * val;
char * buf;
@@ -118,7 +118,7 @@
} else {
val = xmalloc(15 + padding);
strcat(formatPrefix, "s");
- buf = rpmPermsString((*data).i32p[0]);
+ buf = rpmPermsString(data.i32p[0]);
/*@-formatconst@*/
sprintf(val, formatPrefix, buf);
/*@=formatconst@*/
@@ -131,20 +131,24 @@
/**
* Format file flags for display.
* @param he tag container
- * @param data tag value
* @param formatPrefix
* @param padding
* @return formatted string
*/
-static /*@only@*/ char * fflagsFormat(HE_t he, hPTR_t data,
+static /*@only@*/ char * fflagsFormat(HE_t he,
char * formatPrefix, int padding)
/*@modifies formatPrefix @*/
/*@requires maxRead(data) >= 0 @*/
{
+ rpmTagData data = { .ptr = (*he->p).ptr };
+ /* XXX HACK: he->freeData for element index. */
+ int element = he->freeData;
char * val;
char buf[15];
- int anint = *((int_32 *) data);
+ int anint;
+assert(element >= 0);
+ anint = data.i32p[element];
if (he->t != RPM_INT32_TYPE) {
val = xstrdup(_("(invalid type)"));
} else {
@@ -180,15 +184,15 @@
* Wrap a pubkey in ascii armor for display.
* @todo Permit selectable display formats (i.e. binary).
* @param he tag container
- * @param data tag value
* @param formatPrefix (unused)
* @param padding (unused)
* @return formatted string
*/
-static /*@only@*/ char * armorFormat(HE_t he, hPTR_t data,
+static /*@only@*/ char * armorFormat(HE_t he,
/*@unused@*/ char * formatPrefix, /*@unused@*/ int padding)
/*@*/
{
+ rpmTagData data = { .ptr = (*he->p).ptr };
const char * enc;
const unsigned char * s;
size_t ns;
@@ -199,13 +203,13 @@
case RPM_OPENPGP_TYPE:
case RPM_ASN1_TYPE: /* XXX WRONG */
case RPM_BIN_TYPE:
- s = (*data).ui8p;
+ s = data.ui8p;
ns = he->c;
atype = PGPARMOR_SIGNATURE; /* XXX check pkt for signature */
break;
case RPM_STRING_TYPE:
case RPM_STRING_ARRAY_TYPE:
- enc = (*data).str;
+ enc = data.str;
s = NULL;
ns = 0;
/*@-moduncon@*/
@@ -237,15 +241,15 @@
* Encode binary data in base64 for display.
* @todo Permit selectable display formats (i.e. binary).
* @param he tag container
- * @param data tag value
* @param formatPrefix (unused)
* @param padding
* @return formatted string
*/
-static /*@only@*/ char * base64Format(HE_t he, hPTR_t data,
+static /*@only@*/ char * base64Format(HE_t he,
/*@unused@*/ char * formatPrefix, int padding)
/*@*/
{
+ rpmTagData data = { .ptr = (*he->p).ptr };
char * val;
if (!(he->t == RPM_BIN_TYPE || he->t == RPM_ASN1_TYPE || he->t == RPM_OPENPGP_TYPE)) {
@@ -272,7 +276,7 @@
/* XXX b64encode accesses uninitialized memory. */
{ unsigned char * _data = xcalloc(1, ns+1);
- memcpy(_data, data, ns);
+ memcpy(_data, data.ptr, ns);
/*@-moduncon@*/
if ((enc = b64encode(_data, ns)) != NULL) {
t = stpcpy(t, enc);
@@ -338,15 +342,15 @@
/**
* Wrap tag data in simple header xml markup.
* @param he tag container
- * @param data tag value
* @param formatPrefix
* @param padding
* @return formatted string
*/
-static /*@only@*/ char * xmlFormat(HE_t he, hPTR_t data,
+static /*@only@*/ char * xmlFormat(HE_t he,
char * formatPrefix, int padding)
/*@modifies formatPrefix @*/
{
+ rpmTagData data = { .ptr = (*he->p).ptr };
const char * xtag = NULL;
size_t nb;
char * val;
@@ -359,7 +363,7 @@
switch (he->t) {
case RPM_I18NSTRING_TYPE:
case RPM_STRING_TYPE:
- s = (*data).str;
+ s = data.str;
xtag = "string";
/* XXX Force utf8 strings. */
s = xstrdup(s);
@@ -373,7 +377,7 @@
{ int cpl = b64encode_chars_per_line;
b64encode_chars_per_line = 0;
/*@-formatconst@*/
- s = base64Format(he, data, formatPrefix, padding);
+ s = base64Format(he, formatPrefix, padding);
/*@=formatconst@*/
b64encode_chars_per_line = cpl;
xtag = "base64";
@@ -382,16 +386,16 @@
/*@=globs =mods@*/
case RPM_CHAR_TYPE:
case RPM_INT8_TYPE:
- anint = *((uint_8 *) data);
+ anint = data.i8p[0];
break;
case RPM_INT16_TYPE:
- anint = *((uint_16 *) data);
+ anint = data.ui16p[0]; /* XXX note unsigned */
break;
case RPM_INT32_TYPE:
- anint = *((uint_32 *) data);
+ anint = data.i32p[0];
break;
case RPM_INT64_TYPE:
- anint = *((uint_64 *) data);
+ anint = data.i64p[0];
break;
case RPM_NULL_TYPE:
case RPM_STRING_ARRAY_TYPE:
@@ -499,15 +503,15 @@
/**
* Wrap tag data in simple header yaml markup.
* @param he tag container
- * @param data tag value
* @param formatPrefix
* @param padding
* @return formatted string
*/
-static /*@only@*/ char * yamlFormat(HE_t he, hPTR_t data,
+static /*@only@*/ char * yamlFormat(HE_t he,
char * formatPrefix, int padding)
/*@modifies formatPrefix @*/
{
+ rpmTagData data = { .ptr = (*he->p).ptr };
int element = he->freeData; /* XXX HACK: he->freeData for element index. */
const char * xtag = NULL;
const char * ytag = NULL;
@@ -525,7 +529,7 @@
case RPM_I18NSTRING_TYPE:
case RPM_STRING_TYPE:
xx = 0;
- s = (*data).str;
+ s = data.str;
if (strchr("[", s[0])) /* leading [ */
xx = 1;
if (xx == 0)
@@ -558,7 +562,7 @@
}
/* XXX Force utf8 strings. */
- s = xstrdup((*data).str);
+ s = xstrdup(data.str);
s = xstrtolocale(s);
freeit = 1;
break;
@@ -569,7 +573,7 @@
{ int cpl = b64encode_chars_per_line;
b64encode_chars_per_line = 0;
/*@-formatconst@*/
- s = base64Format(he, data, formatPrefix, padding);
+ s = base64Format(he, formatPrefix, padding);
element = -element; /* XXX skip " " indent. */
/*@=formatconst@*/
b64encode_chars_per_line = cpl;
@@ -579,16 +583,16 @@
/*@=globs =mods@*/
case RPM_CHAR_TYPE:
case RPM_INT8_TYPE:
- anint = *((uint_8 *) data);
+ anint = data.i8p[0];
break;
case RPM_INT16_TYPE:
- anint = *((uint_16 *) data);
+ anint = data.ui16p[0]; /* XXX note unsigned */
break;
case RPM_INT32_TYPE:
- anint = *((uint_32 *) data);
+ anint = data.i32p[0];
break;
case RPM_INT64_TYPE:
- anint = *((uint_64 *) data);
+ anint = data.i64p[0];
break;
case RPM_NULL_TYPE:
case RPM_STRING_ARRAY_TYPE:
@@ -654,22 +658,22 @@
/**
* Display signature fingerprint and time.
* @param he tag container
- * @param data tag value
* @param formatPrefix (unused)
* @param padding
* @return formatted string
*/
-static /*@only@*/ char * pgpsigFormat(HE_t he, hPTR_t data,
+static /*@only@*/ char * pgpsigFormat(HE_t he,
/*@unused@*/ char * formatPrefix, /*@unused@*/ int padding)
/*@globals fileSystem, internalState @*/
/*@modifies fileSystem, internalState @*/
{
+ rpmTagData data = { .ptr = (*he->p).ptr };
char * val, * t;
if (!(he->t == RPM_BIN_TYPE || he->t == RPM_ASN1_TYPE || he->t == RPM_OPENPGP_TYPE)) {
val = xstrdup(_("(not a blob)"));
} else {
- unsigned char * pkt = (byte *) data;
+ unsigned char * pkt = (byte *) data.ptr;
unsigned int pktlen = 0;
unsigned int v = *pkt;
pgpTag tag = 0;
@@ -761,16 +765,16 @@
/**
* Format dependency flags for display.
* @param he tag container
- * @param data tag value
* @param formatPrefix
* @param padding
* @return formatted string
*/
-static /*@only@*/ char * depflagsFormat(HE_t he, hPTR_t data,
+static /*@only@*/ char * depflagsFormat(HE_t he,
char * formatPrefix, int padding)
/*@modifies formatPrefix @*/
/*@requires maxRead(data) >= 0 @*/
{
+ rpmTagData data = { .ptr = (*he->p).ptr };
char * val;
if (he->t != RPM_INT32_TYPE) {
@@ -778,7 +782,7 @@
} else {
/* XXX HACK: he->freeData for element index. */
int element = he->freeData;
- int anint = (*data).i32p[element];
+ int anint = data.i32p[element];
char *t, *buf;
t = buf = alloca(32);
@@ -900,7 +904,7 @@
_he->p = &flags;
_he->c = 1;
he->freeData = j;/* XXX HACK: he->freeData for element index. */
- flagsStr = depflagsFormat(_he, he->p, buf, 0);
+ flagsStr = depflagsFormat(_he, buf, 0);
sprintf(item, "%s %s %s", names.argv[j], flagsStr, versions.argv[j]);
flagsStr = _free(flagsStr);
} else
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/header.c
============================================================================
$ cvs diff -u -r1.90 -r1.91 header.c
--- rpm/rpmdb/header.c 18 Oct 2007 18:56:56 -0000 1.90
+++ rpm/rpmdb/header.c 18 Oct 2007 20:31:17 -0000 1.91
@@ -2797,13 +2797,12 @@
/**
* Convert tag data representation.
* @param he tag container
- * @param data tag value
* @param formatPrefix sprintf format string
* @param padding no. additional bytes needed by format string
* @param fmt output radix (NULL or "" assumes %d)
* @return formatted string
*/
-static char * intFormat(HE_t he, hPTR_t data,
+static char * intFormat(HE_t he,
char * formatPrefix, int padding, const char *fmt)
{
/* XXX HACK: he->freeData for element index. */
@@ -2814,7 +2813,6 @@
if (fmt == NULL || *fmt == '\0')
fmt = "d";
-assert(he->p == data);
switch (he->t) {
default:
str = xstrdup(_("(not a number)"));
@@ -2850,63 +2848,60 @@
/**
* Return octal formatted data.
* @param he tag container
- * @param data tag value
* @param formatPrefix sprintf format string
* @param padding no. additional bytes needed by format string
* @return formatted string
*/
-static char * octFormat(HE_t he, hPTR_t data,
+static char * octFormat(HE_t he,
char * formatPrefix, int padding)
/*@modifies formatPrefix @*/
{
- return intFormat(he, data, formatPrefix, padding, "o");
+ return intFormat(he, formatPrefix, padding, "o");
}
/**
* Return hex formatted data.
* @param he tag container
- * @param data tag value
* @param formatPrefix sprintf format string
* @param padding no. additional bytes needed by format string
* @return formatted string
*/
-static char * hexFormat(HE_t he, hPTR_t data,
+static char * hexFormat(HE_t he,
char * formatPrefix, int padding)
/*@modifies formatPrefix @*/
{
- return intFormat(he, data, formatPrefix, padding, "x");
+ return intFormat(he, formatPrefix, padding, "x");
}
/**
* Return decimal formatted data.
* @param he tag container
- * @param data tag value
* @param formatPrefix sprintf format string
* @param padding no. additional bytes needed by format string
* @return formatted string
*/
-static char * decFormat(HE_t he, hPTR_t data,
+static char * decFormat(HE_t he,
char * formatPrefix, int padding)
/*@modifies formatPrefix @*/
{
- return intFormat(he, data, formatPrefix, padding, "d");
+ return intFormat(he, formatPrefix, padding, "d");
}
/**
* Return strftime formatted data.
* @param he tag container
- * @param data tag value
* @param formatPrefix sprintf format string
* @param padding no. additional bytes needed by format string
* @param strftimeFormat strftime(3) format
* @return formatted string
*/
-static char * realDateFormat(HE_t he, hPTR_t data,
+static char * realDateFormat(HE_t he,
char * formatPrefix, int padding,
const char * strftimeFormat)
/*@modifies formatPrefix @*/
{
char * val;
+ rpmTagData data = { .ptr = (*he->p).ptr };
if (he->t != RPM_INT32_TYPE) {
val = xstrdup(_("(not a number)"));
@@ -2918,7 +2913,7 @@
strcat(formatPrefix, "s");
/* this is important if sizeof(int_32) ! sizeof(time_t) */
- { time_t dateint = *((int_32 *) data);
+ { time_t dateint = data.ui32p[0];
tstruct = localtime(&dateint);
}
buf[0] = '\0';
@@ -2935,63 +2930,59 @@
/**
* Return date formatted data.
* @param he tag container
- * @param data tag value
* @param formatPrefix sprintf format string
* @param padding no. additional bytes needed by format string
* @return formatted string
*/
-static char * dateFormat(HE_t he, hPTR_t data,
+static char * dateFormat(HE_t he,
char * formatPrefix, int padding)
/*@modifies formatPrefix @*/
{
- return realDateFormat(he, data, formatPrefix, padding,
- _("%c"));
+ return realDateFormat(he, formatPrefix, padding, _("%c"));
}
/**
* Return day formatted data.
* @param he tag container
- * @param data tag value
* @param formatPrefix sprintf format string
* @param padding no. additional bytes needed by format string
* @return formatted string
*/
-static char * dayFormat(HE_t he, hPTR_t data,
+static char * dayFormat(HE_t he,
char * formatPrefix, int padding)
/*@modifies formatPrefix @*/
{
- return realDateFormat(he, data, formatPrefix, padding,
- _("%a %b %d %Y"));
+ return realDateFormat(he, formatPrefix, padding, _("%a %b %d %Y"));
}
/**
* Return shell escape formatted data.
* @param he tag container
- * @param data tag value
* @param formatPrefix sprintf format string
* @param padding no. additional bytes needed by format string
* @return formatted string
*/
-static char * shescapeFormat(HE_t he, hPTR_t data,
+static char * shescapeFormat(HE_t he,
char * formatPrefix, int padding)
/*@modifies formatPrefix @*/
{
char * result, * dst, * src, * buf;
+ rpmTagData data = { .ptr = (*he->p).ptr };
if (he->t == RPM_INT32_TYPE) {
result = xmalloc(padding + 20);
strcat(formatPrefix, "d");
/*@-formatconst@*/
- sprintf(result, formatPrefix, (*data).i32p[0]);
+ sprintf(result, formatPrefix, data.i32p[0]);
/*@=formatconst@*/
} else if (he->t == RPM_INT64_TYPE) {
result = xmalloc(padding + 40);
strcat(formatPrefix, "lld");
/*@-formatconst@*/
- sprintf(result, formatPrefix, (*data).i64p[0]);
+ sprintf(result, formatPrefix, data.i64p[0]);
/*@=formatconst@*/
} else {
- buf = alloca(strlen((*data).str) + padding + 2);
+ buf = alloca(strlen(data.str) + padding + 2);
strcat(formatPrefix, "s");
/*@-formatconst@*/
sprintf(buf, formatPrefix, data);
@@ -3453,7 +3444,6 @@
size_t need = 0;
char * t, * te;
char buf[20];
- hRET_t strarray;
rpmTagCount countBuf;
memset(buf, 0, sizeof(buf));
@@ -3511,42 +3501,46 @@
if (he_p.ptr)
switch (he->t) {
case RPM_STRING_ARRAY_TYPE:
- strarray.argv = he_p.argv;
+ { hRET_t _he_p = { .ptr = NULL };
+ HE_s _he_s = { .tag = 0, .t = 0, .p = &_he_p, .c = 0, .freeData = 0 };
+ HE_t _he = &_he_s;
+ _he->tag = he->tag;
+ _he->t = RPM_STRING_TYPE;
+ (*_he->p).str = (*he->p).argv[element];
+ _he->c = 1;
+ _he->freeData = -1;
- if (tag->fmt) {
- /* XXX HACK: he->freeData for element index. */
- he->freeData = (he->c > 1 ? element : -1);
- val = tag->fmt(he, (hPTR_t) strarray.argv[element], buf, tag->pad); /* NOCAST */
- }
+ if (tag->fmt)
+ val = tag->fmt(_he, buf, tag->pad);
if (val) {
need = strlen(val);
} else {
- need = strlen(strarray.argv[element]) + tag->pad + 20;
+ need = strlen((*_he->p).str) + tag->pad + 20;
val = xmalloc(need+1);
strcat(buf, "s");
/*@-formatconst@*/
- sprintf(val, buf, strarray.argv[element]);
+ sprintf(val, buf, (*_he->p).str);
/*@=formatconst@*/
}
- break;
+ } break;
case RPM_STRING_TYPE:
if (tag->fmt) {
/* XXX HACK: he->freeData for element index. */
he->freeData = -1;
- val = tag->fmt(he, he_p.ptr, buf, tag->pad);
+ val = tag->fmt(he, buf, tag->pad);
}
if (val) {
need = strlen(val);
} else {
- need = strlen(he_p.str) + tag->pad + 20;
+ need = strlen((*he->p).str) + tag->pad + 20;
val = xmalloc(need+1);
strcat(buf, "s");
/*@-formatconst@*/
- sprintf(val, buf, he_p.str);
+ sprintf(val, buf, (*he->p).str);
/*@=formatconst@*/
}
break;
@@ -3559,9 +3553,9 @@
/* XXX HACK: he->freeData for element index. */
he->freeData = (he->c > 1 ? element : -1);
if (tag->fmt)
- val = tag->fmt(he, he->p, buf, tag->pad);
+ val = tag->fmt(he, buf, tag->pad);
else
- val = decFormat(he, he->p, buf, tag->pad);
+ val = decFormat(he, buf, tag->pad);
assert(val);
if (val)
need = strlen(val);
@@ -3573,7 +3567,7 @@
if (tag->fmt) {
/* XXX HACK: he->freeData for element index. */
he->freeData = -1;
- val = tag->fmt(he, he_p.ptr, buf, tag->pad);
+ val = tag->fmt(he, buf, tag->pad);
}
if (val) {
@@ .
patch -p0 <<'@@ .'
Index: rpm/rpmdb/header.h
============================================================================
$ cvs diff -u -r1.44 -r1.45 header.h
--- rpm/rpmdb/header.h 18 Oct 2007 15:59:06 -0000 1.44
+++ rpm/rpmdb/header.h 18 Oct 2007 20:31:17 -0000 1.45
@@ -246,12 +246,11 @@
* HEADER_EXT_TAG format function prototype.
*
* @param he tag container
- * @param data tag value
* @param formatPrefix
* @param padding
* @return formatted string
*/
-typedef /*only@*/ char * (*headerTagFormatFunction)(HE_t he, rpmTagData * data,
+typedef /*only@*/ char * (*headerTagFormatFunction)(HE_t he,
char * formatPrefix, int padding)
/*@requires maxSet(data) >= 0 @*/;
@@ .
Received on Thu Oct 18 22:31:17 2007