svn commit: r332832 - head/usr.bin/grep

Kyle Evans kevans at FreeBSD.org
Fri Apr 20 18:06:04 UTC 2018


Author: kevans
Date: Fri Apr 20 18:06:03 2018
New Revision: 332832
URL: https://svnweb.freebsd.org/changeset/base/332832

Log:
  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.

Modified:
  head/usr.bin/grep/util.c

Modified: head/usr.bin/grep/util.c
==============================================================================
--- head/usr.bin/grep/util.c	Fri Apr 20 15:55:09 2018	(r332831)
+++ head/usr.bin/grep/util.c	Fri Apr 20 18:06:03 2018	(r332832)
@@ -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,31 +275,8 @@ procmatches(struct mprintc *mc, struct parsec *pc, boo
 	 */
 	/* 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;
-		}
+		procmatch_match(mc, pc);
 
-		/* 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;
-		}
-
 		/* Count the matches if we have a match limit */
 		if (mflag) {
 			/* XXX TODO: Decrement by number of matched lines */
@@ -256,25 +284,8 @@ procmatches(struct mprintc *mc, struct parsec *pc, boo
 			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);
 }


More information about the svn-src-all mailing list