test-ellipses.pl
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:3k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. #!/usr/local/bin/perl -w
  2. use strict;
  3. # $Id: test-ellipses.pl,v 1.1 1998/03/09 07:32:53 rousskov Exp $
  4. #
  5. # Replaces printf-like function calls with printf and compiles with gcc -Wall
  6. #    to catch %-escape bugs.
  7. #
  8. # params
  9. die(&usage()) unless @ARGV;
  10. # globals
  11. my @FileNames = ();
  12. my $CC = 'gcc';
  13. my $CFlags = '-Wall -I../include -I. -DDEFAULT_CONFIG_FILE="config"'; #default
  14. my $TmpDir = '/tmp';
  15. my $ErrCount = 0;
  16. exit(&main() == 0);
  17. sub main {
  18.     # find compiler options
  19.     my ($fnames, $options) = split(/--/, join('|', @ARGV));
  20.     @FileNames = split(/|/, $fnames);
  21.     die(&usage()) unless @FileNames;
  22.     $CFlags = join(' ', split(/|/, $options)) if defined $options;
  23.     warn("Warning: no -Wall in cflags '$CFlags'n") unless $CFlags =~ /Q-WallE/;
  24.     mkdir($TmpDir, umask()) unless -d $TmpDir;
  25.     foreach (@FileNames) {
  26. &processFile($_);
  27.     }
  28.     warn("Found $ErrCount potential error(s)n");
  29.     return scalar @FileNames;
  30. }
  31. sub processFile {
  32.     my $fname = shift;
  33.     # test that the file is compilable
  34.     my $cmd = "$CC $CFlags -c $fname -o /dev/null";
  35.     my $result = `$cmd 2>&1`;
  36.     if ($result) {
  37. warn("Warning: '$cmd' produced this output:n$resultn");
  38. warn("Warning: skipping potentially un-compileable file: $fnamen");
  39. return;
  40.     }
  41.     my $fname_tmp = "$TmpDir/test-elipses.tmp.c";
  42.     # replace printf-likes with printf
  43.     open(IFH, "<$fname") or die("cannot open $fname: $!, stopped");
  44.     open(OFH, ">$fname_tmp") or die("cannot create $fname_tmp: $!, stopped");
  45.     $/ = ';';
  46.     my $line;
  47.     while (defined($line = <IFH>)) {
  48. # comments are a disaster
  49. # next if $line =~ m|Q/*E|;
  50. # debug
  51. next if $line =~ s|debug(d+,s+d+)s*|/*$&*/ printf|;
  52. # other (e.g., storeAppendPrintf) with '?' before format
  53. next if $line =~ s@w+[pP]rintfs*((?![)])(n|[^;"])+?s+"@/*$&*/ printf(1 ? "@;
  54. # other (e.g., storeAppendPrintf)
  55. next if $line =~ s@w+[pP]rintfs*((?![)])(n|[^;"])+"@/*$&*/ printf("@;
  56.     } continue {
  57. print(OFH $line);
  58.     }
  59.     close(IFH);
  60.     close(OFH) or die("cannot close $fname_tmp: $!, stopped");
  61.     # compile
  62.     $cmd = "$CC $CFlags -c $fname_tmp -o /dev/null";
  63.     # warn("Exec: '$cmd'");
  64.     open(CFH, "$cmd 2>&1 |") or die("cannot start '$cmd': $!, stopped");
  65.     $/ = "n";
  66.     $| = 0;
  67.     # read errors, restore file name, print;
  68.     while (defined($line = <CFH>)) {
  69. if ($line =~ s/Q$fname_tmpE/$fname/g) {
  70.     $ErrCount++ if $line =~ /(warning|error)/i;
  71. }
  72. print($line);
  73.     }
  74.     (close(CFH) || !$!) or die("cannot close '$cmd': $!, stopped");
  75. }
  76. sub usage {
  77.     my $buf = << "USAGE";
  78. usage: $0 <file.c> ... -- [cflags]
  79. USAGE
  80.     return $buf;
  81. }