Output an FERROR* for a general io_error, and an FWARNING for other
[rsync/rsync.git] / packaging / var-checker
CommitLineData
93465f51
WD
1#!/usr/bin/perl -w
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;
7
93465f51
WD
8my %add_syscall_c = map { $_ => 1 } qw( t_stub.c t_unsafe.c tls.c trimslash.c );
9my %add_util_c = map { $_ => 1 } qw( t_stub.c t_unsafe.c );
10my %sizes;
11
12open(IN, '<', 'syscall.c') or die $!;
13undef $/; my $syscall_c = <IN>; $/ = "\n";
14close IN;
15$syscall_c =~ s/^extern\s.*//mg;
16
17open(IN, '<', 'util.c') or die $!;
18undef $/; my $util_c = <IN>; $/ = "\n";
19close IN;
20$util_c =~ s/^extern\s.*//mg;
21
c5d77e96
WD
22my @files = glob('*.c');
23
24foreach my $fn (@files) {
93465f51 25 open(IN, '<', $fn) or die $!;
c5d77e96
WD
26 undef $/; $_ = <IN>; $/ = "\n";
27 close IN;
93465f51
WD
28
29 my @vars = /^(?!(?:extern|enum)\s)([a-zA-Z]\S*\s+.*);/mg;
30 my @externs = /^extern\s+(.*);/mg;
31
32 $_ .= $syscall_c if $add_syscall_c{$fn};
33 $_ .= $util_c if $add_util_c{$fn};
34 s/INFO_GTE/info_levels/g;
35 s/DEBUG_GTE/debug_levels/g;
36
37 check_vars($fn, 'var', @vars);
38 check_vars($fn, 'extern', @externs);
39}
40
41exit;
42
43# The file's contents are in $_.
44sub check_vars
45{
46 my $fn = shift;
47 my $type = shift;
48
49 foreach my $line (@_) {
50 $line =~ s/\s*\{.*\}//;
51 $line =~ s/\s*\(.*\)//;
52 foreach my $item (split(/\s*,\s*/, $line)) {
53 $item =~ s/\s*=.*//;
54 my $sz = $item =~ s/(\[.*?\])// ? $1 : '';
55 my($var) = $item =~ /([^*\s]+)$/;
56 if (!defined $var) {
57 print "Bogus match? ($item)\n";
58 next;
59 }
60 if ($sz) {
61 if (defined $sizes{$var}) {
62 if ($sizes{$var} ne $sz) {
63 print $fn, ' has inconsistent size for "', $var,
64 "\": $sizes{$var} vs $sz\n";
65 }
66 } else {
67 $sizes{$var} = $sz;
68 }
69 }
70 my @matches = /(?<!\sstruct )\b(\Q$var\E)(?!\w)/g;
71 push(@matches, /(\QSIGACTION(\E)/g) if $var eq 'sigact';
72 print $fn, " has extraneous $type: \"", $var, "\"\n" if @matches == 1;
73 }
c5d77e96
WD
74 }
75}