summaryrefslogtreecommitdiff
path: root/usr.bin/grep
diff options
context:
space:
mode:
authorKyle Evans <kevans@FreeBSD.org>2018-04-20 18:06:03 +0000
committerKyle Evans <kevans@FreeBSD.org>2018-04-20 18:06:03 +0000
commit042db8e8765507f0427c0d468e9d4f372bb2aa4c (patch)
tree6d6d63899e19b810d54fc373020e8eed98a0106f /usr.bin/grep
parent1302eea7bba029a3b4e71f2d9cebae9337f4b054 (diff)
downloadsrc-test-042db8e8765507f0427c0d468e9d4f372bb2aa4c.tar.gz
src-test-042db8e8765507f0427c0d468e9d4f372bb2aa4c.zip
bsdgrep: Break procmatches down a little bit more
Split the matching and non-matching cases out into their own functions to reduce future complexity. As the name implies, procmatches will eventually process more than one match itself in the future.
Notes
Notes: svn path=/head/; revision=332832
Diffstat (limited to 'usr.bin/grep')
-rw-r--r--usr.bin/grep/util.c97
1 files changed, 54 insertions, 43 deletions
diff --git a/usr.bin/grep/util.c b/usr.bin/grep/util.c
index 66a29e4b2a1de..965a4138ebb5b 100644
--- a/usr.bin/grep/util.c
+++ b/usr.bin/grep/util.c
@@ -84,6 +84,8 @@ struct mprintc {
bool same_file; /* Same file as previously printed? */
};
+static void procmatch_match(struct mprintc *mc, struct parsec *pc);
+static void procmatch_nomatch(struct mprintc *mc, struct parsec *pc);
static bool procmatches(struct mprintc *mc, struct parsec *pc, bool matched);
#ifdef WITH_INTERNAL_NOSPEC
static int litexec(const struct pat *pat, const char *string,
@@ -209,6 +211,55 @@ grep_tree(char **argv)
return (c);
}
+static void
+procmatch_match(struct mprintc *mc, struct parsec *pc)
+{
+
+ if (mc->doctx) {
+ if (!first_match && (!mc->same_file || mc->last_outed > 0))
+ printf("--\n");
+ if (Bflag > 0)
+ printqueue();
+ mc->tail = Aflag;
+ }
+
+ /* Print the matching line, but only if not quiet/binary */
+ if (mc->printmatch) {
+ printline(pc, ':');
+ while (pc->matchidx >= MAX_MATCHES) {
+ /* Reset matchidx and try again */
+ pc->matchidx = 0;
+ if (procline(pc) == 0)
+ printline(pc, ':');
+ else
+ break;
+ }
+ first_match = false;
+ mc->same_file = true;
+ mc->last_outed = 0;
+ }
+}
+
+static void
+procmatch_nomatch(struct mprintc *mc, struct parsec *pc)
+{
+
+ /* Deal with any -A context as needed */
+ if (mc->tail > 0) {
+ grep_printline(&pc->ln, '-');
+ mc->tail--;
+ if (Bflag > 0)
+ clearqueue();
+ } else if (Bflag == 0 || (Bflag > 0 && enqueue(&pc->ln)))
+ /*
+ * Enqueue non-matching lines for -B context. If we're not
+ * actually doing -B context or if the enqueue resulted in a
+ * line being rotated out, then go ahead and increment
+ * last_outed to signify a gap between context/match.
+ */
+ ++mc->last_outed;
+}
+
/*
* Process any matches in the current parsing context, return a boolean
* indicating whether we should halt any further processing or not. 'true' to
@@ -224,30 +275,7 @@ procmatches(struct mprintc *mc, struct parsec *pc, bool matched)
*/
/* Deal with any -B context or context separators */
if (matched) {
- if (mc->doctx) {
- if (!first_match &&
- (!mc->same_file || mc->last_outed > 0))
- printf("--\n");
- if (Bflag > 0)
- printqueue();
- mc->tail = Aflag;
- }
-
- /* Print the matching line, but only if not quiet/binary */
- if (mc->printmatch) {
- printline(pc, ':');
- while (pc->matchidx >= MAX_MATCHES) {
- /* Reset matchidx and try again */
- pc->matchidx = 0;
- if (procline(pc) == 0)
- printline(pc, ':');
- else
- break;
- }
- first_match = false;
- mc->same_file = true;
- mc->last_outed = 0;
- }
+ procmatch_match(mc, pc);
/* Count the matches if we have a match limit */
if (mflag) {
@@ -256,25 +284,8 @@ procmatches(struct mprintc *mc, struct parsec *pc, bool matched)
if (mflag && mcount <= 0)
return (false);
}
- } else if (mc->doctx) {
- /* Not matching, deal with any -A context as needed */
- if (mc->tail > 0) {
- grep_printline(&pc->ln, '-');
- mc->tail--;
- if (Bflag > 0)
- clearqueue();
- } else {
- /*
- * Enqueue non-matching lines for -B context.
- * If we're not actually doing -B context or if
- * the enqueue resulted in a line being rotated
- * out, then go ahead and increment last_outed
- * to signify a gap between context/match.
- */
- if (Bflag == 0 || (Bflag > 0 && enqueue(&pc->ln)))
- ++mc->last_outed;
- }
- }
+ } else if (mc->doctx)
+ procmatch_nomatch(mc, pc);
return (true);
}