RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: [EMAIL PROTECTED] Module: rpm Date: 03-Nov-2007 14:19:24 Branch: HEAD Handle: 2007110313192201 Modified files: rpm CHANGES rpm/lib rpmrc.c rpm/rpmdb rpmdb.c rpm/rpmio macro.c rpmmacro.h Log: - jbj: add a getter to retrieve macros with used and/or pattern filtering. - jbj: macro macro table/element internals opaque. Summary: Revision Changes Path 1.1763 +2 -0 rpm/CHANGES 2.213 +1 -3 rpm/lib/rpmrc.c 1.197 +1 -1 rpm/rpmdb/rpmdb.c 2.148 +62 -1 rpm/rpmio/macro.c 2.41 +24 -4 rpm/rpmio/rpmmacro.h ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.1762 -r1.1763 CHANGES --- rpm/CHANGES 2 Nov 2007 03:07:46 -0000 1.1762 +++ rpm/CHANGES 3 Nov 2007 13:19:22 -0000 1.1763 @@ -1,4 +1,6 @@ 4.5 -> 5.0: + - jbj: add a getter to retrieve macros with used and/or pattern filtering. + - jbj: macro macro table/element internals opaque. - jbj: fix --rebuilddb --root /path. - rse: fix linking of RPM against PCRE's POSIX API under --with-pcre - jbj: upgrade to F8 & fix rpm-python. i18n tags w hdr_subscript are b0rked. @@ . patch -p0 <<'@@ .' Index: rpm/lib/rpmrc.c ============================================================================ $ cvs diff -u -r2.212 -r2.213 rpmrc.c --- rpm/lib/rpmrc.c 6 Oct 2007 21:33:48 -0000 2.212 +++ rpm/lib/rpmrc.c 3 Nov 2007 13:19:23 -0000 2.213 @@ -8,15 +8,13 @@ #define __power_pc() 0 #endif +#define _MIRE_INTERNAL #include <rpmio_internal.h> /* for rpmioSlurp() */ #include <rpmcli.h> #include <rpmmacro.h> #include <rpmlua.h> #include <rpmds.h> -#define _MIRE_INTERNAL -#include <mire.h> - #include "misc.h" #include "debug.h" @@ . patch -p0 <<'@@ .' Index: rpm/rpmdb/rpmdb.c ============================================================================ $ cvs diff -u -r1.196 -r1.197 rpmdb.c --- rpm/rpmdb/rpmdb.c 2 Nov 2007 03:07:46 -0000 1.196 +++ rpm/rpmdb/rpmdb.c 3 Nov 2007 13:19:23 -0000 1.197 @@ -11,6 +11,7 @@ #include <rpmio.h> #include <rpmpgp.h> #include <rpmurl.h> +#define _MIRE_INTERNAL #include <rpmmacro.h> #include <rpmsq.h> #include <rpmtag.h> @@ -27,7 +28,6 @@ #endif #define _RPMDB_INTERNAL -#define _MIRE_INTERNAL #include "rpmdb.h" #include "pkgio.h" #include "fprint.h" @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/macro.c ============================================================================ $ cvs diff -u -r2.147 -r2.148 macro.c --- rpm/rpmio/macro.c 11 Oct 2007 13:04:28 -0000 2.147 +++ rpm/rpmio/macro.c 3 Nov 2007 13:19:23 -0000 2.148 @@ -68,6 +68,7 @@ #endif +#define _MACRO_INTERNAL #include <rpmmacro.h> #include "debug.h" @@ -201,7 +202,7 @@ if (mc == NULL || mc->macroTable == NULL) return; - qsort(mc->macroTable, mc->firstFree, sizeof(*(mc->macroTable)), + qsort(mc->macroTable, mc->firstFree, sizeof(mc->macroTable[0]), compareMacroName); /* Empty pointers are now at end of table. Reset first free index. */ @@ -213,6 +214,31 @@ } } +static char * dupMacroEntry(MacroEntry me) +{ + char * t, * te; + size_t nb; + +assert(me != NULL); + nb = strlen(me->name) + sizeof("%") - 1; + if (me->opts) + nb += strlen(me->opts) + sizeof("()") - 1; + if (me->body) + nb += strlen(me->body) + sizeof("\t") - 1; + nb++; + + te = t = xmalloc(nb); + *te = '\0'; + te = stpcpy( stpcpy(te, "%"), me->name); + if (me->opts) + te = stpcpy( stpcpy( stpcpy(te, "("), me->opts), ")"); + if (me->body) + te = stpcpy( stpcpy(te, "\t"), me->body); + *te = '\0'; + + return t; +} + void rpmDumpMacroTable(MacroContext mc, FILE * fp) { @@ -246,6 +272,41 @@ nactive, nempty); } +int +rpmGetMacroEntries(MacroContext mc, miRE mire, int used, + const char *** avp) +{ + const char ** av; + int ac; + int i; + + if (mc == NULL) + mc = rpmGlobalMacroContext; + + if (avp == NULL) + return mc->firstFree; + + av = xcalloc( (mc->firstFree+1), sizeof(mc->macroTable[0])); + if (mc->macroTable != NULL) + for (i = 0; i < mc->firstFree; i++) { + MacroEntry me; + me = mc->macroTable[i]; + if (used > 0 && me->used < used) + continue; + if (used == 0 && me->used != 0) + continue; +#if !defined(DEBUG_MACROS) /* XXX preserve standalone build */ + if (mireRegexec(mire, me->name)) + continue; +#endif + av[ac++] = dupMacroEntry(me); + } + av[ac] = NULL; + *avp = av = xrealloc(av, (ac+1) * sizeof(*av)); + + return ac; +} + /** * Find entry in macro table. * @param mc macro context @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmmacro.h ============================================================================ $ cvs diff -u -r2.40 -r2.41 rpmmacro.h --- rpm/rpmio/rpmmacro.h 6 Oct 2007 19:40:23 -0000 2.40 +++ rpm/rpmio/rpmmacro.h 3 Nov 2007 13:19:23 -0000 2.41 @@ -1,12 +1,17 @@ #ifndef _H_MACRO_ #define _H_MACRO_ +#include <mire.h> + /** \ingroup rpmio * \file rpmio/rpmmacro.h */ +typedef /[EMAIL PROTECTED]@*/ struct MacroEntry_s * MacroEntry; +typedef /[EMAIL PROTECTED]@*/ struct MacroContext_s * MacroContext; +#if defined(_MACRO_INTERNAL) /*! The structure used to store a macro. */ -typedef /[EMAIL PROTECTED]@*/ struct MacroEntry_s { +struct MacroEntry_s { struct MacroEntry_s *prev; /*!< Macro entry stack. */ const char *name; /*!< Macro name. */ const char *opts; /*!< Macro parameters (a la getopt) */ @@ -14,15 +19,16 @@ int used; /*!< No. of expansions. */ short level; /*!< Scoping level. */ unsigned short flags; /*!< Flags. */ -} * MacroEntry; +}; /*! The structure used to store the set of macros in a context. */ -typedef /[EMAIL PROTECTED]@*/ struct MacroContext_s { +struct MacroContext_s { /[EMAIL PROTECTED]@*//[EMAIL PROTECTED]@*/ MacroEntry *macroTable; /*!< Macro entry table for context. */ int macrosAllocated; /*!< No. of allocated macros. */ int firstFree; /*!< No. of macros. */ -} * MacroContext; +}; +#endif /[EMAIL PROTECTED]@*/ /[EMAIL PROTECTED]@*/ @@ -67,6 +73,20 @@ /[EMAIL PROTECTED] *fp, fileSystem @*/; /** + * Return macro entries as string array. + * @param mc macro context (NULL uses global context) + * @param mire pattern to match (NULL disables) + * @param used macro usage (<0 all, =0 unused, >=1 used count) + * @retval *avp macro definitions + * @return no. of entries + */ +int +rpmGetMacroEntries(/[EMAIL PROTECTED]@*/ MacroContext mc, /[EMAIL PROTECTED]@*/ miRE mire, + int used, /[EMAIL PROTECTED]@*/ const char *** avp) + /[EMAIL PROTECTED] rpmGlobalMacroContext @*/ + /[EMAIL PROTECTED] *avp @*/; + +/** * Return URL path(s) from a (URL prefixed) pattern glob. * @param patterns glob pattern * @retval *argcPtr no. of paths @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org