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

View File

@ -17,16 +17,6 @@
extern int _rpmgi_debug; extern int _rpmgi_debug;
/*@=exportlocal@*/ /*@=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) #if defined(_RPMGI_INTERNAL)
/** \ingroup rpmio /** \ingroup rpmio
*/ */
@ -34,12 +24,13 @@ struct rpmgi_s {
/*@refcounted@*/ /*@refcounted@*/
rpmts ts; /*!< Iterator transaction set. */ rpmts ts; /*!< Iterator transaction set. */
int tag; /*!< Iterator type. */ 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. */ int i; /*!< Element index. */
/*@null@*/ /*@null@*/
const char * queryFormat; /*!< Iterator query format. */ const char * hdrPath; /*!< Path to current iterator header. */
/*@null@*/
const char * hdrPath; /*!< Path to current header object. */
/*@refcounted@*/ /*@null@*/ /*@refcounted@*/ /*@null@*/
Header h; /*!< Current iterator header. */ Header h; /*!< Current iterator header. */
@ -119,7 +110,7 @@ rpmgi rpmgiFree(/*@killref@*/ /*@only@*/ /*@null@*/ rpmgi gi)
* @return new general iterator * @return new general iterator
*/ */
/*@null@*/ /*@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 @*/ /*@globals internalState @*/
/*@modifies ts, internalState @*/; /*@modifies ts, internalState @*/;
@ -144,12 +135,20 @@ const char * rpmgiHdrPath(rpmgi gi)
/** /**
* Return current iteration header. * Return current iteration header.
* @param gi generalized iterator * @param gi generalized iterator
* @returns next element * @returns header
*/ */
/*@null@*/ /*@null@*/
Header rpmgiHeader(/*@null@*/ rpmgi gi) 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 #ifdef __cplusplus
} }
#endif #endif

View File

@ -212,7 +212,7 @@ extern const struct headerSprintfExtension_s rpmHeaderFormats[];
/*@=redecl@*/ /*@=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_PACKAGES 0 /*!< Installed package headers. */
#define RPMDBI_DEPENDS 1 /*!< Dependency resolution cache. */ #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_ADDED 3 /*!< Added package headers. */
#define RPMDBI_REMOVED 4 /*!< Removed package headers. */ #define RPMDBI_REMOVED 4 /*!< Removed package headers. */
#define RPMDBI_AVAILABLE 5 /*!< Available 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. * Tags identify data in package headers.

View File

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

View File

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