grep: move context hunk mark handling into show_line()
Move last_shown into struct grep_opt, to make it available in show_line(), and then make the function handle the printing of hunk marks for context lines in a central place. Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
8cfe5f1cd5
commit
5dd06d3879
26
grep.c
26
grep.c
@ -490,6 +490,12 @@ static void show_line(struct grep_opt *opt, char *bol, char *eol,
|
|||||||
{
|
{
|
||||||
int rest = eol - bol;
|
int rest = eol - bol;
|
||||||
|
|
||||||
|
if (opt->pre_context || opt->post_context) {
|
||||||
|
if (opt->last_shown && lno > opt->last_shown + 1)
|
||||||
|
fputs("--\n", stdout);
|
||||||
|
}
|
||||||
|
opt->last_shown = lno;
|
||||||
|
|
||||||
if (opt->null_following_name)
|
if (opt->null_following_name)
|
||||||
sign = '\0';
|
sign = '\0';
|
||||||
if (opt->pathname)
|
if (opt->pathname)
|
||||||
@ -531,12 +537,12 @@ static int grep_buffer_1(struct grep_opt *opt, const char *name,
|
|||||||
char *eol;
|
char *eol;
|
||||||
} *prev = NULL, *pcl;
|
} *prev = NULL, *pcl;
|
||||||
unsigned last_hit = 0;
|
unsigned last_hit = 0;
|
||||||
unsigned last_shown = 0;
|
|
||||||
int binary_match_only = 0;
|
int binary_match_only = 0;
|
||||||
const char *hunk_mark = "";
|
|
||||||
unsigned count = 0;
|
unsigned count = 0;
|
||||||
enum grep_context ctx = GREP_CONTEXT_HEAD;
|
enum grep_context ctx = GREP_CONTEXT_HEAD;
|
||||||
|
|
||||||
|
opt->last_shown = 0;
|
||||||
|
|
||||||
if (buffer_is_binary(buf, size)) {
|
if (buffer_is_binary(buf, size)) {
|
||||||
switch (opt->binary) {
|
switch (opt->binary) {
|
||||||
case GREP_BINARY_DEFAULT:
|
case GREP_BINARY_DEFAULT:
|
||||||
@ -552,8 +558,6 @@ static int grep_buffer_1(struct grep_opt *opt, const char *name,
|
|||||||
|
|
||||||
if (opt->pre_context)
|
if (opt->pre_context)
|
||||||
prev = xcalloc(opt->pre_context, sizeof(*prev));
|
prev = xcalloc(opt->pre_context, sizeof(*prev));
|
||||||
if (opt->pre_context || opt->post_context)
|
|
||||||
hunk_mark = "--\n";
|
|
||||||
|
|
||||||
while (left) {
|
while (left) {
|
||||||
char *eol, ch;
|
char *eol, ch;
|
||||||
@ -607,33 +611,25 @@ static int grep_buffer_1(struct grep_opt *opt, const char *name,
|
|||||||
from = lno - opt->pre_context;
|
from = lno - opt->pre_context;
|
||||||
else
|
else
|
||||||
from = 1;
|
from = 1;
|
||||||
if (from <= last_shown)
|
if (from <= opt->last_shown)
|
||||||
from = last_shown + 1;
|
from = opt->last_shown + 1;
|
||||||
if (last_shown && from != last_shown + 1)
|
|
||||||
fputs(hunk_mark, stdout);
|
|
||||||
while (from < lno) {
|
while (from < lno) {
|
||||||
pcl = &prev[lno-from-1];
|
pcl = &prev[lno-from-1];
|
||||||
show_line(opt, pcl->bol, pcl->eol,
|
show_line(opt, pcl->bol, pcl->eol,
|
||||||
name, from, '-');
|
name, from, '-');
|
||||||
from++;
|
from++;
|
||||||
}
|
}
|
||||||
last_shown = lno-1;
|
|
||||||
}
|
}
|
||||||
if (last_shown && lno != last_shown + 1)
|
|
||||||
fputs(hunk_mark, stdout);
|
|
||||||
if (!opt->count)
|
if (!opt->count)
|
||||||
show_line(opt, bol, eol, name, lno, ':');
|
show_line(opt, bol, eol, name, lno, ':');
|
||||||
last_shown = last_hit = lno;
|
last_hit = lno;
|
||||||
}
|
}
|
||||||
else if (last_hit &&
|
else if (last_hit &&
|
||||||
lno <= last_hit + opt->post_context) {
|
lno <= last_hit + opt->post_context) {
|
||||||
/* If the last hit is within the post context,
|
/* If the last hit is within the post context,
|
||||||
* we need to show this line.
|
* we need to show this line.
|
||||||
*/
|
*/
|
||||||
if (last_shown && lno != last_shown + 1)
|
|
||||||
fputs(hunk_mark, stdout);
|
|
||||||
show_line(opt, bol, eol, name, lno, '-');
|
show_line(opt, bol, eol, name, lno, '-');
|
||||||
last_shown = lno;
|
|
||||||
}
|
}
|
||||||
if (opt->pre_context) {
|
if (opt->pre_context) {
|
||||||
memmove(prev+1, prev,
|
memmove(prev+1, prev,
|
||||||
|
1
grep.h
1
grep.h
@ -84,6 +84,7 @@ struct grep_opt {
|
|||||||
int regflags;
|
int regflags;
|
||||||
unsigned pre_context;
|
unsigned pre_context;
|
||||||
unsigned post_context;
|
unsigned post_context;
|
||||||
|
unsigned last_shown;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern void append_grep_pattern(struct grep_opt *opt, const char *pat, const char *origin, int no, enum grep_pat_token t);
|
extern void append_grep_pattern(struct grep_opt *opt, const char *pat, const char *origin, int no, enum grep_pat_token t);
|
||||||
|
Reference in New Issue
Block a user