blob: 36eb4386486aecd78b8b3e4a654f9b28502255ca [file] [log] [blame]
Patrik Stridvall7d0f2ba2001-02-12 03:44:41 +00001package winapi_documentation;
2
3use strict;
4
Patrik Stridvallb59a9c72001-07-12 22:22:05 +00005use config qw($current_dir $wine_dir);
Patrik Stridvallbda50742001-07-14 00:48:41 +00006use nativeapi qw($nativeapi);
Patrik Stridvallb59a9c72001-07-12 22:22:05 +00007
Patrik Stridvall7d0f2ba2001-02-12 03:44:41 +00008my %comment_width;
9my %comment_indent;
10my %comment_spacing;
11
12sub check_documentation {
Patrik Stridvall47a99e12001-07-08 20:33:20 +000013 local $_;
14
Patrik Stridvall7d0f2ba2001-02-12 03:44:41 +000015 my $options = shift;
16 my $output = shift;
17 my $win16api = shift;
18 my $win32api = shift;
Patrik Stridvallb59a9c72001-07-12 22:22:05 +000019 my $modules = shift;
Patrik Stridvall7d0f2ba2001-02-12 03:44:41 +000020 my $function = shift;
21
Patrik Stridvallb59a9c72001-07-12 22:22:05 +000022 my $file = $function->file;
Patrik Stridvall7d0f2ba2001-02-12 03:44:41 +000023 my $external_name16 = $function->external_name16;
24 my $external_name32 = $function->external_name32;
25 my $internal_name = $function->internal_name;
Patrik Stridvallb59a9c72001-07-12 22:22:05 +000026 my $module16 = $function->module16;
27 my $module32 = $function->module32;
28 my $ordinal16 = $function->ordinal16;
29 my $ordinal32 = $function->ordinal32;
Patrik Stridvall7d0f2ba2001-02-12 03:44:41 +000030 my $documentation = $function->documentation;
Patrik Stridvall47a99e12001-07-08 20:33:20 +000031 my $documentation_line = $function->documentation_line;
Patrik Stridvall7d0f2ba2001-02-12 03:44:41 +000032 my @argument_documentations = @{$function->argument_documentations};
33
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +000034 my $documentation_error = 0;
35 my $documentation_warning = 0;
Patrik Stridvall47a99e12001-07-08 20:33:20 +000036 if($options->documentation_name ||
37 $options->documentation_ordinal ||
38 $options->documentation_pedantic)
39 {
40 my @winapis = ($win16api, $win32api);
41 my @modules = ($module16, $module32);
42 my @external_names = ($external_name16, $external_name32);
Patrik Stridvallb59a9c72001-07-12 22:22:05 +000043 my @ordinals = ($ordinal16, $ordinal32);
Patrik Stridvall47a99e12001-07-08 20:33:20 +000044 while(
45 defined(my $winapi = shift @winapis) &&
46 defined(my $external_name = shift @external_names) &&
Patrik Stridvallb59a9c72001-07-12 22:22:05 +000047 defined(my $module = shift @modules) &&
48 defined(my $ordinal = shift @ordinals))
Patrik Stridvall7d0f2ba2001-02-12 03:44:41 +000049 {
Patrik Stridvallb59a9c72001-07-12 22:22:05 +000050 if($winapi->is_function_stub_in_module($module, $internal_name)) { next; }
Patrik Stridvall47a99e12001-07-08 20:33:20 +000051
52 my @external_name = split(/\s*\&\s*/, $external_name);
53 my @modules = split(/\s*\&\s*/, $module);
Patrik Stridvallb59a9c72001-07-12 22:22:05 +000054 my @ordinals = split(/\s*\&\s*/, $ordinal);
Patrik Stridvall47a99e12001-07-08 20:33:20 +000055
56 my $pedantic_failed = 0;
57 while(defined(my $external_name = shift @external_name) &&
58 defined(my $module = shift @modules) &&
59 defined(my $ordinal = shift @ordinals))
60 {
61 my $found_name = 0;
62 my $found_ordinal = 0;
63 foreach (split(/\n/, $documentation)) {
64 if(/^(\s*)\*(\s*)(\@|\S+)(\s*)([\(\[])(\w+)\.(\@|\d+)([\)\]])/) {
65 my $external_name2 = $3;
66 my $module2 = $6;
67 my $ordinal2 = $7;
68
69 if(length($1) != 1 || length($2) < 1 ||
70 length($4) < 1 || $5 ne "(" || $8 ne ")")
71 {
72 $pedantic_failed = 1;
73 }
74
75 if($external_name eq $external_name2) {
76 $found_name = 1;
77 if("\U$module\E" eq $module2 &&
78 $ordinal eq $ordinal2)
79 {
80 $found_ordinal = 1;
81 }
82 }
83 }
84 }
85 if(($options->documentation_name && !$found_name) ||
86 ($options->documentation_ordinal && !$found_ordinal))
87 {
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +000088 $documentation_error = 1;
Patrik Stridvall47a99e12001-07-08 20:33:20 +000089 $output->write("documentation: expected $external_name (\U$module\E.$ordinal): \\\n$documentation\n");
90 }
91
92 }
93 if($options->documentation_pedantic && $pedantic_failed) {
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +000094 $documentation_warning = 1;
Patrik Stridvall47a99e12001-07-08 20:33:20 +000095 $output->write("documentation: pedantic failed: \\\n$documentation\n");
Patrik Stridvall20ca0012001-06-19 03:34:52 +000096 }
Patrik Stridvall7d0f2ba2001-02-12 03:44:41 +000097 }
98 }
99
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +0000100 if(!$documentation_error && $options->documentation_wrong) {
Patrik Stridvall47a99e12001-07-08 20:33:20 +0000101 foreach (split(/\n/, $documentation)) {
102 if(/^\s*\*\s*(\S+)\s*[\(\[]\s*(\w+)\s*\.\s*([^\s\)\]]*)\s*[\)\]].*?$/) {
103 my $external_name = $1;
104 my $module = $2;
105 my $ordinal = $3;
Patrik Stridvall7d0f2ba2001-02-12 03:44:41 +0000106
Patrik Stridvall47a99e12001-07-08 20:33:20 +0000107 my $found = 0;
108 foreach my $entry2 (winapi::get_all_module_internal_ordinal($internal_name)) {
109 (my $external_name2, my $module2, my $ordinal2) = @$entry2;
Patrik Stridvallb59a9c72001-07-12 22:22:05 +0000110
Patrik Stridvall47a99e12001-07-08 20:33:20 +0000111 if($external_name eq $external_name2 &&
112 lc($module) eq $module2 &&
Patrik Stridvallb59a9c72001-07-12 22:22:05 +0000113 $ordinal eq $ordinal2 &&
114 ($external_name2 eq "@" ||
115 ($win16api->is_module($module2) && !$win16api->is_function_stub_in_module($module2, $external_name2)) ||
116 ($win32api->is_module($module2) && !$win32api->is_function_stub_in_module($module2, $external_name2))) &&
117 $modules->is_allowed_module_in_file($module2, "$current_dir/$file"))
Patrik Stridvall47a99e12001-07-08 20:33:20 +0000118 {
119 $found = 1;
120 }
121 }
122 if(!$found) {
123 $output->write("documentation: $external_name (\U$module\E.$ordinal) wrong\n");
Patrik Stridvall7d0f2ba2001-02-12 03:44:41 +0000124 }
125 }
126 }
Patrik Stridvall7d0f2ba2001-02-12 03:44:41 +0000127 }
128
129 if($options->documentation_comment_indent) {
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +0000130 foreach (split(/\n/, $documentation)) {
131 if(/^\s*\*(\s*)\S+(\s*)[\(\[]\s*\w+\s*\.\s*[^\s\)\]]*\s*[\)\]].*?$/) {
132 my $indent = $1;
133 my $spacing = $2;
134
135 $indent =~ s/\t/ /g;
136 $indent = length($indent);
137
138 $spacing =~ s/\t/ /g;
139 $spacing = length($spacing);
140
141 $comment_indent{$indent}++;
142 if($indent >= 20) {
143 $output->write("documentation: comment indent is $indent\n");
144 }
145 $comment_spacing{$spacing}++;
Patrik Stridvall7d0f2ba2001-02-12 03:44:41 +0000146 }
Patrik Stridvall7d0f2ba2001-02-12 03:44:41 +0000147 }
148 }
149
150 if($options->documentation_comment_width) {
151 if($documentation =~ /(^\/\*\*+)/) {
152 my $width = length($1);
153
154 $comment_width{$width}++;
155 if($width <= 65 || $width >= 81) {
156 $output->write("comment is $width columns wide\n");
157 }
158 }
159 }
160
161 if($options->documentation_arguments) {
162 my $n = 0;
163 for my $argument_documentation (@argument_documentations) {
164 $n++;
165 if($argument_documentation ne "") {
166 if($argument_documentation !~ /^\/\*\s+\[(?:in|out|in\/out|\?\?\?)\].*?\*\/$/s) {
167 $output->write("argument $n documentation: \\\n$argument_documentation\n");
168 }
169 }
170 }
171 }
172}
173
174sub report_documentation {
175 my $options = shift;
176 my $output = shift;
177
178 if($options->documentation_comment_indent) {
179 foreach my $indent (sort(keys(%comment_indent))) {
180 my $count = $comment_indent{$indent};
181 $output->write("*.c: $count functions have comment that is indented $indent\n");
182 }
183 }
184
185 if($options->documentation_comment_width) {
186 foreach my $width (sort(keys(%comment_width))) {
187 my $count = $comment_width{$width};
188 $output->write("*.c: $count functions have comments of width $width\n");
189 }
190 }
191}
192
1931;