| #!/usr/bin/perl |
| |
| # |
| # Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. |
| # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| # |
| # This code is free software; you can redistribute it and/or modify it |
| # under the terms of the GNU General Public License version 2 only, as |
| # published by the Free Software Foundation. |
| # |
| # This code is distributed in the hope that it will be useful, but WITHOUT |
| # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| # version 2 for more details (a copy is included in the LICENSE file that |
| # accompanied this code). |
| # |
| # You should have received a copy of the GNU General Public License version |
| # 2 along with this work; if not, write to the Free Software Foundation, |
| # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| # |
| # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| # or visit www.oracle.com if you need additional information or have any |
| # questions. |
| # |
| |
| # |
| # Parses java files: |
| # 1. Removes from the end of lines spaces and TABs |
| # 2. Replaces TABs by spaces |
| # 3. Replaces all NewLine separators by Unix NewLine separators |
| # 4. Makes one and only one empty line at the end of each file |
| |
| if ($#ARGV < 0) { |
| &usage; |
| |
| die; |
| } |
| |
| use Cwd 'abs_path'; |
| |
| my @extensions = ("java"); |
| |
| # Read options |
| my $dirpos = 0; |
| |
| while ($dirpos < $#ARGV) { |
| if ($ARGV[$dirpos] eq "-e") { |
| @extensions = split(/,/, $ARGV[$dirpos + 1]); |
| } else { |
| last; |
| } |
| |
| $dirpos += 2; |
| } |
| |
| if ($dirpos > $#ARGV) { |
| &usage; |
| |
| die; |
| } |
| |
| use Cwd; |
| my $currdir = getcwd; |
| |
| my $allfiles = 0; |
| |
| my $filecount = 0; |
| |
| my @tabvalues; |
| |
| # Init tabvalues |
| push (@tabvalues, " "); |
| |
| for (my $i = 1; $i < 8; $i++) { |
| push(@tabvalues, $tabvalues[$i - 1] . " "); |
| } |
| |
| open(FILELIST, ">$currdir/filelist") or die "Failed while open $currdir/filelist: $!\n"; |
| |
| while ($dirpos <= $#ARGV) { |
| use File::Find; |
| |
| find(\&parse_file, abs_path($ARGV[$dirpos])); |
| |
| $dirpos += 1; |
| } |
| |
| close(FILELIST); |
| |
| use Cwd 'chdir'; |
| chdir $currdir; |
| |
| print "Checked $allfiles file(s)\n"; |
| print "Modified $filecount file(s)\n"; |
| print "See results in the file $currdir/filelist\n"; |
| |
| sub parse_file { |
| my $filename = $File::Find::name; |
| |
| # Skip directories |
| return if -d; |
| |
| # Skip SCCS files |
| return if ($filename =~ /\/SCCS\//); |
| |
| # Skip files with invalid extensions |
| my $accepted = 0; |
| foreach my $ext (@extensions) { |
| if ($_ =~ /\.$ext$/i) { |
| $accepted = 1; |
| |
| last; |
| } |
| } |
| return if ($accepted == 0); |
| |
| use File::Basename; |
| my $dirname = dirname($filename); |
| |
| use Cwd 'chdir'; |
| chdir $dirname; |
| |
| open(FILE, $filename) or die "Failed while open $filename: $!\n"; |
| |
| # Read file |
| my @content; |
| my $line; |
| my $emptylinescount = 0; |
| my $modified = 0; |
| |
| while ($line = <FILE>) { |
| my $originalline = $line; |
| |
| # Process line |
| |
| # Remove from the end of the line spaces and return character |
| while ($line =~ /\s$/) { |
| chop($line); |
| } |
| |
| # Replace TABs |
| for (my $i = 0; $i < length($line); $i++) { |
| if (substr($line, $i, 1) =~ /\t/) { |
| $line = substr($line, 0, $i) . $tabvalues[7 - ($i % 8)] . substr($line, $i + 1); |
| } |
| } |
| |
| if (length($line) == 0) { |
| $emptylinescount++; |
| } else { |
| while ($emptylinescount > 0) { |
| push(@content, ""); |
| |
| $emptylinescount--; |
| } |
| |
| push(@content, $line); |
| } |
| |
| if ($originalline ne ($line . "\n")) { |
| $modified = 1; |
| } |
| |
| } |
| |
| $allfiles++; |
| |
| if ($emptylinescount > 0) { |
| $modified = 1; |
| } |
| |
| close(FILE); |
| |
| if ($modified != 0) { |
| # Write file |
| open(FILE, ">$filename") or die "Failed while open $filename: $!\n"; |
| |
| for (my $i = 0; $i <= $#content; $i++) { |
| print FILE "$content[$i]\n"; |
| } |
| |
| close(FILE); |
| |
| # Print name from current dir |
| if (index($filename, $currdir) == 0) { |
| print FILELIST substr($filename, length($currdir) + 1); |
| } else { |
| print FILELIST $filename; |
| } |
| print FILELIST "\n"; |
| |
| $filecount++; |
| |
| print "$filename: modified\n"; |
| } |
| } |
| |
| sub usage { |
| print "Usage:\n"; |
| print " normalizer.pl [-options] <dir> [dir2 dir3 ...]\n"; |
| print " Available options:\n"; |
| print " -e comma separated files extensions. By default accepts only java files\n"; |
| print "\n"; |
| print "Examples:\n"; |
| print " normalizer.pl -e c,cpp,h,hpp .\n"; |
| } |