| #!/usr/bin/perl -w | |
| # Copyright 2001 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_fixup$%; | |
| require "$1/winapi/setup.pm"; | |
| } | |
| use config qw( | |
| file_type files_filter | |
| file_skip files_skip | |
| file_normalize | |
| get_spec_files | |
| $current_dir $wine_dir $winapi_dir $winapi_check_dir | |
| ); | |
| use output qw($output); | |
| use winapi_fixup_options qw($options); | |
| if($options->progress) { | |
| $output->enable_progress; | |
| } else { | |
| $output->disable_progress; | |
| } | |
| use winapi_c_parser; | |
| use c_parser; | |
| use type; | |
| use winapi_fixup_documentation qw(fixup_documentation); | |
| use winapi_fixup_editor; | |
| use winapi_fixup_statements qw(fixup_statements); | |
| my @c_files = $options->c_files; | |
| @c_files = files_skip(@c_files); | |
| @c_files = files_filter("winelib", @c_files); | |
| my $progress_output; | |
| my $progress_current = 0; | |
| my $progress_max = scalar(@c_files); | |
| foreach my $file (@c_files) { | |
| my $editor = new winapi_fixup_editor($file); | |
| $progress_current++; | |
| $output->progress("$file (file $progress_current of $progress_max)"); | |
| $output->prefix("$file:"); | |
| { | |
| open(IN, "< $file"); | |
| local $/ = undef; | |
| $_ = <IN>; | |
| close(IN); | |
| } | |
| my $max_line = 0; | |
| { | |
| local $_ = $_; | |
| while(s/^.*?\n//) { $max_line++; } | |
| if($_) { $max_line++; } | |
| } | |
| my $parser; | |
| if (1) { | |
| $parser = new c_parser($file); | |
| } else { | |
| $parser = new winapi_c_parser($file); | |
| } | |
| my $function; | |
| my $line; | |
| my $update_output = sub { | |
| my $progress = ""; | |
| my $prefix = ""; | |
| $progress .= "$file (file $progress_current of $progress_max)"; | |
| $prefix .= "$file:"; | |
| if(defined($function)) { | |
| my $name = $function->name; | |
| my $begin_line = $function->begin_line; | |
| my $begin_column = $function->begin_column; | |
| $progress .= ": function $name"; | |
| $prefix .= "$begin_line.$begin_column: function $name: "; | |
| } | |
| if(defined($line)) { | |
| $progress .= ": line $line of $max_line"; | |
| } | |
| $output->progress($progress); | |
| $output->prefix($prefix); | |
| }; | |
| my $found_preprocessor = sub { | |
| my $begin_line = shift; | |
| my $begin_column = shift; | |
| my $preprocessor = shift; | |
| # $output->write("$begin_line.$begin_column: preprocessor: $preprocessor\n"); | |
| return 1; | |
| }; | |
| $parser->set_found_preprocessor_callback($found_preprocessor); | |
| my $found_comment = sub { | |
| my $begin_line = shift; | |
| my $begin_column = shift; | |
| my $comment = shift; | |
| # $output->write("$begin_line.$begin_column: comment: $comment\n"); | |
| return 1; | |
| }; | |
| $parser->set_found_comment_callback($found_comment); | |
| my $found_line = sub { | |
| $line = shift; | |
| # local $_ = shift; | |
| &$update_output; | |
| # $output->progress("$file: line $line of ?"); | |
| }; | |
| $parser->set_found_line_callback($found_line); | |
| my $found_declaration = sub { | |
| my $begin_line = shift; | |
| my $begin_column = shift; | |
| my $end_line = shift; | |
| my $end_column = shift; | |
| my $declaration = shift; | |
| # $output->write("$begin_line.$begin_column-$end_line.$end_column: declaration: \\\n$declaration\n"); | |
| return 1; | |
| }; | |
| $parser->set_found_declaration_callback($found_declaration); | |
| my $found_function = sub { | |
| $function = shift; | |
| &$update_output; | |
| my $name = $function->name; | |
| my $begin_line = $function->begin_line; | |
| my $begin_column = $function->begin_column; | |
| my $end_line = $function->end_line; | |
| my $end_column = $function->end_column; | |
| if($options->documentation) { | |
| # fixup_documentation($function, $editor); | |
| } | |
| if($options->statements) { | |
| fixup_statements($function, $editor); | |
| } | |
| my $statements = $function->statements; | |
| if(!defined($statements)) { | |
| $function = undef; | |
| $output->prefix("$file: "); | |
| } else { | |
| # $output->write("$begin_line.$begin_column-$end_line.$end_column: function $name\n"); | |
| } | |
| return 0; | |
| }; | |
| $parser->set_found_function_callback($found_function); | |
| my $found_variable = sub { | |
| my $begin_line = shift; | |
| my $begin_column = shift; | |
| my $linkage = shift; | |
| my $type = shift; | |
| my $name = shift; | |
| # $output->write("$begin_line.$begin_column: $linkage $type $name = /* ... */\n"); | |
| return 1; | |
| }; | |
| $parser->set_found_variable_callback($found_variable); | |
| my $found_function_call = sub { | |
| my $begin_line = shift; | |
| my $begin_column = shift; | |
| my $end_line = shift; | |
| my $end_column = shift; | |
| my $name = shift; | |
| my $arguments = shift; | |
| $output->write("$begin_line.$begin_column-$end_line.$end_column: $name(" . join(", ", @$arguments) . ")\n"); | |
| return 1; | |
| }; | |
| $parser->set_found_function_call_callback($found_function_call); | |
| { | |
| my $line = 1; | |
| my $column = 0; | |
| if(!$parser->parse_c_file(\$_, \$line, \$column)) { | |
| $output->write("can't parse file\n"); | |
| } | |
| } | |
| $output->prefix(""); | |
| $editor->flush; | |
| } |