Merge iterator types into pseudo tags.

Load argv and ftpopts through iterator modifier, not creator.

CVS patchset: 7486
CVS date: 2004/10/19 15:54:38
This commit is contained in:
jbj 2004-10-19 15:54:38 +00:00
parent fb6dac4267
commit 343b3223e8
5 changed files with 85 additions and 101 deletions

View File

@ -221,7 +221,7 @@ fprintf(stderr, "*** gi %p\t%p[%d]: %s\n", gi, gi->ftsp, gi->i, fts->fts_path);
}
/**
* Load globbed arg list into iterator.
* Append globbed arg list to iterator.
* @param gi generalized iterator
* @param argv arg list to be globbed
* @returns RPMRC_OK on success
@ -233,11 +233,6 @@ static rpmRC rpmgiGlobArgv(rpmgi gi, ARGV_t argv)
const char * arg;
rpmRC rpmrc = RPMRC_OK;
if (gi->argv != NULL)
gi->argv = argvFree(gi->argv);
gi->argv = xcalloc(1, sizeof(*gi->argv));
gi->argc = 0;
if (argv != NULL)
while ((arg = *argv++) != NULL) {
ARGV_t av = NULL;
@ -289,21 +284,7 @@ fprintf(stderr, "*** gi %p\t%p[%d]\n", gi, gi->argv, gi->argc);
(void) rpmgiUnlink(gi, NULL);
/*@-usereleased@*/
#ifdef NOTYET
switch (gi->tag) {
default:
case RPMGI_RPMDB:
break;
case RPMGI_HDLIST:
break;
case RPMGI_ARGLIST:
break;
case RPMGI_FTSWALK:
break;
}
#endif
gi->queryFormat = _free(gi->queryFormat);
gi->hdrPath = _free(gi->hdrPath);
gi->h = headerFree(gi->h);
@ -330,7 +311,7 @@ fprintf(stderr, "*** gi %p\t%p[%d]\n", gi, gi->argv, gi->argc);
return NULL;
}
rpmgi rpmgiNew(rpmts ts, int tag, void *const keyp, size_t keylen)
rpmgi rpmgiNew(rpmts ts, int tag, void * keyp, size_t keylen)
{
rpmgi gi = xcalloc(1, sizeof(*gi));
@ -339,41 +320,22 @@ rpmgi rpmgiNew(rpmts ts, int tag, void *const keyp, size_t keylen)
gi->ts = rpmtsLink(ts, NULL);
gi->tag = tag;
gi->keyp = keyp;
gi->keylen = keylen;
gi->active = 0;
gi->i = -1;
gi->queryFormat = NULL;
gi->hdrPath = NULL;
gi->h = NULL;
gi->mi = NULL;
gi->fd = NULL;
gi->argv = NULL;
gi->argv = xcalloc(1, sizeof(*gi->argv));
gi->argc = 0;
gi->ftsOpts = 0;
gi->ftsp = NULL;
gi->fts = NULL;
switch (gi->tag) {
default:
case RPMGI_RPMDB:
break;
case RPMGI_HDLIST:
break;
case RPMGI_ARGLIST:
case RPMGI_FTSWALK:
{ ARGV_t argv = keyp; /* HACK */
unsigned flags = keylen; /* HACK */
rpmRC rpmrc;
rpmrc = rpmgiGlobArgv(gi, argv);
gi->ftsOpts = flags;
if (_rpmgi_debug < 0)
fprintf(stderr, "*** gi %p\t%p[%d]\n", gi, gi->argv, gi->argc);
} break;
}
gi = rpmgiLink(gi, NULL);
return gi;
@ -396,9 +358,9 @@ rpmRC rpmgiNext(/*@null@*/ rpmgi gi)
if (++gi->i >= 0)
switch (gi->tag) {
default:
case RPMGI_RPMDB:
case RPMDBI_PACKAGES:
if (!gi->active) {
gi->mi = rpmtsInitIterator(gi->ts, RPMDBI_PACKAGES, NULL, 0);
gi->mi = rpmtsInitIterator(gi->ts, gi->tag, gi->keyp, gi->keylen);
if (_rpmgi_debug < 0)
fprintf(stderr, "*** gi %p\t%p\n", gi, gi->mi);
gi->active = 1;
@ -416,7 +378,7 @@ fprintf(stderr, "*** gi %p\t%p\n", gi, gi->mi);
}
gi->hdrPath = rpmExpand("rpmdb h# ", hnum, NULL);
break;
case RPMGI_HDLIST:
case RPMDBI_HDLIST:
if (!gi->active) {
const char * path = "/usr/share/comps/%{_arch}/hdlist";
gi->fd = rpmgiOpen(path, "r.ufdio");
@ -434,7 +396,7 @@ fprintf(stderr, "*** gi %p\t%p\n", gi, gi->mi);
}
gi->hdrPath = rpmExpand("hdlist h# ", hnum, NULL);
break;
case RPMGI_ARGLIST:
case RPMDBI_ARGLIST:
if (gi->argv == NULL || gi->argv[gi->i] == NULL)
goto enditer;
@ -448,7 +410,7 @@ fprintf(stderr, "*** gi %p\t%p[%d]: %s\n", gi, gi->argv, gi->i, gi->argv[gi->i])
gi->hdrPath = xstrdup(gi->argv[gi->i]);
break;
case RPMGI_FTSWALK:
case RPMDBI_FTSWALK:
if (gi->argv == NULL) /* HACK */
goto enditer;
@ -496,4 +458,11 @@ Header rpmgiHeader(rpmgi gi)
/*@=compdef =refcounttrans =retexpose =usereleased@*/
}
rpmRC rpmgiSetArgs(rpmgi gi, ARGV_t argv, int flags)
{
rpmRC rpmrc = rpmgiGlobArgv(gi, argv);
gi->ftsOpts = flags;
return rpmrc;
}
/*@=modfilesys@*/

View File

@ -17,16 +17,6 @@
extern int _rpmgi_debug;
/*@=exportlocal@*/
/**
* Iterator types.
*/
typedef enum rpmgiTag_e {
RPMGI_RPMDB = RPMDBI_PACKAGES,
RPMGI_HDLIST = 6, /* XXX next after RPMDBI_AVAILABLE */
RPMGI_ARGLIST = 7,
RPMGI_FTSWALK = 8
} rpmgiTag;
#if defined(_RPMGI_INTERNAL)
/** \ingroup rpmio
*/
@ -34,12 +24,13 @@ struct rpmgi_s {
/*@refcounted@*/
rpmts ts; /*!< Iterator transaction set. */
int tag; /*!< Iterator type. */
int active; /*!< Iterator is initialized? */
void * keyp; /*!< Iterator key. */
size_t keylen; /*!< Iterator key length. */
int active; /*!< Iterator is active? */
int i; /*!< Element index. */
/*@null@*/
const char * queryFormat; /*!< Iterator query format. */
/*@null@*/
const char * hdrPath; /*!< Path to current header object. */
const char * hdrPath; /*!< Path to current iterator header. */
/*@refcounted@*/ /*@null@*/
Header h; /*!< Current iterator header. */
@ -119,7 +110,7 @@ rpmgi rpmgiFree(/*@killref@*/ /*@only@*/ /*@null@*/ rpmgi gi)
* @return new general iterator
*/
/*@null@*/
rpmgi rpmgiNew(rpmts ts, int tag, void *const keyp, size_t keylen)
rpmgi rpmgiNew(rpmts ts, int tag, void * keyp, size_t keylen)
/*@globals internalState @*/
/*@modifies ts, internalState @*/;
@ -144,12 +135,20 @@ const char * rpmgiHdrPath(rpmgi gi)
/**
* Return current iteration header.
* @param gi generalized iterator
* @returns next element
* @returns header
*/
/*@null@*/
Header rpmgiHeader(/*@null@*/ rpmgi gi)
/*@*/;
/**
* Load iterator args.
* @param gi generalized iterator
* @returns RPMRC_OK
*/
rpmRC rpmgiSetArgs(rpmgi gi, ARGV_t, int flags)
/*@modifies gi @*/;
#ifdef __cplusplus
}
#endif

View File

@ -212,7 +212,7 @@ extern const struct headerSprintfExtension_s rpmHeaderFormats[];
/*@=redecl@*/
/**
* Pseudo-tags used by the rpmdb iterator API.
* Pseudo-tags used by the rpmdb and rpmgi iterator API's.
*/
#define RPMDBI_PACKAGES 0 /*!< Installed package headers. */
#define RPMDBI_DEPENDS 1 /*!< Dependency resolution cache. */
@ -220,6 +220,9 @@ extern const struct headerSprintfExtension_s rpmHeaderFormats[];
#define RPMDBI_ADDED 3 /*!< Added package headers. */
#define RPMDBI_REMOVED 4 /*!< Removed package headers. */
#define RPMDBI_AVAILABLE 5 /*!< Available package headers. */
#define RPMDBI_HDLIST 6 /*!< (rpmgi) Header list. */
#define RPMDBI_ARGLIST 7 /*!< (rpmgi) Argument list. */
#define RPMDBI_FTSWALK 8 /*!< (rpmgi) File tree walk. */
/**
* Tags identify data in package headers.

View File

@ -10,7 +10,7 @@
#include "debug.h"
static int gitag = RPMGI_FTSWALK;
static int gitag = RPMDBI_FTSWALK;
static int ftsOpts = 0;
static const char * queryFormat = NULL;
@ -38,13 +38,13 @@ static struct poptOption optionsTable[] = {
{ "rpmgidebug", 'd', POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN, &_rpmgi_debug, -1,
N_("debug generalized iterator"), NULL},
{ "rpmdb", '\0', POPT_ARG_VAL, &gitag, RPMGI_RPMDB,
{ "rpmdb", '\0', POPT_ARG_VAL, &gitag, RPMDBI_PACKAGES,
N_("iterate rpmdb"), NULL },
{ "hdlist", '\0', POPT_ARG_VAL, &gitag, RPMGI_HDLIST,
{ "hdlist", '\0', POPT_ARG_VAL, &gitag, RPMDBI_HDLIST,
N_("iterate hdlist"), NULL },
{ "arglist", '\0', POPT_ARG_VAL, &gitag, RPMGI_ARGLIST,
{ "arglist", '\0', POPT_ARG_VAL, &gitag, RPMDBI_ARGLIST,
N_("iterate arglist"), NULL },
{ "ftswalk", '\0', POPT_ARG_VAL, &gitag, RPMGI_FTSWALK,
{ "ftswalk", '\0', POPT_ARG_VAL, &gitag, RPMDBI_FTSWALK,
N_("iterate fts(3) walk"), NULL },
{ "qf", '\0', POPT_ARG_STRING, &queryFormat, 0,
@ -110,8 +110,10 @@ main(int argc, char *const argv[])
(void) rpmtsSetTid(ts, tid);
}
gi = rpmgiNew(ts, gitag, NULL, 0);
av = poptGetArgs(optCon);
gi = rpmgiNew(ts, gitag, av, ftsOpts);
(void) rpmgiSetArgs(gi, av, ftsOpts);
ac = 0;
while (rpmgiNext(gi) == RPMRC_OK) {

View File

@ -16,39 +16,44 @@ const char *const tagName(int tag)
switch (tag) {
case RPMDBI_PACKAGES:
strcpy(nameBuf, "Packages");
return nameBuf;
/*@notreached@*/ break;
break;
case RPMDBI_DEPENDS:
strcpy(nameBuf, "Depends");
return nameBuf;
/*@notreached@*/ break;
break;
case RPMDBI_ADDED:
strcpy(nameBuf, "Added");
return nameBuf;
/*@notreached@*/ break;
break;
case RPMDBI_REMOVED:
strcpy(nameBuf, "Removed");
return nameBuf;
/*@notreached@*/ break;
break;
case RPMDBI_AVAILABLE:
strcpy(nameBuf, "Available");
return nameBuf;
/*@notreached@*/ break;
}
strcpy(nameBuf, "(unknown)");
break;
case RPMDBI_HDLIST:
strcpy(nameBuf, "Hdlist");
break;
case RPMDBI_ARGLIST:
strcpy(nameBuf, "Arglist");
break;
case RPMDBI_FTSWALK:
strcpy(nameBuf, "Ftswalk");
break;
default:
strcpy(nameBuf, "(unknown)");
/*@-boundswrite@*/
for (i = 0; i < rpmTagTableSize; i++) {
if (tag != rpmTagTable[i].val)
continue;
nameBuf[0] = nameBuf[1] = '\0';
if (rpmTagTable[i].name != NULL) /* XXX programmer error. */
strcpy(nameBuf, rpmTagTable[i].name + 7);
for (s = nameBuf+1; *s != '\0'; s++)
*s = xtolower(*s);
for (i = 0; i < rpmTagTableSize; i++) {
if (tag != rpmTagTable[i].val)
continue;
nameBuf[0] = nameBuf[1] = '\0';
if (rpmTagTable[i].name != NULL) /* XXX programmer error. */
strcpy(nameBuf, rpmTagTable[i].name + (sizeof("RPMTAG_")-1));
for (s = nameBuf+1; *s != '\0'; s++)
*s = xtolower(*s);
/*@loopbreak@*/ break;
}
/*@=boundswrite@*/
break;
}
/*@=boundswrite@*/
return nameBuf;
}
@ -56,19 +61,25 @@ int tagValue(const char * tagstr)
{
const struct headerTagTableEntry_s *t;
if (!strcmp(tagstr, "Packages"))
if (!xstrcasecmp(tagstr, "Packages"))
return RPMDBI_PACKAGES;
if (!strcmp(tagstr, "Depends"))
if (!xstrcasecmp(tagstr, "Depends"))
return RPMDBI_DEPENDS;
if (!strcmp(tagstr, "Added"))
if (!xstrcasecmp(tagstr, "Added"))
return RPMDBI_ADDED;
if (!strcmp(tagstr, "Removed"))
if (!xstrcasecmp(tagstr, "Removed"))
return RPMDBI_REMOVED;
if (!strcmp(tagstr, "Available"))
if (!xstrcasecmp(tagstr, "Available"))
return RPMDBI_AVAILABLE;
if (!xstrcasecmp(tagstr, "Hdlist"))
return RPMDBI_HDLIST;
if (!xstrcasecmp(tagstr, "Arglist"))
return RPMDBI_ARGLIST;
if (!xstrcasecmp(tagstr, "Ftswalk"))
return RPMDBI_FTSWALK;
for (t = rpmTagTable; t->name != NULL; t++) {
if (!xstrcasecmp(t->name + 7, tagstr))
if (!xstrcasecmp(t->name + (sizeof("RPMTAG_")-1), tagstr))
return t->val;
}
return -1;