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:
parent
fb6dac4267
commit
343b3223e8
69
lib/rpmgi.c
69
lib/rpmgi.c
|
@ -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@*/
|
||||
|
|
31
lib/rpmgi.h
31
lib/rpmgi.h
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
14
lib/tgi.c
14
lib/tgi.c
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue