Annotation of embedaddon/rsync/packaging/var-checker, revision 1.1.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>