3736
Comment: description of how to use cvars tools
|
3217
some more bli2 parsed expressions
|
Deletions are marked like this. | Additions are marked like this. |
Line 22: | Line 22: |
|| bli2 pattern || echoed (description) || echoed literal || number of backrefs || || any space || optional space || [[:space:]]* || no backref || || \! || exclamation mark (because bash otherwise bangs) || ! || no backref || || @S || obligatory space || [[:space:]]+ || no backref || || @V || identifier || [[:alpha:]_]+[[:alnum:]_]* || no backref || || @K || identifier in only uppercases || [[:upper:]_]+[[:upper:][:digit:]_]* || no backref || || @Q || a non-alnumeric || [^[:alnum:]_] || no backref || || @Q2 || a non-alnumeric or extension to the left of a variable|| [^[:alnum:]_>.] || no backref || || @w || (pointer) member, array || see `bli2 "@w"' || one backref || || @d || any number || see `bli2 "@d"' || one backref || || \(...\) || up to 2 nested parentheses || see `bli2 "\(...\)"' || two backrefs || || \{...\} || up to 2 nested curly brackets || see `bli2 "\{...\}"' || two backrefs || || \[...\] || up to 2 nested square brackets || see `bli2 "\[...\]"' || two backrefs || || \(-..\) || characters optionally followed by up to 2 nested parentheses || see `bli2 "\(...\)"' || three backrefs || || \{-..\} || characters optionally followed by up to 2 curly brackets || see `bli2 "\{...\}"' || three backrefs || || \{.8.\} || up to 8 curly brackets || see `bli2 "\(...\)"' || eight backrefs || |
|| bli2 pattern || description of what is echoed || echoed string (literally) || number of back-references || || any space || optional space || {{{[[:space:]]*}}} || - || || \! || exclamation mark (because bash otherwise bangs) || ! || - || || @S || obligatory space || {{{[[:space:]]+}}} || - || || @V || identifier || {{{[[:alpha:]_]+[[:alnum:]_]*}}} || - || || @K || identifier in only uppercases || {{{[[:upper:]_]+[[:upper:][:digit:]_]*}}} || - || || @Q || a non-alnumeric || {{{[^[:alnum:]_]}}} || - || || @Q2 || a non-alnumeric or extension to the left of a variable|| {{{[^[:alnum:]_>.]}}} || - || || @w || (pointer) member, array || see `bli2 "@w"' || 1 || || @d || any number || bli2 "@d" || 1 || || @n || any number of lines, subsequent matches on the beginning of the next line || ([^\n]*\n)* || 1 || || \(...\) || up to 2 nested parentheses || bli2 "\(...\)" || 2 || || \{...\} || up to 2 nested curly brackets || bli2 "\{...\}" || 2 || || \[...\] || up to 2 nested square brackets || bli2 "\[...\]" || 2 || || \(-..\) || characters optionally followed by up to 2 nested parentheses || bli2 "\(-..\)" || 3 || || \{-..\} || characters optionally followed by up to 2 nested curly brackets || bli2 "\{-..\}" || 3 || || \{.8.\} || up to 8 nested curly brackets || bli2 "\(.8.\)" || 8 || || @...&|@ || prior conditions || bli2 "@...&|@" || 4 || || @&|...@ || later conditions || bli2 "@&|...@" || 4 || || @&|...&|@ || conditions inbetween || bli2 "@&|...&|@" || 4 || || @branch || a branch || bli2 "@branch" || 3 || || @in_branch || in a branch || bli2 "@in_branch" || 4 || |
Line 40: | Line 46: |
I wrote this to do a multiline (git-)grep lets say we want to search for an erroneous pattern like this: {{{ for (i = 0; i < n; i++) {} ... if (i > n) ... }}} We can match this with: {{{ gres -B1 -A40 "@V < @d ;" "for \( (@V) = @d ; \1 < (@d) ; \1 \+\+ \) \{.8.\}@n if \( \1 > \3 \)" }}} For me - I currently have kernel version 2.6.33-rc2 - this results after a few seconds in: {{{ -- ---[ vi drivers/mmc/host/s3cmci.c +1209 ]--- /* Set clock */ for (mci_psc = 0; mci_psc < 255; mci_psc++) { host->real_rate = host->clk_rate / (host->clk_div*(mci_psc+1)); if (host->real_rate <= ios->clock) break; } if (mci_psc > 255) mci_psc = 255; host->prescaler = mci_psc; writel(host->prescaler, host->base + S3C2410_SDIPRE); /* If requested clock is 0, real_rate will be 0, too */ if (ios->clock == 0) host->real_rate = 0; }}} So how does it work? gres does something in the order of: |
I wrote this to do a multiline (git-)grep, See [wiki:roelkluin/gres_examples examples]. gres does something in the order of: |
Line 78: | Line 50: |
The `-B1' and `-A40' are passed to git-grep, bli2() parses the first pattern and subsequent patterns are passed to ecsed2(). | with {{{`gres -B1 -A40 "pattern1" "pattern2" "..."'}}} the {{{`}}}-B1' and {{{`}}}-A40' are passed to git-grep, bli2() parses the first pattern to a extended regexp query. Subsequent patterns are passed to ecsed2() which are used to create a sed script. With this script, sed parses the `git grep' output and prints only the output of which the last - but not prior - patterns matched. |
Line 80: | Line 52: |
= ecsed2 = ecsed2() parses the `git grep' output and prints only the ones of which the last passed pattern matches, prior patterns (if any) are excluded. More in detail: {{{ gg -B1 -A40 "@V < @d ;" }}} The first of the `path/to/filename.c-301-' is transformed into a vi command, the remainder are removed. Also any comments are removed before pattern matching. newlines are extended. For each match that git grep piped to sed If an exclusion pattern matches or if before the first pattern matched an end-of-function- or end-of-match-pattern occurred, i.e. respectively "^}" and "^--", nothing is displayed. |
The sed script transforms the first of the {{{`}}}path/to/filename.c-301-' into a vi command, the remainder are removed. Until an end-of-function- or end-of-match-pattern occurs, lines are extended. Any comments are removed. For each match that `git grep' piped to sed, (parsed) matches are displayed '''if''' no exclusion pattern matched and the last pattern matched. |
You have to source [wiki:roelkluin/cvars cvars] to use these tools and run these commands in your git Linux kernel directory.
gg
gg does something like
git grep -n -E [other_options] "$(bli2 "$1")"
bli2
bli2() parses a string and transforms it into a more complex extended regexp, which it simply echoes.
To understand how it parses things try these:
bli2 "@V" bli2 "@d" bli2 " " bli2 " "
Note that @V will catch the identifier of a simple local variable, @d will catch a number (even if it's a hex or 1ull), spaces are squeezed and parsed to match optional spaces.
bli2 pattern |
description of what is echoed |
echoed string (literally) |
number of back-references |
any space |
optional space |
[[:space:]]* |
- |
\! |
exclamation mark (because bash otherwise bangs) |
! |
- |
@S |
obligatory space |
[[:space:]]+ |
- |
@V |
identifier |
[[:alpha:]_]+[[:alnum:]_]* |
- |
@K |
identifier in only uppercases |
[[:upper:]_]+[[:upper:][:digit:]_]* |
- |
@Q |
a non-alnumeric |
[^[:alnum:]_] |
- |
@Q2 |
a non-alnumeric or extension to the left of a variable |
[^[:alnum:]_>.] |
- |
@w |
(pointer) member, array |
see `bli2 "@w"' |
1 |
@d |
any number |
bli2 "@d" |
1 |
@n |
any number of lines, subsequent matches on the beginning of the next line |
([^\n]*\n)* |
1 |
\(...\) |
up to 2 nested parentheses |
bli2 "\(...\)" |
2 |
\{...\} |
up to 2 nested curly brackets |
bli2 "\{...\}" |
2 |
\[...\] |
up to 2 nested square brackets |
bli2 "\[...\]" |
2 |
\(-..\) |
characters optionally followed by up to 2 nested parentheses |
bli2 "\(-..\)" |
3 |
\{-..\} |
characters optionally followed by up to 2 nested curly brackets |
bli2 "\{-..\}" |
3 |
\{.8.\} |
up to 8 nested curly brackets |
bli2 "\(.8.\)" |
8 |
@...&|@ |
prior conditions |
bli2 "@...&|@" |
4 |
@&|...@ |
later conditions |
bli2 "@&|...@" |
4 |
@&|...&|@ |
conditions inbetween |
bli2 "@&|...&|@" |
4 |
@branch |
a branch |
bli2 "@branch" |
3 |
@in_branch |
in a branch |
bli2 "@in_branch" |
4 |
gres
I wrote this to do a multiline (git-)grep, See [wiki:roelkluin/gres_examples examples]. gres does something in the order of:
git grep -E -n -other_opts "$(bli2 "$1")" -- '*.c' '*.h' | sed -n -r "$(ecsed2 "${@:2})"
with `gres -B1 -A40 "pattern1" "pattern2" "..."' the `-B1' and `-A40' are passed to git-grep, bli2() parses the first pattern to a extended regexp query. Subsequent patterns are passed to ecsed2() which are used to create a sed script. With this script, sed parses the `git grep' output and prints only the output of which the last - but not prior - patterns matched.
The sed script transforms the first of the `path/to/filename.c-301-' into a vi command, the remainder are removed. Until an end-of-function- or end-of-match-pattern occurs, lines are extended. Any comments are removed. For each match that `git grep' piped to sed, (parsed) matches are displayed if no exclusion pattern matched and the last pattern matched.