The branch, master has been updated via f7746d00 A couple extra function checks for future features. via 96a6ea0f Convert another packaging script to python3. from 62427861 A few superficial tweaks.
https://git.samba.org/?p=rsync.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit f7746d0000ac5c72974ad90a8d746561dc8cd10a Author: Wayne Davison <wa...@opencoder.net> Date: Wed Apr 29 22:14:49 2020 -0700 A couple extra function checks for future features. commit 96a6ea0f26886cfc427f852eca8321fbc9a7d055 Author: Wayne Davison <wa...@opencoder.net> Date: Wed Apr 29 21:24:26 2020 -0700 Convert another packaging script to python3. ----------------------------------------------------------------------- Summary of changes: configure.ac | 1 + packaging/var-checker | 162 ++++++++++++++++++++++++++------------------------ 2 files changed, 84 insertions(+), 79 deletions(-) Changeset truncated at 500 lines: diff --git a/configure.ac b/configure.ac index fef9004c..d4e95fb8 100644 --- a/configure.ac +++ b/configure.ac @@ -598,6 +598,7 @@ AC_FUNC_UTIME_NULL AC_FUNC_ALLOCA AC_CHECK_FUNCS(waitpid wait4 getcwd strdup chown chmod lchmod mknod mkfifo \ fchmod fstat ftruncate strchr readlink link utime utimes lutimes strftime \ + chflags getattrlist \ memmove lchown vsnprintf snprintf vasprintf asprintf setsid strpbrk \ strlcat strlcpy strtol mallinfo getgroups setgroups geteuid getegid \ setlocale setmode open64 lseek64 mkstemp64 mtrace va_copy __va_copy \ diff --git a/packaging/var-checker b/packaging/var-checker index 7c017252..6b472f71 100755 --- a/packaging/var-checker +++ b/packaging/var-checker @@ -1,83 +1,87 @@ -#!/usr/bin/perl +#!/usr/bin/python3 -B + # This script checks the *.c files for extraneous "extern" variables, # for vars that are defined but not used, and for inconsistent array # sizes. Run it from inside the main rsync directory. -use strict; -use warnings; - -my %add_syscall_c = map { $_ => 1 } qw( t_stub.c t_unsafe.c tls.c trimslash.c ); -my %add_compat_c = map { $_ => 1 } qw( t_stub.c tls.c trimslash.c wildtest.c ); -my %add_util_c = map { $_ => 1 } qw( t_stub.c t_unsafe.c ); -my %sizes; - -open(IN, '<', 'syscall.c') or die $!; -undef $/; my $syscall_c = <IN>; $/ = "\n"; -close IN; -$syscall_c =~ s/^extern\s.*//mg; - -open(IN, '<', 'lib/compat.c') or die $!; -undef $/; my $compat_c = <IN>; $/ = "\n"; -close IN; -$compat_c =~ s/^extern\s.*//mg; - -open(IN, '<', 'util.c') or die $!; -undef $/; my $util_c = <IN>; $/ = "\n"; -close IN; -$util_c =~ s/^extern\s.*//mg; - -my @files = glob('*.c'); - -foreach my $fn (@files) { - open(IN, '<', $fn) or die $!; - undef $/; $_ = <IN>; $/ = "\n"; - close IN; - - my @vars = /^(?!(?:extern|enum)\s)([a-zA-Z]\S*\s+.*);/mg; - my @externs = /^extern\s+(.*);/mg; - - $_ .= $syscall_c if $add_syscall_c{$fn}; - $_ .= $compat_c if $add_compat_c{$fn}; - $_ .= $util_c if $add_util_c{$fn}; - s/INFO_GTE/info_levels/g; - s/DEBUG_GTE/debug_levels/g; - - check_vars($fn, 'var', @vars); - check_vars($fn, 'extern', @externs); -} - -exit; - -# The file's contents are in $_. -sub check_vars -{ - my $fn = shift; - my $type = shift; - - foreach my $line (@_) { - $line =~ s/\s*\{.*\}//; - $line =~ s/\s*\(.*\)//; - foreach my $item (split(/\s*,\s*/, $line)) { - $item =~ s/\s*=.*//; - my $sz = $item =~ s/(\[.*?\])// ? $1 : ''; - my($var) = $item =~ /([^*\s]+)$/; - if (!defined $var) { - print "Bogus match? ($item)\n"; - next; - } - if ($sz) { - if (defined $sizes{$var}) { - if ($sizes{$var} ne $sz) { - print $fn, ' has inconsistent size for "', $var, - "\": $sizes{$var} vs $sz\n"; - } - } else { - $sizes{$var} = $sz; - } - } - my @matches = /(?<!\sstruct )\b(\Q$var\E)(?!\w)/g; - push(@matches, /(\QSIGACTION(\E)/g) if $var eq 'sigact'; - print $fn, " has extraneous $type: \"", $var, "\"\n" if @matches == 1; - } - } -} +import re, argparse, glob + +VARS_RE = re.compile(r'^(?!(?:extern|enum)\s)([a-zA-Z]\S*\s+.*);', re.M) +EXTERNS_RE = re.compile(r'^extern\s+(.*);', re.M) + +sizes = { } + +def main(): + add_syscall_c = set('t_stub.c t_unsafe.c tls.c trimslash.c'.split()) + add_util_c = set('t_stub.c t_unsafe.c'.split()) + + syscall_c = slurp_file('syscall.c', True) + util_c = slurp_file('util.c', True) + + for fn in sorted(glob.glob('*.c')): + txt = slurp_file(fn) + + var_list = parse_vars(fn, VARS_RE.findall(txt)) + extern_list = parse_vars(fn, EXTERNS_RE.findall(txt)) + if not var_list and not extern_list: + continue + + if fn in add_syscall_c: + txt += syscall_c + if fn in add_util_c: + txt += util_c + + txt = re.sub(r'INFO_GTE', 'info_levels ', txt) + txt = re.sub(r'DEBUG_GTE', 'debug_levels ', txt) + txt = re.sub(r'SIGACTION\(', 'sigact (', txt) + + find = '|'.join([ re.escape(x) for x in var_list + extern_list ]) + var_re = re.compile(r'(?<!\sstruct )\b(%s)(?!\w)' % find) + + found = { x: 0 for x in var_list + extern_list } + for var in var_re.findall(txt): + found[var] += 1 + + for var in sorted(var_list + extern_list): + if found[var] == 1: + vtype = 'var' if var in var_list else 'extern' + print(fn, f'has extraneous {vtype}: "{var}"') + + +def slurp_file(fn, drop_externs=False): + with open(fn, 'r', encoding='utf-8') as fh: + txt = fh.read() + if drop_externs: + txt = EXTERNS_RE.sub('', txt) + return txt + + +def parse_vars(fn, lines): + ret = [ ] + for line in lines: + line = re.sub(r'\s*\{.*\}', '', line) + line = re.sub(r'\s*\(.*\)', '', line) + for item in re.split(r'\s*,\s*', line): + item = re.sub(r'\s*=.*', '', item) + m = re.search(r'(?P<var>\w+)(?P<sz>\[.*?\])?$', item) + if not m: + print(f"Bogus match? ({item})") + continue + if m['sz']: + if m['var'] in sizes: + if sizes[m['var']] != m['sz']: + var = m['var'] + print(fn, f'has inconsistent size for "{var}":', m['sz'], 'vs', sizes[var]) + else: + sizes[m['var']] = m['sz'] + ret.append(m['var']) + return ret + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Check the *.c files for extraneous extern vars.', add_help=False) + parser.add_argument("--help", "-h", action="help", help="Output this help message and exit.") + args = parser.parse_args() + main() + +# vim: sw=4 et -- The rsync repository. _______________________________________________ rsync-cvs mailing list rsync-cvs@lists.samba.org https://lists.samba.org/mailman/listinfo/rsync-cvs