I’d like to do a search for simple if statements in a collection of C source files.
These are statements of the form:
if (condition)
statement;
Any amount of white space or other sequences (e.g. “} else “) might appear on the same line before the if. Comments may appear between the “if (condition)” and “statement;”.
I want to exclude compound statements of the form:
if (condition)
{
statement;
statement;
}
I’ve tried each of the following in awk:
awk '/if \(.*\)[^{]+;/ {print NR $0}' file.c # (A) No results
awk '/if \(.*\)[^{]+/ {print NR $0}' file.c # (B)
awk '/if \(.*\)/ {print NR $0}' file.c # (C)
(B) and (C) give different results. Both include items I’m looking for and items I want to exclude. Part of the problem, obviously, is how to deal with patterns that span multiple lines.
Edge cases (badly formed comments, odd indenting or curly braces in odd places, etc.) can be ignored.
How can I accomplish this?
I’m not sure how you’d do this with a one liner (I’m sure you could by using sed’s ‘n’ command to read the next line, but it would be very complicated), so you probably want to use a script for this. How about:
Where parse_if.pl contains:
I’m sure you could do something fairly easily in any other language (including awk) if you wanted to; I just thought that I could do it quickest in perl by way of an example.