commit:     db488105e8637cf64664aef44bce2e629ecce338
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Sun Feb 14 00:21:47 2016 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Sun Feb 14 00:21:47 2016 +0000
URL:        https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=db488105

qdepends: parse args as atoms

Update the arg parsing logic to treat them as atoms rather than as
ad-hoc substring parsing.  This makes the listing logic much more
natural and brings it inline with other applets.

URL: https://bugs.gentoo.org/390749
Reported-by: aditsu <AT> yahoo.com

 qdepends.c | 80 +++++++++++++++++++++++++++++++++++++++++---------------------
 1 file changed, 53 insertions(+), 27 deletions(-)

diff --git a/qdepends.c b/qdepends.c
index 197c376..f5867f8 100644
--- a/qdepends.c
+++ b/qdepends.c
@@ -381,8 +381,7 @@ char *dep_flatten_tree(const dep_node *root)
 }
 
 struct qdepends_opt_state {
-       int argc;
-       char **argv;
+       array_t *atoms;
        const char *depend_file;
        const char *query;
 };
@@ -392,42 +391,44 @@ _q_static int qdepends_main_vdb_cb(q_vdb_pkg_ctx 
*pkg_ctx, void *priv)
        struct qdepends_opt_state *state = priv;
        const char *catname = pkg_ctx->cat_ctx->name;
        const char *pkgname = pkg_ctx->name;
-       size_t len;
-       int i;
+       size_t i, len;
+       int ret;
        char *ptr;
        char buf[_Q_PATH_MAX];
        static char *depend, *use;
        static size_t depend_len, use_len;
+       depend_atom *atom, *datom;
        dep_node *dep_tree;
 
+       datom = NULL;
+       ret = 0;
+
        /* see if this cat/pkg is requested */
-       for (i = optind; i < state->argc; ++i) {
+       array_for_each(state->atoms, i, atom) {
+               bool matched = false;
                snprintf(buf, sizeof(buf), "%s/%s", catname, pkgname);
-               if (rematch(state->argv[i], buf, REG_EXTENDED) == 0)
-                       break;
-               if (rematch(state->argv[i], pkgname, REG_EXTENDED) == 0)
-                       break;
+               datom = atom_explode(buf);
+               if (datom) {
+                       matched = (atom_compare(atom, datom) == EQUAL);
+                       if (matched)
+                               goto matched;
+               }
+               atom_implode(datom);
        }
-       if (i == state->argc)
-               return 0;
+       return ret;
+ matched:
 
        if (!q_vdb_pkg_eat(pkg_ctx, state->depend_file, &depend, &depend_len))
-               return 0;
+               goto done;
 
        dep_tree = dep_grow_tree(depend);
        if (dep_tree == NULL)
-               return 0;
+               goto done;
 
-       if (qdep_name_only) {
-               depend_atom *atom = NULL;
-               snprintf(buf, sizeof(buf), "%s/%s", catname, pkgname);
-               if ((atom = atom_explode(buf)) != NULL) {
-                       printf("%s%s/%s%s%s: ", BOLD, catname, BLUE, atom->PN, 
NORM);
-                       atom_implode(atom);
-               }
-       } else {
+       if (qdep_name_only)
+               printf("%s%s/%s%s%s: ", BOLD, catname, BLUE, atom->PN, NORM);
+       else
                printf("%s%s/%s%s%s: ", BOLD, catname, BLUE, pkgname, NORM);
-       }
 
        if (!q_vdb_pkg_eat(pkg_ctx, "USE", &use, &use_len)) {
                warn("Could not eat_file(%s), you'll prob have incorrect 
output", buf);
@@ -454,7 +455,11 @@ _q_static int qdepends_main_vdb_cb(q_vdb_pkg_ctx *pkg_ctx, 
void *priv)
 
        dep_burn_tree(dep_tree);
 
-       return 1;
+       ret = 1;
+
+ done:
+       atom_implode(datom);
+       return ret;
 }
 
 _q_static int qdepends_vdb_deep_cb(q_vdb_pkg_ctx *pkg_ctx, void *priv)
@@ -516,12 +521,14 @@ _q_static int qdepends_vdb_deep_cb(q_vdb_pkg_ctx 
*pkg_ctx, void *priv)
 
 int qdepends_main(int argc, char **argv)
 {
+       depend_atom *atom;
+       DECLARE_ARRAY(atoms);
        struct qdepends_opt_state state = {
-               .argc = argc,
-               .argv = argv,
+               .atoms = atoms,
        };
        q_vdb_pkg_cb *cb;
-       int i, ret;
+       size_t i;
+       int ret;
        bool do_format = false;
        const char *query = NULL;
        const char *depend_file;
@@ -556,9 +563,24 @@ int qdepends_main(int argc, char **argv)
                return EXIT_SUCCESS;
        }
 
+       argc -= optind;
+       argv += optind;
+
        state.depend_file = depend_file;
        state.query = query;
-       cb = query ? qdepends_vdb_deep_cb : qdepends_main_vdb_cb;
+       if (query)
+               cb = qdepends_vdb_deep_cb;
+       else {
+               cb = qdepends_main_vdb_cb;
+
+               for (i = 0; i < argc; ++i) {
+                       atom = atom_explode(argv[i]);
+                       if (!atom)
+                               warn("invalid atom: %s", argv[i]);
+                       else
+                               xarraypush_ptr(atoms, atom);
+               }
+       }
 
        if (!depend_file) {
                ret = 0;
@@ -570,6 +592,10 @@ int qdepends_main(int argc, char **argv)
        } else
                ret = q_vdb_foreach_pkg(cb, &state, NULL);
 
+       array_for_each(atoms, i, atom)
+               atom_implode(atom);
+       xarrayfree_int(atoms);
+
        if (!ret && !quiet)
                warn("no matches found for your query");
        return ret ? EXIT_SUCCESS : EXIT_FAILURE;

Reply via email to