Size: 3736
Comment: description of how to use cvars tools
|
Size: 3808
Comment:
|
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 || see `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 || see `bli2 "\(...\)"' || 2 || || \{...\} || up to 2 nested curly brackets || see `bli2 "\{...\}"' || 2 || || \[...\] || up to 2 nested square brackets || see `bli2 "\[...\]"' || 2 || || \(-..\) || characters optionally followed by up to 2 nested parentheses || see `bli2 "\(...\)"' || 3 || || \{-..\} || characters optionally followed by up to 2 nested curly brackets || see `bli2 "\{...\}"' || 3 || || \{.8.\} || up to 8 nested curly brackets || see `bli2 "\(...\)"' || 8 || |
Line 48: | Line 49: |
We can match this with: | This is wrong because at the end of the loop i equals n and cannot be greater than n. We can match this with: |
Line 50: | Line 51: |
gres -B1 -A40 "@V < @d ;" "for \( (@V) = @d ; \1 < (@d) ; \1 \+\+ \) \{.8.\}@n if \( \1 > \3 \)" | gres -B1 -A40 "@V < @d ;" \ "for \( (@V) = @d ; \1 < (@d) ; \1 \+\+ \) \{.8.\} @n if \( \1 > \3 \)" |
Line 78: | Line 85: |
The `-B1' and `-A40' are passed to git-grep, bli2() parses the first pattern and subsequent patterns are passed to ecsed2(). | The {{{`}}}-B1' and {{{`}}}-A40' are passed to git-grep, bli2() parses the first pattern and subsequent patterns are passed to ecsed2(). |
Line 81: | Line 88: |
ecsed2() parses the `git grep' output and prints only the ones of which the last passed pattern matches, prior patterns (if any) are excluded. |
ecsed2() parses the `git grep' output and prints only the ones of which the last passed pattern matches, prior patterns (if any) are excluded. |
Line 84: | Line 90: |
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. |
More in detail, the first of the {{{`}}}path/to/filename.c-301-' is transformed 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 |
see `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 |
see `bli2 "\(...\)"' |
2 |
\{...\} |
up to 2 nested curly brackets |
see `bli2 "\{...\}"' |
2 |
\[...\] |
up to 2 nested square brackets |
see `bli2 "\[...\]"' |
2 |
\(-..\) |
characters optionally followed by up to 2 nested parentheses |
see `bli2 "\(...\)"' |
3 |
\{-..\} |
characters optionally followed by up to 2 nested curly brackets |
see `bli2 "\{...\}"' |
3 |
\{.8.\} |
up to 8 nested curly brackets |
see `bli2 "\(...\)"' |
8 |
gres
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) ...
This is wrong because at the end of the loop i equals n and cannot be greater than 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:
git grep -E -n -other_opts "$(bli2 "$1")" -- '*.c' '*.h' | sed -n -r "$(ecsed2 "${@:2})"
The `-B1' and `-A40' are passed to git-grep, bli2() parses the first pattern and subsequent patterns are passed to ecsed2().
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, the first of the `path/to/filename.c-301-' is transformed 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.