aks@anywhere.ucsb.edu (Alan Stebbens) (05/02/91)
The following is a perl program to list, with optional indentions
and line numbers, the `cpp' conditionals: #ifdef, #elif, #else, #endif.
I wrote this because I was unsuccessfully trying to find a missing
#ifdef in some newly patched software.
Enjoy.
Alan Stebbens <aks@hub.ucsb.edu> (805) 893-3221
Center for Computational Sciences and Engineering (CCSE)
University of California, Santa Barbara (UCSB)
3111 Engineering I, Santa Barbara, CA 93106
============================= cut here ===================================
#!/bin/perl
# ifdefs [-n] [-i INDENT] [-l]
require 'getopts.pl';
&Getopts('i:nl') || die "Usage: ifdefs [-i indent] [-l] [-n] [files...]\n";
$INDENT = $opt_i ? $opt_i : 3;
$indent = 0;
@block = ();
@state = (0);
# States: 0 - nothing; 1 = #if ; 2 = #elsif ; 3 = #else
select(STDOUT); $| = 1;
while (<>) {
if (/^#\s*(if|ifn?def|elif|elsif|elseif|else|endif)/) {
$key = $1;
s/[ \t]+/ /g;
$nextindent = $indent;
if ($key eq 'if' || $key =~ /ifn?def/) {
$state[$indent] = 1;
$block[$indent] = "$key $.";
$state[++$nextindent] = 0;
} elsif ($key eq 'elseif' || $key eq 'elsif' || $key eq 'elif') {
$indent--;
&Error if !$indent || $state[$indent] < 1 || $state[$indent] > 2;
$block[$indent] = "$key $.";
$state[$indent] = 2;
} elsif ($key eq 'else') {
&Error if !$indent;
$indent--;
&Error if $state[$indent] < 1 || $state[$indent] > 2;
$state[$indent] = 3;
$block[$indent] = "$key $.";
} elsif ($key eq 'endif') {
&Error if !$indent || $state[$indent];
$indent--;
&Error if !$state[$indent];
$state[$indent] = 0;
$block[$indent] = '';
$nextindent--;
}
} else {
next unless $opt_l;
}
printf "%4d:",$. if $opt_n;
printf "%s%s",(' 'x($indent * $INDENT)),$_;
$indent = $nextindent;
}
sub Error {
if (!$indent) {
printf "ERROR: Unmatched \#%s:\n%4d: %s",$key,$.,$_;
} else {
printf "ERROR: Out of place \#%s:\n%4d: %s",$key,$.,$_;
($keyw,$keyl) = split(' ',$block[$indent]);
printf "Previous \#%s at line %d not terminated\n",$keyw,+$keyl;
}
next;
}
============================= cut here ===================================
--
Alan Stebbens