#! /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 () { 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"); } }