| #!/usr/bin/perl -w |
| |
| # Copyright 1999 Patrik Stridvall |
| |
| use strict; |
| |
| BEGIN { |
| require "tools/winapi_check/winapi.pm"; |
| require "tools/winapi_check/nativeapi.pm"; |
| require "tools/winapi_check/winapi_local.pm"; |
| require "tools/winapi_check/winapi_global.pm"; |
| require "tools/winapi_check/winapi_options.pm"; |
| require "tools/winapi_check/winapi_parser.pm"; |
| |
| import winapi; |
| import nativeapi; |
| import winapi_local; |
| import winapi_global; |
| import winapi_options; |
| import winapi_parser; |
| } |
| |
| my $options = winapi_options->new(\@ARGV); |
| if($options->help) { |
| $options->show_help; |
| exit; |
| } |
| |
| my $win16api = 'winapi'->new("win16", "tools/winapi_check/win16api.dat"); |
| my $win32api = 'winapi'->new("win32", "tools/winapi_check/win32api.dat"); |
| 'winapi'->read_spec_files($win16api, $win32api); |
| |
| my $nativeapi = 'nativeapi'->new("tools/winapi_check/nativeapi.dat"); |
| |
| for my $name ($win32api->all_functions) { |
| my $module16 = $win16api->function_module($name); |
| my $module32 = $win32api->function_module($name); |
| |
| if(defined($module16)) { |
| $win16api->found_shared_function($name); |
| $win32api->found_shared_function($name); |
| |
| if($options->shared) { |
| print "*.spec: $name: is shared between $module16 (Win16) and $module32 (Win32)\n"; |
| } |
| } |
| } |
| |
| foreach my $file ($options->files) { |
| my $found_function = sub { |
| my $return_type = shift; |
| my $calling_convention = shift; |
| my $name = shift; |
| my $refarguments = shift; |
| my @arguments = @$refarguments; |
| |
| if($options->global) { |
| $win16api->found_type($return_type) if $options->win16; |
| $win32api->found_type($return_type) if $options->win32; |
| for my $argument (@arguments) { |
| $win16api->found_type($argument) if $options->win16; |
| $win32api->found_type($argument) if $options->win32; |
| } |
| |
| $win16api->found_function($name) if $options->win16; |
| $win32api->found_function($name) if $options->win32; |
| } |
| |
| if($options->local) { |
| my $module16 = $win16api->function_module($name); |
| my $module32 = $win32api->function_module($name); |
| my $output = sub { |
| my $module = shift; |
| return sub { |
| my $msg = shift; |
| print "$file: $module: $return_type $calling_convention $name(" . join(",", @arguments) . "): $msg\n"; |
| } |
| }; |
| my $output16 = &$output($module16); |
| my $output32 = &$output($module32); |
| |
| if($options->argument) { |
| if($options->win16 && $options->report_module($module16)) { |
| winapi_local::check_arguments $options, $output16, |
| $return_type, $calling_convention, $name, [@arguments], $win16api; |
| } |
| if($options->win32 && $options->report_module($module32)) { |
| winapi_local::check_arguments $options, $output32, |
| $return_type, $calling_convention, $name, [@arguments], $win32api; |
| } |
| } |
| if($options->misplaced) { |
| my $module; |
| if($file =~ m'^dlls/(.*)/') { |
| $module = $1; |
| } |
| |
| if($options->win16 && $options->report_module($module16)) { |
| if(!defined($module) || $module ne $module16) { |
| &$output16("function misplaced"); |
| } |
| } |
| |
| if($options->win32 && $options->report_module($module32)) { |
| if(!defined($module) || $module ne $module32) { |
| &$output32("function misplaced"); |
| } |
| } |
| } |
| } |
| }; |
| winapi_parser::parse_c_file $options, $file, $found_function; |
| } |
| |
| if($options->global) { |
| winapi_global::check $options, $win16api, $nativeapi if $options->win16; |
| winapi_global::check $options, $win32api, $nativeapi if $options->win32; |
| } |