File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / rsync / packaging / var-checker
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Fri Feb 17 15:09:30 2012 UTC (12 years, 4 months ago) by misho
Branches: rsync, MAIN
CVS tags: v3_1_2p5, rsync3_0_9p0, RSYNC3_1_0, RSYNC3_0_9, HEAD
rsync

    1: #!/usr/bin/perl
    2: # This script checks the *.c files for extraneous "extern" variables,
    3: # for vars that are defined but not used, and for inconsistent array
    4: # sizes.  Run it from inside the main rsync directory.
    5: 
    6: use strict;
    7: use warnings;
    8: 
    9: my %add_syscall_c = map { $_ => 1 } qw( t_stub.c t_unsafe.c tls.c trimslash.c );
   10: my %add_compat_c = map { $_ => 1 } qw( t_stub.c tls.c trimslash.c wildtest.c );
   11: my %add_util_c = map { $_ => 1 } qw( t_stub.c t_unsafe.c );
   12: my %sizes;
   13: 
   14: open(IN, '<', 'syscall.c') or die $!;
   15: undef $/; my $syscall_c = <IN>; $/ = "\n";
   16: close IN;
   17: $syscall_c =~ s/^extern\s.*//mg;
   18: 
   19: open(IN, '<', 'lib/compat.c') or die $!;
   20: undef $/; my $compat_c = <IN>; $/ = "\n";
   21: close IN;
   22: $compat_c =~ s/^extern\s.*//mg;
   23: 
   24: open(IN, '<', 'util.c') or die $!;
   25: undef $/; my $util_c = <IN>; $/ = "\n";
   26: close IN;
   27: $util_c =~ s/^extern\s.*//mg;
   28: 
   29: my @files = glob('*.c');
   30: 
   31: foreach my $fn (@files) {
   32:     open(IN, '<', $fn) or die $!;
   33:     undef $/; $_ = <IN>; $/ = "\n";
   34:     close IN;
   35: 
   36:     my @vars = /^(?!(?:extern|enum)\s)([a-zA-Z]\S*\s+.*);/mg;
   37:     my @externs = /^extern\s+(.*);/mg;
   38: 
   39:     $_ .= $syscall_c if $add_syscall_c{$fn};
   40:     $_ .= $compat_c if $add_compat_c{$fn};
   41:     $_ .= $util_c if $add_util_c{$fn};
   42:     s/INFO_GTE/info_levels/g;
   43:     s/DEBUG_GTE/debug_levels/g;
   44: 
   45:     check_vars($fn, 'var', @vars);
   46:     check_vars($fn, 'extern', @externs);
   47: }
   48: 
   49: exit;
   50: 
   51: # The file's contents are in $_.
   52: sub check_vars
   53: {
   54:     my $fn = shift;
   55:     my $type = shift;
   56: 
   57:     foreach my $line (@_) {
   58: 	$line =~ s/\s*\{.*\}//;
   59: 	$line =~ s/\s*\(.*\)//;
   60: 	foreach my $item (split(/\s*,\s*/, $line)) {
   61: 	    $item =~ s/\s*=.*//;
   62: 	    my $sz = $item =~ s/(\[.*?\])// ? $1 : '';
   63: 	    my($var) = $item =~ /([^*\s]+)$/;
   64: 	    if (!defined $var) {
   65: 		print "Bogus match? ($item)\n";
   66: 		next;
   67: 	    }
   68: 	    if ($sz) {
   69: 		if (defined $sizes{$var}) {
   70: 		    if ($sizes{$var} ne $sz) {
   71: 			print $fn, ' has inconsistent size for "', $var,
   72: 			    "\": $sizes{$var} vs $sz\n";
   73: 		    }
   74: 		} else {
   75: 		    $sizes{$var} = $sz;
   76: 		}
   77: 	    }
   78: 	    my @matches = /(?<!\sstruct )\b(\Q$var\E)(?!\w)/g;
   79: 	    push(@matches, /(\QSIGACTION(\E)/g) if $var eq 'sigact';
   80: 	    print $fn, " has extraneous $type: \"", $var, "\"\n" if @matches == 1;
   81: 	}
   82:     }
   83: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>