Re: [PATCH/RFC 3/4] grep: introduce pattern which matches at line number

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, May 2, 2011 at 8:39 AM, Bert Wesarg <bert.wesarg@xxxxxxxxxxxxxx> wrote:
> Signed-off-by: Bert Wesarg <bert.wesarg@xxxxxxxxxxxxxx>
> ---
> Âgrep.c | Â 33 +++++++++++++++++++++++++++++++++
> Âgrep.h | Â Â7 +++++--
> Â2 files changed, 38 insertions(+), 2 deletions(-)
>
> diff --git a/grep.c b/grep.c
> index f21b022..cbb3757 100644
> --- a/grep.c
> +++ b/grep.c
> @@ -87,6 +87,15 @@ static void compile_regexp(struct grep_pat *p, struct grep_opt *opt)
> Â Â Â Â}
> Â}
>
> +static void parse_lno(struct grep_pat *p, struct grep_opt *opt)
Maybe parse_line_number?

> +{
> + Â Â Â char *eon;
> +
> + Â Â Â p->u.lno = strtoul(p->pattern, &eon, 10);
> + Â Â Â if (*eon || p->u.lno == 0)
> + Â Â Â Â Â Â Â die("'%s': Invalid number for line match", p->pattern);
> +}
> +
> Âstatic struct grep_expr *compile_pattern_or(struct grep_pat **);
> Âstatic struct grep_expr *compile_pattern_atom(struct grep_pat **list)
> Â{
> @@ -100,6 +109,7 @@ static struct grep_expr *compile_pattern_atom(struct grep_pat **list)
> Â Â Â Âcase GREP_PATTERN: /* atom */
> Â Â Â Âcase GREP_PATTERN_HEAD:
> Â Â Â Âcase GREP_PATTERN_BODY:
> + Â Â Â case GREP_LNO:
> Â Â Â Â Â Â Â Âx = xcalloc(1, sizeof (struct grep_expr));
> Â Â Â Â Â Â Â Âx->node = GREP_NODE_ATOM;
> Â Â Â Â Â Â Â Âx->u.atom = p;
> @@ -264,6 +274,9 @@ void compile_grep_patterns(struct grep_opt *opt)
> Â Â Â Â Â Â Â Âcase GREP_PATTERN_BODY:
> Â Â Â Â Â Â Â Â Â Â Â Âcompile_regexp(p, opt);
> Â Â Â Â Â Â Â Â Â Â Â Âbreak;
> + Â Â Â Â Â Â Â case GREP_LNO:
> + Â Â Â Â Â Â Â Â Â Â Â parse_lno(p, opt);
> + Â Â Â Â Â Â Â Â Â Â Â break;
> Â Â Â Â Â Â Â Âdefault:
> Â Â Â Â Â Â Â Â Â Â Â Âopt->extended = 1;
> Â Â Â Â Â Â Â Â Â Â Â Âbreak;
> @@ -297,6 +310,7 @@ static void free_pattern_expr(struct grep_expr *x)
> Â Â Â Âswitch (x->node) {
> Â Â Â Âcase GREP_NODE_TRUE:
> Â Â Â Âcase GREP_NODE_ATOM:
> + Â Â Â case GREP_NODE_LNO:
> Â Â Â Â Â Â Â Âbreak;
> Â Â Â Âcase GREP_NODE_NOT:
> Â Â Â Â Â Â Â Âfree_pattern_expr(x->u.unary);
> @@ -436,6 +450,21 @@ static struct {
> Â Â Â Â{ "committer ", 10 },
> Â};
>
> +static int match_lno(struct grep_pat *p, char *bol, char *eol, unsigned lno,
> + Â Â Â Â Â Â Â Â Â Âregmatch_t *pmatch)
> +{
> + Â Â Â if (p->u.lno == lno) {
> + Â Â Â Â Â Â Â /*
> + Â Â Â Â Â Â Â Â* because coloring will stop at so == eo, match at the end
> + Â Â Â Â Â Â Â Â* of line, so that the whole line can be colored
> + Â Â Â Â Â Â Â Â*/
> + Â Â Â Â Â Â Â pmatch->rm_so = eol - bol;
> + Â Â Â Â Â Â Â pmatch->rm_eo = eol - bol;
> + Â Â Â Â Â Â Â return 1;
> + Â Â Â }
> + Â Â Â return 0;
> +}
> +
> Âstatic int match_one_pattern(struct grep_pat *p, char *bol, char *eol,
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â unsigned lno, enum grep_context ctx,
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â regmatch_t *pmatch, int eflags)
> @@ -444,6 +473,9 @@ static int match_one_pattern(struct grep_pat *p, char *bol, char *eol,
> Â Â Â Âint saved_ch = 0;
> Â Â Â Âconst char *start = bol;
>
> + Â Â Â if (p->token == GREP_LNO)
> + Â Â Â Â Â Â Â return match_lno(p, bol, eol, lno, pmatch);
> +
> Â Â Â Âif ((p->token != GREP_PATTERN) &&
> Â Â Â Â Â Â((p->token == GREP_PATTERN_HEAD) != (ctx == GREP_CONTEXT_HEAD)))
> Â Â Â Â Â Â Â Âreturn 0;
> @@ -614,6 +646,7 @@ static int next_match(struct grep_opt *opt, char *bol, char *eol, unsigned lno,
> Â Â Â Â Â Â Â Â Â Â Â Âcase GREP_PATTERN: /* atom */
> Â Â Â Â Â Â Â Â Â Â Â Âcase GREP_PATTERN_HEAD:
> Â Â Â Â Â Â Â Â Â Â Â Âcase GREP_PATTERN_BODY:
> + Â Â Â Â Â Â Â Â Â Â Â case GREP_LNO:
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Âhit |= match_next_pattern(p, bol, eol, lno, ctx,
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Âpmatch, eflags);
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Âbreak;
> diff --git a/grep.h b/grep.h
> index 9912c11..41821f3 100644
> --- a/grep.h
> +++ b/grep.h
> @@ -10,7 +10,8 @@ enum grep_pat_token {
> Â Â Â ÂGREP_OPEN_PAREN,
> Â Â Â ÂGREP_CLOSE_PAREN,
> Â Â Â ÂGREP_NOT,
> - Â Â Â GREP_OR
> + Â Â Â GREP_OR,
> + Â Â Â GREP_LNO

Maybe GREP_LINE_NR?


> Â};
>
> Âenum grep_context {
> @@ -34,6 +35,7 @@ struct grep_pat {
> Â Â Â Âenum grep_header_field field;
> Â Â Â Âunion {
> Â Â Â Â Â Â Â Âregex_t regexp;
> + Â Â Â Â Â Â Â unsigned lno;
> Â Â Â Â} u;
> Â Â Â Âunsigned fixed:1;
> Â Â Â Âunsigned ignore_case:1;
> @@ -45,7 +47,8 @@ enum grep_expr_node {
> Â Â Â ÂGREP_NODE_NOT,
> Â Â Â ÂGREP_NODE_AND,
> Â Â Â ÂGREP_NODE_TRUE,
> - Â Â Â GREP_NODE_OR
> + Â Â Â GREP_NODE_OR,
> + Â Â Â GREP_NODE_LNO
> Â};
>
> Âstruct grep_expr {
> --
> 1.7.5.349.gfeb1a
>
> --
> To unsubscribe from this list: send the line "unsubscribe git" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at Âhttp://vger.kernel.org/majordomo-info.html
>
ÿô.nlj·Ÿ®‰­†+%ŠË±é¥Šwÿº{.nlj· ŠßžØn‡r¡öë¨è&£ûz¹Þúzf£¢·hšˆ§~†­†Ûÿÿïÿ‘ê_èæ+v‰¨þ)ßø

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]