builtin-grep: support -c (--count).
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
@ -88,6 +88,7 @@ struct grep_opt {
|
|||||||
unsigned linenum:1;
|
unsigned linenum:1;
|
||||||
unsigned invert:1;
|
unsigned invert:1;
|
||||||
unsigned name_only:1;
|
unsigned name_only:1;
|
||||||
|
unsigned count:1;
|
||||||
int regflags;
|
int regflags;
|
||||||
unsigned pre_context;
|
unsigned pre_context;
|
||||||
unsigned post_context;
|
unsigned post_context;
|
||||||
@ -149,6 +150,7 @@ static int grep_buffer(struct grep_opt *opt, const char *name,
|
|||||||
unsigned last_hit = 0;
|
unsigned last_hit = 0;
|
||||||
unsigned last_shown = 0;
|
unsigned last_shown = 0;
|
||||||
const char *hunk_mark = "";
|
const char *hunk_mark = "";
|
||||||
|
unsigned count = 0;
|
||||||
|
|
||||||
if (opt->pre_context)
|
if (opt->pre_context)
|
||||||
prev = xcalloc(opt->pre_context, sizeof(*prev));
|
prev = xcalloc(opt->pre_context, sizeof(*prev));
|
||||||
@ -179,12 +181,16 @@ static int grep_buffer(struct grep_opt *opt, const char *name,
|
|||||||
if (opt->invert)
|
if (opt->invert)
|
||||||
hit = !hit;
|
hit = !hit;
|
||||||
if (hit) {
|
if (hit) {
|
||||||
|
count++;
|
||||||
if (opt->name_only) {
|
if (opt->name_only) {
|
||||||
printf("%s\n", name);
|
printf("%s\n", name);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
/* Hit at this line. If we haven't shown the
|
/* Hit at this line. If we haven't shown the
|
||||||
* pre-context lines, we would need to show them.
|
* pre-context lines, we would need to show them.
|
||||||
|
* When asked to do "count", this still show
|
||||||
|
* the context which is nonsense, but the user
|
||||||
|
* deserves to get that ;-).
|
||||||
*/
|
*/
|
||||||
if (opt->pre_context) {
|
if (opt->pre_context) {
|
||||||
unsigned from;
|
unsigned from;
|
||||||
@ -206,6 +212,7 @@ static int grep_buffer(struct grep_opt *opt, const char *name,
|
|||||||
}
|
}
|
||||||
if (last_shown && lno != last_shown + 1)
|
if (last_shown && lno != last_shown + 1)
|
||||||
printf(hunk_mark);
|
printf(hunk_mark);
|
||||||
|
if (!opt->count)
|
||||||
show_line(opt, bol, eol, name, lno, ':');
|
show_line(opt, bol, eol, name, lno, ':');
|
||||||
last_shown = last_hit = lno;
|
last_shown = last_hit = lno;
|
||||||
}
|
}
|
||||||
@ -230,6 +237,13 @@ static int grep_buffer(struct grep_opt *opt, const char *name,
|
|||||||
left--;
|
left--;
|
||||||
lno++;
|
lno++;
|
||||||
}
|
}
|
||||||
|
/* NEEDSWORK:
|
||||||
|
* The real "grep -c foo *.c" gives many "bar.c:0" lines,
|
||||||
|
* which feels mostly useless but sometimes useful. Maybe
|
||||||
|
* make it another option? For now suppress them.
|
||||||
|
*/
|
||||||
|
if (opt->count && count)
|
||||||
|
printf("%s:%u\n", name, count);
|
||||||
return !!last_hit;
|
return !!last_hit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -442,6 +456,11 @@ int cmd_grep(int argc, const char **argv, char **envp)
|
|||||||
opt.name_only = 1;
|
opt.name_only = 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (!strcmp("-c", arg) ||
|
||||||
|
!strcmp("--count", arg)) {
|
||||||
|
opt.count = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (!strncmp("-A", arg, 2) ||
|
if (!strncmp("-A", arg, 2) ||
|
||||||
!strncmp("-B", arg, 2) ||
|
!strncmp("-B", arg, 2) ||
|
||||||
!strncmp("-C", arg, 2) ||
|
!strncmp("-C", arg, 2) ||
|
||||||
|
Reference in New Issue
Block a user