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.
This commit is contained in:
Kyle Evans 2018-04-20 18:06:03 +00:00
parent 1302eea7bb
commit 042db8e876
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=332832

View File

@ -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,24 +211,12 @@ grep_tree(char **argv)
return (c);
}
/*
* Process any matches in the current parsing context, return a boolean
* indicating whether we should halt any further processing or not. 'true' to
* continue processing, 'false' to halt.
*/
static bool
procmatches(struct mprintc *mc, struct parsec *pc, bool matched)
static void
procmatch_match(struct mprintc *mc, struct parsec *pc)
{
/*
* XXX TODO: This should loop over pc->matches and handle things on a
* line-by-line basis, setting up a `struct str` as needed.
*/
/* Deal with any -B context or context separators */
if (matched) {
if (mc->doctx) {
if (!first_match &&
(!mc->same_file || mc->last_outed > 0))
if (!first_match && (!mc->same_file || mc->last_outed > 0))
printf("--\n");
if (Bflag > 0)
printqueue();
@ -248,6 +238,44 @@ procmatches(struct mprintc *mc, struct parsec *pc, bool matched)
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
* continue processing, 'false' to halt.
*/
static bool
procmatches(struct mprintc *mc, struct parsec *pc, bool matched)
{
/*
* XXX TODO: This should loop over pc->matches and handle things on a
* line-by-line basis, setting up a `struct str` as needed.
*/
/* Deal with any -B context or context separators */
if (matched) {
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);
}