Add support for universal builds to vasnprintf.
[gnulib.git] / build-aux / useless-if-before-free
index 1cd5bc3..0bae2c4 100755 (executable)
@@ -2,7 +2,7 @@
 # Detect instances of "if (p) free (p);".
 # Likewise for "if (p != NULL) free (p);".  And with braces.
 
 # Detect instances of "if (p) free (p);".
 # Likewise for "if (p != NULL) free (p);".  And with braces.
 
-my $VERSION = '2008-02-10 19:36'; # UTC
+my $VERSION = '2008-05-25 17:36'; # UTC
 # The definition above must lie within the first 8 lines in order
 # for the Emacs time-stamp write hook (at end) to update it.
 # If you change this file with Emacs, please let the write hook
 # The definition above must lie within the first 8 lines in order
 # for the Emacs time-stamp write hook (at end) to update it.
 # If you change this file with Emacs, please let the write hook
@@ -31,6 +31,14 @@ use Getopt::Long;
 
 (my $ME = $0) =~ s|.*/||;
 
 
 (my $ME = $0) =~ s|.*/||;
 
+# use File::Coda; # http://meyering.net/code/Coda/
+END {
+  defined fileno STDOUT or return;
+  close STDOUT and return;
+  warn "$ME: failed to close standard output: $!\n";
+  $? ||= 1;
+}
+
 sub usage ($)
 {
   my ($exit_code) = @_;
 sub usage ($)
 {
   my ($exit_code) = @_;
@@ -51,6 +59,7 @@ detect free-like functions named FOO and BAR.
 
 OPTIONS:
 
 
 OPTIONS:
 
+   --list       print only the name of each matching FILE (\0-terminated)
    --name=N     add name N to the list of `free'-like functions to detect;
                   may be repeated
 
    --name=N     add name N to the list of `free'-like functions to detect;
                   may be repeated
 
@@ -59,8 +68,8 @@ OPTIONS:
 
 Exit status:
 
 
 Exit status:
 
-  0   no match
-  1   one or more matches
+  0   one or more matches
+  1   no match
   2   an error
 
 EXAMPLE:
   2   an error
 
 EXAMPLE:
@@ -76,16 +85,18 @@ EOF
 }
 
 {
 }
 
 {
-  sub EXIT_NO_MATCH {0}
-  sub EXIT_MATCH {1}
+  sub EXIT_MATCH {0}
+  sub EXIT_NO_MATCH {1}
   sub EXIT_ERROR {2}
   my $err = EXIT_NO_MATCH;
 
   sub EXIT_ERROR {2}
   my $err = EXIT_NO_MATCH;
 
+  my $list;
   my @name = qw(free);
   GetOptions
     (
      help => sub { usage 0 },
      version => sub { print "$ME version $VERSION\n"; exit },
   my @name = qw(free);
   GetOptions
     (
      help => sub { usage 0 },
      version => sub { print "$ME version $VERSION\n"; exit },
+     list => \$list,
      'name=s@' => \@name,
     ) or usage 1;
 
      'name=s@' => \@name,
     ) or usage 1;
 
@@ -102,6 +113,7 @@ EOF
   $/ = '"';
 
   my $found_match = 0;
   $/ = '"';
 
   my $found_match = 0;
+ FILE:
   foreach my $file (@ARGV)
     {
       open FH, '<', $file
   foreach my $file (@ARGV)
     {
       open FH, '<', $file
@@ -109,15 +121,28 @@ EOF
           $err = EXIT_ERROR, next;
       while (defined (my $line = <FH>))
         {
           $err = EXIT_ERROR, next;
       while (defined (my $line = <FH>))
         {
-          if ($line =~
-              /\b(if\s*\(\s*(\S+?)(?:\s*!=\s*NULL)?\s*\)
-               (?:   \s*$regexp\s*\(\s*\2\s*\)|
-                \s*\{\s*$regexp\s*\(\s*\2\s*\)\s*;\s*\}))/sx)
+          while ($line =~
+              /\b(if\s*\(\s*([^)]+?)(?:\s*!=\s*NULL)?\s*\)
+               (?:   \s*$regexp\s*\((?:\s*\([^)]+\))?\s*([^)]+)\)|
+                \s*\{\s*$regexp\s*\((?:\s*\([^)]+\))?\s*([^)]+)\)\s*;\s*\}))/sxg)
             {
             {
-              print "$file: $1\n";
-              $found_match = 1;
+              # Compare "if" expression and free'd expression,
+              # without regard to white space.
+              (my $e1 = $2) =~ tr/ \t//d;
+              my $e2 = defined $3 ? $3 : $4;
+              $e2 =~ tr/ \t//d;
+              if ($e1 eq $e2)
+                {
+                  $found_match = 1;
+                  $list
+                    and (print "$file\0"), next FILE;
+                  print "$file: $1\n";
+                }
             }
         }
             }
         }
+    }
+  continue
+    {
       close FH;
     }
 
       close FH;
     }
 
@@ -132,8 +157,12 @@ my $foo = <<'EOF';
 # This adjusts them, removing the unnecessary "if (p)" part.
 
 # FIXME: do something like this as an option (doesn't do braces):
 # This adjusts them, removing the unnecessary "if (p)" part.
 
 # FIXME: do something like this as an option (doesn't do braces):
-git ls-files -z |xargs -0 \
-perl -0x3b -pi -e 's/\bif\s*\(\s*(\S+?)(?:\s*!=\s*NULL)?\s*\)\s+(k?free\s*\(\s*\1\s*\))/$2/s'
+useless-if-before-free -l $(lid -knone free) | xargs -0 \
+  perl -0x3b -pi -e \
+   's/\bif\s*\(\s*(\S+?)(?:\s*!=\s*NULL)?\s*\)\s+(free\s*\((?:\s*\([^)]+\))?\s*\1\s*\))/$2/s'
+
+# Or, with git:
+git ls-files -z |xargs -0 perl -0x3b -pi -e '...'
 
 Be careful that the result of the above transformation is valid.
 If the matched string is followed by "else", then obviously, it won't be.
 
 Be careful that the result of the above transformation is valid.
 If the matched string is followed by "else", then obviously, it won't be.