Don't mention bug fixes that are queued up for 3.0.8.
[rsync/rsync.git] / packaging / var-checker
CommitLineData
01e293f1 1#!/usr/bin/perl
93465f51
WD
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.
c5d77e96
WD
5
6use strict;
01e293f1 7use warnings;
c5d77e96 8
93465f51 9my %add_syscall_c = map { $_ => 1 } qw( t_stub.c t_unsafe.c tls.c trimslash.c );
adc2476f 10my %add_compat_c = map { $_ => 1 } qw( t_stub.c tls.c trimslash.c wildtest.c );
93465f51
WD
11my %add_util_c = map { $_ => 1 } qw( t_stub.c t_unsafe.c );
12my %sizes;
13
14open(IN, '<', 'syscall.c') or die $!;
15undef $/; my $syscall_c = <IN>; $/ = "\n";
16close IN;
17$syscall_c =~ s/^extern\s.*//mg;
18
adc2476f
WD
19open(IN, '<', 'lib/compat.c') or die $!;
20undef $/; my $compat_c = <IN>; $/ = "\n";
21close IN;
22$compat_c =~ s/^extern\s.*//mg;
23
93465f51
WD
24open(IN, '<', 'util.c') or die $!;
25undef $/; my $util_c = <IN>; $/ = "\n";
26close IN;
27$util_c =~ s/^extern\s.*//mg;
28
c5d77e96
WD
29my @files = glob('*.c');
30
31foreach my $fn (@files) {
93465f51 32 open(IN, '<', $fn) or die $!;
c5d77e96
WD
33 undef $/; $_ = <IN>; $/ = "\n";
34 close IN;
93465f51
WD
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};
adc2476f 40 $_ .= $compat_c if $add_compat_c{$fn};
93465f51
WD
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
49exit;
50
51# The file's contents are in $_.
52sub 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 }
c5d77e96
WD
82 }
83}