Annotation of embedaddon/rsync/packaging/var-checker, revision 1.1

1.1     ! misho       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>