Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 1 | # |
| 2 | # Copyright 1999, 2000, 2001 Patrik Stridvall |
| 3 | # |
| 4 | # This library is free software; you can redistribute it and/or |
| 5 | # modify it under the terms of the GNU Lesser General Public |
| 6 | # License as published by the Free Software Foundation; either |
| 7 | # version 2.1 of the License, or (at your option) any later version. |
| 8 | # |
| 9 | # This library is distributed in the hope that it will be useful, |
| 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 12 | # Lesser General Public License for more details. |
| 13 | # |
| 14 | # You should have received a copy of the GNU Lesser General Public |
| 15 | # License along with this library; if not, write to the Free Software |
Jonathan Ernst | 360a3f9 | 2006-05-18 14:49:52 +0200 | [diff] [blame] | 16 | # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 17 | # |
| 18 | |
Patrik Stridvall | 7d0f2ba | 2001-02-12 03:44:41 +0000 | [diff] [blame] | 19 | package winapi_documentation; |
| 20 | |
| 21 | use strict; |
| 22 | |
Patrik Stridvall | b59a9c7 | 2001-07-12 22:22:05 +0000 | [diff] [blame] | 23 | use config qw($current_dir $wine_dir); |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 24 | use modules qw($modules); |
Patrik Stridvall | bda5074 | 2001-07-14 00:48:41 +0000 | [diff] [blame] | 25 | use nativeapi qw($nativeapi); |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 26 | use options qw($options); |
| 27 | use output qw($output); |
| 28 | use winapi qw($win16api $win32api @winapis); |
Patrik Stridvall | b59a9c7 | 2001-07-12 22:22:05 +0000 | [diff] [blame] | 29 | |
Patrik Stridvall | 7d0f2ba | 2001-02-12 03:44:41 +0000 | [diff] [blame] | 30 | my %comment_width; |
| 31 | my %comment_indent; |
| 32 | my %comment_spacing; |
| 33 | |
Francois Gouget | 493d60f | 2004-10-07 18:53:56 +0000 | [diff] [blame] | 34 | sub check_documentation($) { |
Patrik Stridvall | 47a99e1 | 2001-07-08 20:33:20 +0000 | [diff] [blame] | 35 | local $_; |
| 36 | |
Patrik Stridvall | 7d0f2ba | 2001-02-12 03:44:41 +0000 | [diff] [blame] | 37 | my $function = shift; |
| 38 | |
Patrik Stridvall | b59a9c7 | 2001-07-12 22:22:05 +0000 | [diff] [blame] | 39 | my $file = $function->file; |
Patrik Stridvall | 7d0f2ba | 2001-02-12 03:44:41 +0000 | [diff] [blame] | 40 | my $external_name16 = $function->external_name16; |
| 41 | my $external_name32 = $function->external_name32; |
| 42 | my $internal_name = $function->internal_name; |
Patrik Stridvall | b59a9c7 | 2001-07-12 22:22:05 +0000 | [diff] [blame] | 43 | my $module16 = $function->module16; |
| 44 | my $module32 = $function->module32; |
| 45 | my $ordinal16 = $function->ordinal16; |
| 46 | my $ordinal32 = $function->ordinal32; |
Patrik Stridvall | 7d0f2ba | 2001-02-12 03:44:41 +0000 | [diff] [blame] | 47 | my $documentation = $function->documentation; |
Patrik Stridvall | 47a99e1 | 2001-07-08 20:33:20 +0000 | [diff] [blame] | 48 | my $documentation_line = $function->documentation_line; |
Patrik Stridvall | 7d0f2ba | 2001-02-12 03:44:41 +0000 | [diff] [blame] | 49 | |
Patrik Stridvall | c3e8ac3 | 2001-07-11 17:27:45 +0000 | [diff] [blame] | 50 | my $documentation_error = 0; |
| 51 | my $documentation_warning = 0; |
Alexandre Julliard | 7cae558 | 2002-06-01 02:55:48 +0000 | [diff] [blame] | 52 | if($options->documentation_name || |
Patrik Stridvall | 47a99e1 | 2001-07-08 20:33:20 +0000 | [diff] [blame] | 53 | $options->documentation_ordinal || |
Alexandre Julliard | 7cae558 | 2002-06-01 02:55:48 +0000 | [diff] [blame] | 54 | $options->documentation_pedantic) |
Patrik Stridvall | 47a99e1 | 2001-07-08 20:33:20 +0000 | [diff] [blame] | 55 | { |
| 56 | my @winapis = ($win16api, $win32api); |
| 57 | my @modules = ($module16, $module32); |
| 58 | my @external_names = ($external_name16, $external_name32); |
Patrik Stridvall | b59a9c7 | 2001-07-12 22:22:05 +0000 | [diff] [blame] | 59 | my @ordinals = ($ordinal16, $ordinal32); |
Patrik Stridvall | 47a99e1 | 2001-07-08 20:33:20 +0000 | [diff] [blame] | 60 | while( |
| 61 | defined(my $winapi = shift @winapis) && |
| 62 | defined(my $external_name = shift @external_names) && |
Patrik Stridvall | b59a9c7 | 2001-07-12 22:22:05 +0000 | [diff] [blame] | 63 | defined(my $module = shift @modules) && |
| 64 | defined(my $ordinal = shift @ordinals)) |
Patrik Stridvall | 7d0f2ba | 2001-02-12 03:44:41 +0000 | [diff] [blame] | 65 | { |
Patrik Stridvall | b59a9c7 | 2001-07-12 22:22:05 +0000 | [diff] [blame] | 66 | if($winapi->is_function_stub_in_module($module, $internal_name)) { next; } |
Patrik Stridvall | 47a99e1 | 2001-07-08 20:33:20 +0000 | [diff] [blame] | 67 | |
| 68 | my @external_name = split(/\s*\&\s*/, $external_name); |
| 69 | my @modules = split(/\s*\&\s*/, $module); |
Patrik Stridvall | b59a9c7 | 2001-07-12 22:22:05 +0000 | [diff] [blame] | 70 | my @ordinals = split(/\s*\&\s*/, $ordinal); |
Patrik Stridvall | 47a99e1 | 2001-07-08 20:33:20 +0000 | [diff] [blame] | 71 | |
| 72 | my $pedantic_failed = 0; |
Alexandre Julliard | 7cae558 | 2002-06-01 02:55:48 +0000 | [diff] [blame] | 73 | while(defined(my $external_name = shift @external_name) && |
| 74 | defined(my $module = shift @modules) && |
| 75 | defined(my $ordinal = shift @ordinals)) |
Patrik Stridvall | 47a99e1 | 2001-07-08 20:33:20 +0000 | [diff] [blame] | 76 | { |
| 77 | my $found_name = 0; |
| 78 | my $found_ordinal = 0; |
Patrik Stridvall | 0704650f | 2002-07-19 00:31:05 +0000 | [diff] [blame] | 79 | |
| 80 | $module =~ s/\.(acm|dll|drv|exe|ocx)$//; # FIXME: Kludge |
Patrik Stridvall | 5379c79 | 2002-07-23 01:59:09 +0000 | [diff] [blame] | 81 | $module = "kernel" if $module eq "krnl386"; # FIXME: Kludge |
| 82 | |
Patrik Stridvall | 47a99e1 | 2001-07-08 20:33:20 +0000 | [diff] [blame] | 83 | foreach (split(/\n/, $documentation)) { |
| 84 | if(/^(\s*)\*(\s*)(\@|\S+)(\s*)([\(\[])(\w+)\.(\@|\d+)([\)\]])/) { |
| 85 | my $external_name2 = $3; |
| 86 | my $module2 = $6; |
| 87 | my $ordinal2 = $7; |
| 88 | |
Patrik Stridvall | de306f2 | 2002-09-24 18:27:47 +0000 | [diff] [blame] | 89 | if ($winapi->function_wine_extension(lc($module2), $external_name2)) { |
Patrik Stridvall | c5f834c | 2003-08-08 21:04:17 +0000 | [diff] [blame] | 90 | # $output->write("documentation: $external_name2 (\U$module2\E.$ordinal2) is a Wine extension \\\n$documentation\n"); |
Patrik Stridvall | de306f2 | 2002-09-24 18:27:47 +0000 | [diff] [blame] | 91 | } |
Patrik Stridvall | 5379c79 | 2002-07-23 01:59:09 +0000 | [diff] [blame] | 92 | |
Alexandre Julliard | 7cae558 | 2002-06-01 02:55:48 +0000 | [diff] [blame] | 93 | if(length($1) != 1 || length($2) < 1 || |
Patrik Stridvall | 47a99e1 | 2001-07-08 20:33:20 +0000 | [diff] [blame] | 94 | length($4) < 1 || $5 ne "(" || $8 ne ")") |
| 95 | { |
| 96 | $pedantic_failed = 1; |
| 97 | } |
| 98 | |
| 99 | if($external_name eq $external_name2) { |
| 100 | $found_name = 1; |
| 101 | if("\U$module\E" eq $module2 && |
| 102 | $ordinal eq $ordinal2) |
| 103 | { |
| 104 | $found_ordinal = 1; |
| 105 | } |
| 106 | } |
| 107 | } |
| 108 | } |
Patrik Stridvall | de306f2 | 2002-09-24 18:27:47 +0000 | [diff] [blame] | 109 | if((($options->documentation_name && !$found_name) || |
| 110 | ($options->documentation_ordinal && !$found_ordinal)) && |
Patrik Stridvall | c5f834c | 2003-08-08 21:04:17 +0000 | [diff] [blame] | 111 | !$winapi->is_function_stub($module, $external_name) && |
Patrik Stridvall | de306f2 | 2002-09-24 18:27:47 +0000 | [diff] [blame] | 112 | !$winapi->function_wine_extension($module, $external_name)) |
Patrik Stridvall | 47a99e1 | 2001-07-08 20:33:20 +0000 | [diff] [blame] | 113 | { |
Patrik Stridvall | c3e8ac3 | 2001-07-11 17:27:45 +0000 | [diff] [blame] | 114 | $documentation_error = 1; |
Patrik Stridvall | 47a99e1 | 2001-07-08 20:33:20 +0000 | [diff] [blame] | 115 | $output->write("documentation: expected $external_name (\U$module\E.$ordinal): \\\n$documentation\n"); |
| 116 | } |
Alexandre Julliard | 7cae558 | 2002-06-01 02:55:48 +0000 | [diff] [blame] | 117 | |
Patrik Stridvall | 47a99e1 | 2001-07-08 20:33:20 +0000 | [diff] [blame] | 118 | } |
| 119 | if($options->documentation_pedantic && $pedantic_failed) { |
Patrik Stridvall | c3e8ac3 | 2001-07-11 17:27:45 +0000 | [diff] [blame] | 120 | $documentation_warning = 1; |
Patrik Stridvall | 47a99e1 | 2001-07-08 20:33:20 +0000 | [diff] [blame] | 121 | $output->write("documentation: pedantic failed: \\\n$documentation\n"); |
Patrik Stridvall | 20ca001 | 2001-06-19 03:34:52 +0000 | [diff] [blame] | 122 | } |
Patrik Stridvall | 7d0f2ba | 2001-02-12 03:44:41 +0000 | [diff] [blame] | 123 | } |
| 124 | } |
| 125 | |
Patrik Stridvall | c3e8ac3 | 2001-07-11 17:27:45 +0000 | [diff] [blame] | 126 | if(!$documentation_error && $options->documentation_wrong) { |
Patrik Stridvall | 47a99e1 | 2001-07-08 20:33:20 +0000 | [diff] [blame] | 127 | foreach (split(/\n/, $documentation)) { |
Francois Gouget | 8f3187b | 2007-06-12 17:50:20 +0200 | [diff] [blame] | 128 | if (/^\s*\*\s*(\S+)\s*[\(\[]\s*(\w+(?:\.(?:DRV|EXE|OCX|VXD))?)\s*\.\s*([^\s\)\]]*)\s*[\)\]].*?$/) { |
Patrik Stridvall | 47a99e1 | 2001-07-08 20:33:20 +0000 | [diff] [blame] | 129 | my $external_name = $1; |
| 130 | my $module = $2; |
| 131 | my $ordinal = $3; |
Patrik Stridvall | 7d0f2ba | 2001-02-12 03:44:41 +0000 | [diff] [blame] | 132 | |
Patrik Stridvall | 9c39156 | 2004-02-20 19:57:42 +0000 | [diff] [blame] | 133 | if ($ordinal eq "@") { |
| 134 | # Nothing |
| 135 | } elsif ($ordinal =~ /^\d+$/) { |
Patrik Stridvall | 0704650f | 2002-07-19 00:31:05 +0000 | [diff] [blame] | 136 | $ordinal = int($ordinal); |
Patrik Stridvall | 9c39156 | 2004-02-20 19:57:42 +0000 | [diff] [blame] | 137 | } elsif ($ordinal eq "init") { |
| 138 | $ordinal = 0; |
| 139 | } else { |
Francois Gouget | 5391408 | 2007-02-20 15:50:49 +0100 | [diff] [blame] | 140 | $output->write("documentation: invalid ordinal for $external_name (\U$module\E.$ordinal)\n"); |
Patrik Stridvall | 9c39156 | 2004-02-20 19:57:42 +0000 | [diff] [blame] | 141 | next; |
Patrik Stridvall | 0704650f | 2002-07-19 00:31:05 +0000 | [diff] [blame] | 142 | } |
| 143 | |
Patrik Stridvall | 47a99e1 | 2001-07-08 20:33:20 +0000 | [diff] [blame] | 144 | my $found = 0; |
| 145 | foreach my $entry2 (winapi::get_all_module_internal_ordinal($internal_name)) { |
| 146 | (my $external_name2, my $module2, my $ordinal2) = @$entry2; |
Patrik Stridvall | b59a9c7 | 2001-07-12 22:22:05 +0000 | [diff] [blame] | 147 | |
Patrik Stridvall | 0704650f | 2002-07-19 00:31:05 +0000 | [diff] [blame] | 148 | my $_module2 = $module2; |
| 149 | $_module2 =~ s/\.(acm|dll|drv|exe|ocx)$//; # FIXME: Kludge |
Patrik Stridvall | 5379c79 | 2002-07-23 01:59:09 +0000 | [diff] [blame] | 150 | $_module2 = "kernel" if $_module2 eq "krnl386"; # FIXME: Kludge |
Patrik Stridvall | 0704650f | 2002-07-19 00:31:05 +0000 | [diff] [blame] | 151 | |
Patrik Stridvall | 47a99e1 | 2001-07-08 20:33:20 +0000 | [diff] [blame] | 152 | if($external_name eq $external_name2 && |
Patrik Stridvall | 0704650f | 2002-07-19 00:31:05 +0000 | [diff] [blame] | 153 | lc($module) eq $_module2 && |
Patrik Stridvall | b59a9c7 | 2001-07-12 22:22:05 +0000 | [diff] [blame] | 154 | $ordinal eq $ordinal2 && |
| 155 | ($external_name2 eq "@" || |
| 156 | ($win16api->is_module($module2) && !$win16api->is_function_stub_in_module($module2, $external_name2)) || |
Patrik Stridvall | de306f2 | 2002-09-24 18:27:47 +0000 | [diff] [blame] | 157 | ($win32api->is_module($module2) && !$win32api->is_function_stub_in_module($module2, $external_name2))) || |
Patrik Stridvall | b59a9c7 | 2001-07-12 22:22:05 +0000 | [diff] [blame] | 158 | $modules->is_allowed_module_in_file($module2, "$current_dir/$file")) |
Patrik Stridvall | 47a99e1 | 2001-07-08 20:33:20 +0000 | [diff] [blame] | 159 | { |
| 160 | $found = 1; |
Patrik Stridvall | 0704650f | 2002-07-19 00:31:05 +0000 | [diff] [blame] | 161 | last; |
Patrik Stridvall | 47a99e1 | 2001-07-08 20:33:20 +0000 | [diff] [blame] | 162 | } |
Patrik Stridvall | de306f2 | 2002-09-24 18:27:47 +0000 | [diff] [blame] | 163 | |
| 164 | |
Patrik Stridvall | 47a99e1 | 2001-07-08 20:33:20 +0000 | [diff] [blame] | 165 | } |
Patrik Stridvall | 9c39156 | 2004-02-20 19:57:42 +0000 | [diff] [blame] | 166 | |
Francois Gouget | 5391408 | 2007-02-20 15:50:49 +0100 | [diff] [blame] | 167 | if (!$found && $external_name ne "DllMain" && $ordinal ne "0") { |
| 168 | $output->write("documentation: $external_name (\U$module\E.$ordinal) not declared in the spec file\n"); |
Patrik Stridvall | 7d0f2ba | 2001-02-12 03:44:41 +0000 | [diff] [blame] | 169 | } |
| 170 | } |
| 171 | } |
Patrik Stridvall | 7d0f2ba | 2001-02-12 03:44:41 +0000 | [diff] [blame] | 172 | } |
| 173 | |
| 174 | if($options->documentation_comment_indent) { |
Patrik Stridvall | c3e8ac3 | 2001-07-11 17:27:45 +0000 | [diff] [blame] | 175 | foreach (split(/\n/, $documentation)) { |
| 176 | if(/^\s*\*(\s*)\S+(\s*)[\(\[]\s*\w+\s*\.\s*[^\s\)\]]*\s*[\)\]].*?$/) { |
| 177 | my $indent = $1; |
| 178 | my $spacing = $2; |
Alexandre Julliard | 7cae558 | 2002-06-01 02:55:48 +0000 | [diff] [blame] | 179 | |
Patrik Stridvall | c3e8ac3 | 2001-07-11 17:27:45 +0000 | [diff] [blame] | 180 | $indent =~ s/\t/ /g; |
| 181 | $indent = length($indent); |
Alexandre Julliard | 7cae558 | 2002-06-01 02:55:48 +0000 | [diff] [blame] | 182 | |
Patrik Stridvall | c3e8ac3 | 2001-07-11 17:27:45 +0000 | [diff] [blame] | 183 | $spacing =~ s/\t/ /g; |
| 184 | $spacing = length($spacing); |
Alexandre Julliard | 7cae558 | 2002-06-01 02:55:48 +0000 | [diff] [blame] | 185 | |
Patrik Stridvall | c3e8ac3 | 2001-07-11 17:27:45 +0000 | [diff] [blame] | 186 | $comment_indent{$indent}++; |
| 187 | if($indent >= 20) { |
| 188 | $output->write("documentation: comment indent is $indent\n"); |
| 189 | } |
| 190 | $comment_spacing{$spacing}++; |
Patrik Stridvall | 7d0f2ba | 2001-02-12 03:44:41 +0000 | [diff] [blame] | 191 | } |
Patrik Stridvall | 7d0f2ba | 2001-02-12 03:44:41 +0000 | [diff] [blame] | 192 | } |
| 193 | } |
| 194 | |
| 195 | if($options->documentation_comment_width) { |
| 196 | if($documentation =~ /(^\/\*\*+)/) { |
| 197 | my $width = length($1); |
| 198 | |
| 199 | $comment_width{$width}++; |
| 200 | if($width <= 65 || $width >= 81) { |
| 201 | $output->write("comment is $width columns wide\n"); |
| 202 | } |
| 203 | } |
| 204 | } |
| 205 | |
| 206 | if($options->documentation_arguments) { |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 207 | my $refargument_documentations = $function->argument_documentations; |
| 208 | |
| 209 | if(defined($refargument_documentations)) { |
| 210 | my $n = 0; |
| 211 | for my $argument_documentation (@$refargument_documentations) { |
| 212 | $n++; |
| 213 | if($argument_documentation ne "") { |
Patrik Stridvall | c5f834c | 2003-08-08 21:04:17 +0000 | [diff] [blame] | 214 | if($argument_documentation !~ /^\/\*\s+\[(?:in|out|in\/out|\?\?\?|I|O|I\/O)\].*?\*\/$/s) { |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 215 | $output->write("argument $n documentation: \\\n$argument_documentation\n"); |
| 216 | } |
Patrik Stridvall | 7d0f2ba | 2001-02-12 03:44:41 +0000 | [diff] [blame] | 217 | } |
| 218 | } |
| 219 | } |
| 220 | } |
| 221 | } |
| 222 | |
Francois Gouget | 493d60f | 2004-10-07 18:53:56 +0000 | [diff] [blame] | 223 | sub report_documentation() { |
Patrik Stridvall | 7d0f2ba | 2001-02-12 03:44:41 +0000 | [diff] [blame] | 224 | if($options->documentation_comment_indent) { |
| 225 | foreach my $indent (sort(keys(%comment_indent))) { |
| 226 | my $count = $comment_indent{$indent}; |
| 227 | $output->write("*.c: $count functions have comment that is indented $indent\n"); |
| 228 | } |
| 229 | } |
| 230 | |
| 231 | if($options->documentation_comment_width) { |
| 232 | foreach my $width (sort(keys(%comment_width))) { |
| 233 | my $count = $comment_width{$width}; |
| 234 | $output->write("*.c: $count functions have comments of width $width\n"); |
| 235 | } |
| 236 | } |
| 237 | } |
| 238 | |
| 239 | 1; |