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