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:
parent
1302eea7bb
commit
042db8e876
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=332832
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user