|  | #! /usr/bin/perl -w | 
|  |  | 
|  | # Copyright 2002 Patrik Stridvall | 
|  | # | 
|  | # This library is free software; you can redistribute it and/or | 
|  | # modify it under the terms of the GNU Lesser General Public | 
|  | # License as published by the Free Software Foundation; either | 
|  | # version 2.1 of the License, or (at your option) any later version. | 
|  | # | 
|  | # This library 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 | 
|  | # Lesser General Public License for more details. | 
|  | # | 
|  | # You should have received a copy of the GNU Lesser General Public | 
|  | # License along with this library; if not, write to the Free Software | 
|  | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | 
|  | # | 
|  |  | 
|  | use strict; | 
|  |  | 
|  | BEGIN { | 
|  | $0 =~ m%^(.*?/?tools)/winapi/winapi_cleanup$%; | 
|  | require "$1/winapi/setup.pm"; | 
|  | } | 
|  |  | 
|  | use config qw($current_dir $wine_dir file_absolutize file_directory); | 
|  | use output qw($output); | 
|  | use winapi_cleanup_options qw($options); | 
|  |  | 
|  | use nativeapi qw($nativeapi); | 
|  | use util qw(edit_file); | 
|  |  | 
|  | if($options->progress) { | 
|  | $output->enable_progress; | 
|  | } else { | 
|  | $output->disable_progress; | 
|  | } | 
|  |  | 
|  | ######################################################################## | 
|  | # cleanup_file | 
|  |  | 
|  | sub cleanup_file($$$) { | 
|  | local *IN = shift; | 
|  | local *OUT = shift; | 
|  |  | 
|  | my $file = shift; | 
|  | my $dir = do { | 
|  | my $file2 = file_absolutize($file); | 
|  | my $dir = file_directory($file2); | 
|  | "$wine_dir/$dir"; | 
|  | }; | 
|  |  | 
|  | my $indent; | 
|  | my @comments = (); | 
|  | my $format_comments = sub { | 
|  | local $_ = ""; | 
|  | if ($#comments == 0) { | 
|  | my $comment = $comments[0]; | 
|  |  | 
|  | $_ = "$indent/*$comment */"; | 
|  | } elsif ($#comments > 0) { | 
|  | $_ = "$indent/*\n"; | 
|  | foreach my $comment (@comments) { | 
|  | $_ .= "$indent *$comment\n"; | 
|  | } | 
|  | $_ .= "$indent */"; | 
|  | } | 
|  | $indent = ""; | 
|  | @comments = (); | 
|  |  | 
|  | return $_; | 
|  | }; | 
|  |  | 
|  | my $in_comment = 0; | 
|  | my $modified = 0; | 
|  | while (<IN>) { | 
|  | chomp; | 
|  |  | 
|  | if ($options->trailing_whitespace) { | 
|  | s/(.*?)\s+$/$1/ && do { $modified = 1; }; | 
|  | } else { | 
|  | s/(.*?)\r$/$1/ && do { $modified = 1; }; | 
|  | } | 
|  |  | 
|  | if ($options->cpp_comments) { | 
|  | if ($in_comment) { | 
|  | if(/^.*?\*\//) { | 
|  | $in_comment = 0; | 
|  | } | 
|  | } elsif (/^([^\"\/]*?(?:\"[^\"]*?\"[^\"]*?)*?)\/\*(.*?)$/) { | 
|  | my $indent2 = $1; | 
|  | my $comment = $2; | 
|  | if($comment !~ /^.*?\*\//) { | 
|  | $in_comment = 1; | 
|  | } | 
|  | } elsif (/^([^\"\/]*?(?:\"[^\"]*?\"[^\"]*?)*?)\/\/(.*?)\s*$/) { | 
|  | my $indent2 = $1; | 
|  | my $comment = $2; | 
|  |  | 
|  | if ($indent2 =~ /^\s*$/) { | 
|  | if (!$indent || $indent eq $indent2) { | 
|  | $indent = $indent2; | 
|  | push @comments, $comment; | 
|  | next; | 
|  | } else { | 
|  | $_ .= "$indent2/*$comment */"; | 
|  | } | 
|  | } else { | 
|  | my $comments = &$format_comments(); | 
|  | if ($comments) { | 
|  | $_  = "$comments\n$indent2/*$comment */"; | 
|  | } else { | 
|  | $_  = "$indent2/*$comment */"; | 
|  | } | 
|  |  | 
|  | $modified = 1; | 
|  | } | 
|  | } else { | 
|  | my $comments = &$format_comments(); | 
|  | if ($comments) { | 
|  | $_  = "$comments\n$_"; | 
|  | $modified = 1; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | if ($options->include_quotes) { | 
|  | my $module = ""; | 
|  | if ($dir =~ m%^$wine_dir/dlls/(.*?)/.*?$%) { | 
|  | $module = $1; | 
|  | } | 
|  |  | 
|  | if (/^(\s*\#\s*include\s+)(?:<(.*?)>|\"(.*?)\")(.*?)\s*$/) { | 
|  | my $prefix = $1; | 
|  | my $header = $2 || $3; | 
|  | my $local = !defined($2) && defined($3); | 
|  | my $suffix = $4; | 
|  |  | 
|  | my $exists_system = 0; { | 
|  | my @system_paths = qw(/usr/include /usr/local/include /usr/X11R6/include); | 
|  | foreach my $path (@system_paths) { | 
|  | $exists_system ||= (-e "$path/$header" || 0); | 
|  | } | 
|  | $exists_system ||= $nativeapi->is_conditional_header($header); | 
|  | } | 
|  |  | 
|  | my $exists_windows = 0; { | 
|  | if ($header !~ m%^wine/% && $header ne "config.h") { | 
|  | $exists_windows ||= (-e "$wine_dir/include/$header" || 0); | 
|  | } | 
|  | } | 
|  |  | 
|  | my $exists_wine = 0; { | 
|  | $exists_wine ||= ($header eq "config.h"); | 
|  |  | 
|  | if ($header =~ m%^wine/%) { | 
|  | $exists_wine ||= (-e "$wine_dir/include/$header" || 0); | 
|  | } | 
|  | } | 
|  |  | 
|  | my $exists_local = 0; { | 
|  | $exists_local ||= ($header eq "y.tab.h"); | 
|  |  | 
|  | my @local_paths = (); | 
|  | push @local_paths, "$dir" if $dir !~ m%^$wine_dir/include%; | 
|  | push @local_paths, "$wine_dir/dlls/$module" if $module; | 
|  | foreach my $path (@local_paths) { | 
|  | $exists_local ||= (-e "$path/$header" || 0); | 
|  | } | 
|  | } | 
|  |  | 
|  | if (!$exists_system && !$exists_windows && !$exists_wine && !$exists_local) { | 
|  | $output->write("warning: header '$header': doesn't exist\n"); | 
|  | } elsif (($exists_system + $exists_windows + $exists_wine + $exists_local) > 1) { | 
|  | if ($header !~ /^(?:async\.h|comcat\.h|sql(?:ext|types)?\.h|thread\.h|user\.h)$/) { | 
|  | $output->write("warning: header '$header': more than one possibillity\n"); | 
|  | } | 
|  | } | 
|  |  | 
|  | if (!$local && $exists_local) { | 
|  | $_ = "$prefix\"$header\"$suffix"; | 
|  | $modified = 1; | 
|  | } elsif ($local && !$exists_local && ($exists_system || $exists_windows || $exists_wine)) { | 
|  | $_ = "$prefix<$header>$suffix"; | 
|  | $modified = 1; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | print OUT "$_\n"; | 
|  | } | 
|  |  | 
|  | my $comments = &$format_comments(); | 
|  | if ($comments) { | 
|  | print OUT "$comments\n"; | 
|  | $modified = 1; | 
|  | } | 
|  |  | 
|  | return $modified; | 
|  | } | 
|  |  | 
|  | ######################################################################## | 
|  | # main | 
|  |  | 
|  | my @h_files = $options->h_files; | 
|  | my @c_files = $options->c_files; | 
|  |  | 
|  | my $progress_output; | 
|  | my $progress_current = 0; | 
|  | my $progress_max = scalar(@h_files) + scalar(@c_files); | 
|  |  | 
|  | foreach my $file (@h_files) { | 
|  | $progress_current++; | 
|  | $output->progress("$file (file $progress_current of $progress_max)"); | 
|  | $output->prefix("$file: "); | 
|  |  | 
|  | if (edit_file($file, \&cleanup_file, @_, $file)) { | 
|  | $output->write("$file: modified\n"); | 
|  | } | 
|  | } | 
|  |  | 
|  | foreach my $file (@c_files) { | 
|  | $progress_current++; | 
|  | $output->progress("$file (file $progress_current of $progress_max)"); | 
|  | $output->prefix("$file: "); | 
|  |  | 
|  | if (edit_file($file, \&cleanup_file, $file)) { | 
|  | $output->write("$file: modified\n"); | 
|  | } | 
|  | } |