aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNed Ludd <solar@gentoo.org>2005-11-06 18:07:17 +0000
committerNed Ludd <solar@gentoo.org>2005-11-06 18:07:17 +0000
commitb0701d976813a1c836e247da0b272735c3c10b45 (patch)
tree32dbab477019cee9bee03a05ad4b565fe2d19028 /qgrep.c
parent- dont chdir to describe use flags, Do it this way so we can describe use fla... (diff)
downloadportage-utils-b0701d976813a1c836e247da0b272735c3c10b45.tar.gz
portage-utils-b0701d976813a1c836e247da0b272735c3c10b45.tar.bz2
portage-utils-b0701d976813a1c836e247da0b272735c3c10b45.zip
- add new applet qgrep. grep alike util for ebuilds. New global -Q flag to suppress warnings and errors. Reworked quse_describe_flag() to take a 3rd arg, this allows us to reuse the function for other things. equery u <pkgspec> comes to mind. Update all the manpages.
Diffstat (limited to 'qgrep.c')
-rw-r--r--qgrep.c113
1 files changed, 113 insertions, 0 deletions
diff --git a/qgrep.c b/qgrep.c
new file mode 100644
index 00000000..647ae3e5
--- /dev/null
+++ b/qgrep.c
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2005 Gentoo Foundation
+ * Distributed under the terms of the GNU General Public License v2
+ * $Header: /var/cvsroot/gentoo-projects/portage-utils/qgrep.c,v 1.1 2005/11/06 18:07:17 solar Exp $
+ *
+ * Copyright 2005 Ned Ludd - <solar@gentoo.org>
+ * Copyright 2005 Mike Frysinger - <vapier@gentoo.org>
+ */
+
+#define QGREP_FLAGS "Iice" COMMON_FLAGS
+static struct option const qgrep_long_opts[] = {
+ {"invert-match", no_argument, NULL, 'I'},
+ {"ignore-case", no_argument, NULL, 'i'},
+ {"count", no_argument, NULL, 'c'},
+ {"regexp", no_argument, NULL, 'e'},
+ COMMON_LONG_OPTS
+};
+static const char *qgrep_opts_help[] = {
+ "select non-matching lines",
+ "ignore case distinctions",
+ "only print a count of matching lines per FILE",
+ "use PATTERN as a regular expression",
+ COMMON_OPTS_HELP
+};
+#define qgrep_usage(ret) usage(ret, QGREP_FLAGS, qgrep_long_opts, qgrep_opts_help, APPLET_QGREP)
+
+int qgrep_main(int argc, char **argv)
+{
+ int i;
+ int count = 0;
+ char *p;
+ char do_count, do_regex;
+ FILE *fp;
+ char ebuild[_POSIX_PATH_MAX];
+ char buf0[BUFSIZ];
+ int reflags = REG_NOSUB;
+ char invert_match = 0;
+
+ typedef char *(*FUNC) (char *, char *);
+ FUNC strfunc = (FUNC) strstr;
+
+ DBG("argc=%d argv[0]=%s argv[1]=%s",
+ argc, argv[0], argc > 1 ? argv[1] : "NULL?");
+
+ do_count = do_regex = 0;
+
+ while ((i = GETOPT_LONG(QGREP, qgrep, "")) != -1) {
+ switch (i) {
+ case 'I': invert_match = 1; break;
+ case 'i':
+ strfunc = (FUNC) strcasestr;
+ reflags |= REG_ICASE;
+ break;
+ case 'c': do_count = 1; break;
+ case 'e': do_regex = 1; break;
+ COMMON_GETOPTS_CASES(qgrep)
+ }
+ }
+ if (argc == optind)
+ qgrep_usage(EXIT_FAILURE);
+
+ initialize_ebuild_flat(); /* sets our pwd to $PORTDIR */
+
+ if ((fp = fopen(".ebuild.x", "r")) == NULL)
+ return 1;
+ while ((fgets(ebuild, sizeof(ebuild), fp)) != NULL) {
+ FILE *newfp;
+ if ((p = strchr(ebuild, '\n')) != NULL)
+ *p = 0;
+ if ((newfp = fopen(ebuild, "r")) != NULL) {
+ unsigned int lineno = 0;
+ count = 0;
+ while ((fgets(buf0, sizeof(buf0), newfp)) != NULL) {
+ lineno++;
+ if ((p = strrchr(buf0, '\n')) != NULL)
+ *p = 0;
+ if ((p = strrchr(buf0, '\r')) != NULL)
+ *p = 0;
+
+ if (!invert_match) {
+ if (do_regex == 0) {
+ if (( (FUNC *) (strfunc) (buf0, argv[optind])) == NULL) continue;
+ } else {
+ if ((rematch(argv[optind], buf0, reflags)) != 0) continue;
+ }
+ } else {
+ if (do_regex == 0) {
+ if (( (FUNC *) (strfunc) (buf0, argv[optind])) != NULL) continue;
+ } else {
+ if ((rematch(argv[optind], buf0, reflags)) == 0) continue;
+ }
+ }
+
+ count++;
+ if (do_count) continue;
+ if (verbose) {
+ printf("%s:", ebuild);
+ if (verbose > 1) printf("%d:", lineno);
+ printf(" ");
+ }
+ printf("%s\n", buf0);
+ }
+ fclose(newfp);
+ if (do_count && count) {
+ printf("%d", count);
+ if (verbose) printf(" %s", ebuild);
+ puts("");
+ }
+ }
+ }
+ fclose(fp);
+ return EXIT_SUCCESS;
+}