blob: 8e99f839ab9f2fd55a06a132fff9e000f3d66be7 [file] [log] [blame]
Patrik Stridvall37fd2d11999-09-23 15:14:20 +00001package winapi_parser;
2
3use strict;
4
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +00005use winapi_function;
6
Patrik Stridvall37fd2d11999-09-23 15:14:20 +00007sub parse_c_file {
8 my $options = shift;
Patrik Stridvall659fcd81999-10-31 02:08:38 +00009 my $output = shift;
Patrik Stridvall37fd2d11999-09-23 15:14:20 +000010 my $file = shift;
11 my $function_found_callback = shift;
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +000012 my $preprocessor_found_callback = shift;
13
Patrik Stridvall41f99ba2001-06-11 20:13:21 +000014 # global
15 my $debug_channels = [];
16
17 # local
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +000018 my $documentation_line;
Patrik Stridvall659fcd81999-10-31 02:08:38 +000019 my $documentation;
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +000020 my $function_line;
Patrik Stridvall4bb532e2000-03-24 20:39:51 +000021 my $linkage;
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +000022 my $return_type;
23 my $calling_convention;
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +000024 my $internal_name = "";
Patrik Stridvallf93f9982000-05-11 21:46:17 +000025 my $argument_types;
26 my $argument_names;
Patrik Stridvalla8965312000-11-30 01:31:44 +000027 my $argument_documentations;
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +000028 my $statements;
29
30 my $function_begin = sub {
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +000031 $documentation_line = shift;
Patrik Stridvall659fcd81999-10-31 02:08:38 +000032 $documentation = shift;
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +000033 $function_line = shift;
Patrik Stridvall4bb532e2000-03-24 20:39:51 +000034 $linkage = shift;
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +000035 $return_type= shift;
36 $calling_convention = shift;
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +000037 $internal_name = shift;
Patrik Stridvallf93f9982000-05-11 21:46:17 +000038 $argument_types = shift;
39 $argument_names = shift;
Patrik Stridvalla8965312000-11-30 01:31:44 +000040 $argument_documentations = shift;
41
Patrik Stridvallf93f9982000-05-11 21:46:17 +000042 if($#$argument_names == -1) {
43 foreach my $n (0..$#$argument_types) {
44 push @$argument_names, "";
45 }
46 }
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +000047
Patrik Stridvalla8965312000-11-30 01:31:44 +000048 if($#$argument_documentations == -1) {
49 foreach my $n (0..$#$argument_documentations) {
50 push @$argument_documentations, "";
51 }
52 }
53
Patrik Stridvall0e397fe2001-07-02 01:21:48 +000054 $statements = undef;
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +000055 };
56 my $function_end = sub {
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +000057 my $function = 'winapi_function'->new;
58
Patrik Stridvallbda50742001-07-14 00:48:41 +000059 if(!defined($documentation_line)) {
60 $documentation_line = 0;
61 }
62
Patrik Stridvallb59a9c72001-07-12 22:22:05 +000063 $function->file($file);
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +000064 $function->debug_channels([@$debug_channels]);
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +000065 $function->documentation_line($documentation_line);
Patrik Stridvalld07a6462001-07-18 20:09:12 +000066 $function->documentation($documentation);
67 $function->function_line($function_line);
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +000068 $function->linkage($linkage);
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +000069 $function->return_type($return_type);
70 $function->calling_convention($calling_convention);
71 $function->internal_name($internal_name);
72 $function->argument_types([@$argument_types]);
73 $function->argument_names([@$argument_names]);
74 $function->argument_documentations([@$argument_documentations]);
75 $function->statements($statements);
76
77 &$function_found_callback($function);
78 $internal_name = "";
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +000079 };
Patrik Stridvallaf1601b1999-12-11 23:01:45 +000080 my %regs_entrypoints;
Patrik Stridvall0e397fe2001-07-02 01:21:48 +000081 my @comment_lines = ();
Patrik Stridvall659fcd81999-10-31 02:08:38 +000082 my @comments = ();
Patrik Stridvall37fd2d11999-09-23 15:14:20 +000083 my $level = 0;
Patrik Stridvall6a4e8a52000-04-06 20:11:04 +000084 my $extern_c = 0;
Patrik Stridvall37fd2d11999-09-23 15:14:20 +000085 my $again = 0;
86 my $lookahead = 0;
87 my $lookahead_count = 0;
88
89 print STDERR "Processing file '$file' ... " if $options->verbose;
90 open(IN, "< $file") || die "<internal>: $file: $!\n";
91 $/ = "\n";
92 while($again || defined(my $line = <IN>)) {
93 if(!$again) {
94 chomp $line;
95
96 if($lookahead) {
97 $lookahead = 0;
98 $_ .= "\n" . $line;
Patrik Stridvall0e397fe2001-07-02 01:21:48 +000099 $lookahead_count++;
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000100 } else {
101 $_ = $line;
102 $lookahead_count = 0;
103 }
Patrik Stridvall6a4e8a52000-04-06 20:11:04 +0000104 print " $level($lookahead_count): $line\n" if $options->debug >= 2;
105 print "*** $_\n" if $options->debug >= 3;
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000106 } else {
107 $lookahead_count = 0;
108 $again = 0;
109 }
Patrik Stridvall659fcd81999-10-31 02:08:38 +0000110
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +0000111 # CVS merge conflicts in file?
Patrik Stridvall659fcd81999-10-31 02:08:38 +0000112 if(/^(<<<<<<<|=======|>>>>>>>)/) {
113 $output->write("$file: merge conflicts in file\n");
114 last;
115 }
116
Patrik Stridvall54e15522000-05-18 00:07:31 +0000117 # remove C comments
Patrik Stridvall0e397fe2001-07-02 01:21:48 +0000118 if(s/^(.*?)(\/\*.*?\*\/)(.*)$/$1 $3/s) {
119 push @comment_lines, $.;
120 push @comments, $2;
121 $again = 1;
122 next;
123 }
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000124 if(/^(.*?)\/\*/s) {
125 $lookahead = 1;
126 next;
127 }
128
Patrik Stridvall54e15522000-05-18 00:07:31 +0000129 # remove C++ comments
130 while(s/^(.*?)\/\/.*?$/$1\n/s) { $again = 1 }
131 if($again) { next; }
132
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000133 # remove empty rows
134 if(/^\s*$/) { next; }
135
136 # remove preprocessor directives
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +0000137 if(s/^\s*\#/\#/m) {
138 if(/^\\#.*?\\$/m) {
139 $lookahead = 1;
140 next;
141 } elsif(s/^\#\s*(.*?)(\s+(.*?))?\s*$//m) {
142 if(defined($3)) {
143 &$preprocessor_found_callback($1, $3);
144 } else {
145 &$preprocessor_found_callback($1, "");
146 }
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +0000147 next;
148 }
149 }
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000150
Patrik Stridvall6a4e8a52000-04-06 20:11:04 +0000151 # Remove extern "C"
152 if(s/^\s*extern\s+"C"\s+\{//m) {
153 $extern_c = 1;
154 $again = 1;
155 next;
156 }
157
Patrik Stridvall0e397fe2001-07-02 01:21:48 +0000158 my $documentation_line;
Patrik Stridvalla8965312000-11-30 01:31:44 +0000159 my $documentation;
Patrik Stridvall94a50772000-12-01 23:51:33 +0000160 my @argument_documentations = ();
Patrik Stridvall659fcd81999-10-31 02:08:38 +0000161 {
162 my $n = $#comments;
Patrik Stridvalla8965312000-11-30 01:31:44 +0000163 while($n >= 0 && ($comments[$n] !~ /^\/\*\*/ ||
Patrik Stridvall94a50772000-12-01 23:51:33 +0000164 $comments[$n] =~ /^\/\*\*+\/$/))
Patrik Stridvalla8965312000-11-30 01:31:44 +0000165 {
166 $n--;
167 }
168
Patrik Stridvall659fcd81999-10-31 02:08:38 +0000169 if(defined($comments[$n]) && $n >= 0) {
Patrik Stridvall0e397fe2001-07-02 01:21:48 +0000170 my @lines = split(/\n/, $comments[$n]);
171
172 $documentation_line = $comment_lines[$n] - scalar(@lines) + 1;
Patrik Stridvall659fcd81999-10-31 02:08:38 +0000173 $documentation = $comments[$n];
Patrik Stridvall0e397fe2001-07-02 01:21:48 +0000174
Patrik Stridvalla8965312000-11-30 01:31:44 +0000175 for(my $m=$n+1; $m <= $#comments; $m++) {
Patrik Stridvall9086d422001-01-20 02:16:31 +0000176 if($comments[$m] =~ /^\/\*\*+\/$/ ||
177 $comments[$m] =~ /^\/\*\s*(?:\!)?defined/) # FIXME: Kludge
178 {
Patrik Stridvall94a50772000-12-01 23:51:33 +0000179 @argument_documentations = ();
180 next;
181 }
Patrik Stridvalla8965312000-11-30 01:31:44 +0000182 push @argument_documentations, $comments[$m];
183 }
Patrik Stridvall659fcd81999-10-31 02:08:38 +0000184 } else {
185 $documentation = "";
186 }
187 }
188
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000189 if($level > 0)
190 {
Patrik Stridvall4bb532e2000-03-24 20:39:51 +0000191 my $line = "";
192 while(/^[^\{\}]/) {
193 s/^([^\{\}\'\"]*)//s;
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +0000194 $line .= $1;
Patrik Stridvall4bb532e2000-03-24 20:39:51 +0000195 if(s/^\'//) {
196 $line .= "\'";
197 while(/^./ && !s/^\'//) {
198 s/^([^\'\\]*)//s;
199 $line .= $1;
200 if(s/^\\//) {
201 $line .= "\\";
202 if(s/^(.)//s) {
203 $line .= $1;
204 if($1 eq "0") {
205 s/^(\d{0,3})//s;
206 $line .= $1;
207 }
208 }
209 }
210 }
211 $line .= "\'";
212 } elsif(s/^\"//) {
213 $line .= "\"";
214 while(/^./ && !s/^\"//) {
215 s/^([^\"\\]*)//s;
216 $line .= $1;
217 if(s/^\\//) {
218 $line .= "\\";
219 if(s/^(.)//s) {
220 $line .= $1;
221 if($1 eq "0") {
222 s/^(\d{0,3})//s;
223 $line .= $1;
224 }
225 }
226 }
227 }
228 $line .= "\"";
229 }
230 }
231
232 if(s/^\{//) {
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000233 $_ = $'; $again = 1;
Patrik Stridvall4bb532e2000-03-24 20:39:51 +0000234 $line .= "{";
235 print "+1: \{$_\n" if $options->debug >= 2;
236 $level++;
237 } elsif(s/^\}//) {
238 $_ = $'; $again = 1;
239 $line .= "}" if $level > 1;
240 print "-1: \}$_\n" if $options->debug >= 2;
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000241 $level--;
Patrik Stridvall6a4e8a52000-04-06 20:11:04 +0000242 if($level == -1 && $extern_c) {
243 $extern_c = 0;
244 $level = 0;
245 }
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000246 }
Patrik Stridvall4bb532e2000-03-24 20:39:51 +0000247
Patrik Stridvall0e397fe2001-07-02 01:21:48 +0000248 if(!defined($statements)) {
249 $statements = "";
250 }
251
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +0000252 if($line !~ /^\s*$/) {
253 $statements .= "$line\n";
Patrik Stridvall4bb532e2000-03-24 20:39:51 +0000254 }
255
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +0000256 if($internal_name && $level == 0) {
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +0000257 &$function_end;
258 }
Patrik Stridvalld07a6462001-07-18 20:09:12 +0000259 next;
260 } elsif(/(extern\s+|static\s+)?((struct\s+|union\s+|enum\s+|signed\s+|unsigned\s+)?\w+((\s*\*)+\s*|\s+))
Patrik Stridvall360c3f22000-06-11 20:02:29 +0000261 ((__cdecl|__stdcall|CDECL|VFWAPIV|VFWAPI|WINAPIV|WINAPI|CALLBACK)\s+)?
262 (\w+(\(\w+\))?)\s*\(([^\)]*)\)\s*(\{|\;)/sx)
263 {
Patrik Stridvall0e397fe2001-07-02 01:21:48 +0000264 my @lines = split(/\n/, $&);
265 my $function_line = $. - scalar(@lines) + 1;
266
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000267 $_ = $'; $again = 1;
Patrik Stridvall0e397fe2001-07-02 01:21:48 +0000268
Patrik Stridvall4bb532e2000-03-24 20:39:51 +0000269 if($11 eq "{") {
270 $level++;
271 }
Patrik Stridvall1932d402000-04-15 20:39:55 +0000272
Patrik Stridvall4bb532e2000-03-24 20:39:51 +0000273 my $linkage = $1;
274 my $return_type = $2;
275 my $calling_convention = $7;
276 my $name = $8;
277 my $arguments = $10;
278
279 if(!defined($linkage)) {
280 $linkage = "";
281 }
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +0000282
283 if(!defined($calling_convention)) {
284 $calling_convention = "";
285 }
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000286
Patrik Stridvall4bb532e2000-03-24 20:39:51 +0000287 $linkage =~ s/\s*$//;
288
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000289 $return_type =~ s/\s*$//;
290 $return_type =~ s/\s*\*\s*/*/g;
291 $return_type =~ s/(\*+)/ $1/g;
292
Patrik Stridvallaf1601b1999-12-11 23:01:45 +0000293 if($regs_entrypoints{$name}) {
294 $name = $regs_entrypoints{$name};
295 }
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000296
297 $arguments =~ y/\t\n/ /;
298 $arguments =~ s/^\s*(.*?)\s*$/$1/;
Patrik Stridvall20ca0012001-06-19 03:34:52 +0000299 if($arguments eq "") { $arguments = "..." }
Patrik Stridvalla8965312000-11-30 01:31:44 +0000300
Patrik Stridvallf93f9982000-05-11 21:46:17 +0000301 my @argument_types;
302 my @argument_names;
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000303 my @arguments = split(/,/, $arguments);
304 foreach my $n (0..$#arguments) {
Patrik Stridvallf93f9982000-05-11 21:46:17 +0000305 my $argument_type = "";
306 my $argument_name = "";
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000307 my $argument = $arguments[$n];
308 $argument =~ s/^\s*(.*?)\s*$/$1/;
Patrik Stridvallf93f9982000-05-11 21:46:17 +0000309 # print " " . ($n + 1) . ": '$argument'\n";
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +0000310 $argument =~ s/^(IN OUT(?=\s)|IN(?=\s)|OUT(?=\s)|\s*)\s*//;
Patrik Stridvallaf1601b1999-12-11 23:01:45 +0000311 $argument =~ s/^(const(?=\s)|CONST(?=\s)|\s*)\s*//;
Patrik Stridvall5dadbf32000-04-29 14:24:11 +0000312 if($argument =~ /^\.\.\.$/) {
Patrik Stridvallf93f9982000-05-11 21:46:17 +0000313 $argument_type = "...";
314 $argument_name = "...";
Patrik Stridvalla8965312000-11-30 01:31:44 +0000315 } elsif($argument =~ /^
316 ((?:struct\s+|union\s+|enum\s+|(?:signed\s+|unsigned\s+)
317 (?:short\s+(?=int)|long\s+(?=int))?)?\w+)\s*
318 ((?:const)?\s*(?:\*\s*?)*)\s*
319 (?:WINE_UNUSED\s+)?(\w*)\s*(?:\[\]|\s+OPTIONAL)?/x)
320 {
Patrik Stridvallf93f9982000-05-11 21:46:17 +0000321 $argument_type = "$1";
322 if($2 ne "") {
323 $argument_type .= " $2";
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000324 }
Patrik Stridvallf93f9982000-05-11 21:46:17 +0000325 $argument_name = $3;
326
327 $argument_type =~ s/\s*const\s*/ /;
328 $argument_type =~ s/^\s*(.*?)\s*$/$1/;
329
330 $argument_name =~ s/^\s*(.*?)\s*$/$1/;
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000331 } else {
332 die "$file: $.: syntax error: '$argument'\n";
333 }
Patrik Stridvallf93f9982000-05-11 21:46:17 +0000334 $argument_types[$n] = $argument_type;
335 $argument_names[$n] = $argument_name;
336 # print " " . ($n + 1) . ": '" . $argument_types[$n] . "', '" . $argument_names[$n] . "'\n";
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000337 }
Patrik Stridvallf93f9982000-05-11 21:46:17 +0000338 if($#argument_types == 0 && $argument_types[0] =~ /^void$/i) {
339 $#argument_types = -1;
340 $#argument_names = -1;
341 }
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000342
343 if($options->debug) {
344 print "$file: $return_type $calling_convention $name(" . join(",", @arguments) . ")\n";
345 }
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +0000346
347 &$function_begin($documentation_line, $documentation,
348 $function_line, $linkage, $return_type, $calling_convention, $name,
349 \@argument_types,\@argument_names,\@argument_documentations);
Patrik Stridvall4bb532e2000-03-24 20:39:51 +0000350 if($level == 0) {
351 &$function_end;
352 }
Patrik Stridvall7d0f2ba2001-02-12 03:44:41 +0000353 } elsif(/__ASM_GLOBAL_FUNC\(\s*(.*?)\s*,/s) {
354 $_ = $'; $again = 1;
355 my @arguments = ();
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +0000356 &$function_begin($documentation_line, $documentation,
357 $function_line, "", "void", "__asm", $1, \@arguments);
Patrik Stridvall7d0f2ba2001-02-12 03:44:41 +0000358 &$function_end;
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000359 } elsif(/DC_(GET_X_Y|GET_VAL_16)\s*\(\s*(.*?)\s*,\s*(.*?)\s*,\s*(.*?)\s*\)/s) {
360 $_ = $'; $again = 1;
361 my @arguments = ("HDC16");
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +0000362 &$function_begin($documentation_line, $documentation,
363 $function_line, "", $2, "WINAPI", $3, \@arguments);
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +0000364 &$function_end;
Patrik Stridvallfaf64aa2000-09-04 20:20:47 +0000365 } elsif(/DC_(GET_VAL)\s*\(\s*(.*?)\s*,\s*(.*?)\s*,.*?\)/s) {
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000366 $_ = $'; $again = 1;
Patrik Stridvallfaf64aa2000-09-04 20:20:47 +0000367 my $return16 = $3 . "16";
368 my $return32 = $3;
369 my $name16 = $2 . "16";
370 my $name32 = $2;
371 my @arguments16 = ("HDC16");
372 my @arguments32 = ("HDC");
373
374 if($name16 eq "COLORREF16") { $name16 = "COLORREF"; }
375
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +0000376 &$function_begin($documentation_line, $documentation,
377 $function_line, "", $name16, "WINAPI", $return16, \@arguments16);
Patrik Stridvallfaf64aa2000-09-04 20:20:47 +0000378 &$function_end;
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +0000379 &$function_begin($documentation_line, $documentation,
380 $function_line, "", $name32, "WINAPI", $return32, \@arguments32);
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +0000381 &$function_end;
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000382 } elsif(/DC_(GET_VAL_EX)\s*\(\s*(.*?)\s*,\s*(.*?)\s*,\s*(.*?)\s*,\s*(.*?)\s*\)/s) {
383 $_ = $'; $again = 1;
384 my @arguments16 = ("HDC16", "LP" . $5 . "16");
385 my @arguments32 = ("HDC", "LP" . $5);
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +0000386 &$function_begin($documentation_line, $documentation,
387 $function_line, "", "BOOL16", "WINAPI", $2 . "16", \@arguments16);
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +0000388 &$function_end;
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +0000389 &$function_begin($documentation_line, $documentation,
390 $function_line, "", "BOOL", "WINAPI", $2, \@arguments32);
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +0000391 &$function_end;
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000392 } elsif(/DC_(SET_MODE)\s*\(\s*(.*?)\s*,\s*(.*?)\s*,\s*(.*?)\s*,\s*(.*?)\s*\)/s) {
393 $_ = $'; $again = 1;
394 my @arguments16 = ("HDC16", "INT16");
395 my @arguments32 = ("HDC", "INT");
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +0000396 &$function_begin($documentation_line, $documentation,
397 $function_line, "", "INT16", "WINAPI", $2 . "16", \@arguments16);
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +0000398 &$function_end;
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +0000399 &$function_begin($documentation_line, $documentation,
400 $function_line, "", "INT", "WINAPI", $2, \@arguments32);
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +0000401 &$function_end;
Patrik Stridvallafe3b0c1999-09-29 10:22:00 +0000402 } elsif(/WAVEIN_SHORTCUT_0\s*\(\s*(.*?)\s*,\s*(.*?)\s*\)/s) {
403 $_ = $'; $again = 1;
404 my @arguments16 = ("HWAVEIN16");
405 my @arguments32 = ("HWAVEIN");
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +0000406 &$function_begin($documentation_line, $documentation,
407 $function_line, "", "UINT16", "WINAPI", "waveIn" . $1 . "16", \@arguments16);
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +0000408 &$function_end;
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +0000409 &$function_begin($documentation_line, $documentation,
410 $function_line, "", "UINT", "WINAPI", "waveIn" . $1, \@arguments32);
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +0000411 &$function_end;
Patrik Stridvallafe3b0c1999-09-29 10:22:00 +0000412 } elsif(/WAVEOUT_SHORTCUT_0\s*\(\s*(.*?)\s*,\s*(.*?)\s*\)/s) {
413 $_ = $'; $again = 1;
414 my @arguments16 = ("HWAVEOUT16");
415 my @arguments32 = ("HWAVEOUT");
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +0000416 &$function_begin($documentation_line, $documentation,
417 $function_line, "", "UINT16", "WINAPI", "waveOut" . $1 . "16", \@arguments16);
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +0000418 &$function_end;
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +0000419 &$function_begin($documentation_line, $documentation,
420 $function_line, "", "UINT", "WINAPI", "waveOut" . $1, \@arguments32);
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +0000421 &$function_end;
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000422 } elsif(/WAVEOUT_SHORTCUT_(1|2)\s*\(\s*(.*?)\s*,\s*(.*?)\s*,\s*(.*?)\s*\)/s) {
423 $_ = $'; $again = 1;
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000424 if($1 eq "1") {
425 my @arguments16 = ("HWAVEOUT16", $4);
426 my @arguments32 = ("HWAVEOUT", $4);
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +0000427 &$function_begin($documentation_line, $documentation,
428 $function_line, "", "UINT16", "WINAPI", "waveOut" . $2 . "16", \@arguments16);
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +0000429 &$function_end;
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +0000430 &$function_begin($documentation_line, $documentation,
431 $function_line, "", "UINT", "WINAPI", "waveOut" . $2, \@arguments32);
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +0000432 &$function_end;
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000433 } elsif($1 eq 2) {
434 my @arguments16 = ("UINT16", $4);
435 my @arguments32 = ("UINT", $4);
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +0000436 &$function_begin($documentation_line, $documentation,
437 $function_line, "", "UINT16", "WINAPI", "waveOut". $2 . "16", \@arguments16);
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +0000438 &$function_end;
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +0000439 &$function_begin($documentation_line, $documentation,
440 $function_line, "", "UINT", "WINAPI", "waveOut" . $2, \@arguments32);
Patrik Stridvall5b3b6d91999-10-24 21:45:39 +0000441 &$function_end;
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000442 }
Patrik Stridvallaf1601b1999-12-11 23:01:45 +0000443 } elsif(/DEFINE_REGS_ENTRYPOINT_\d+\(\s*(\S*)\s*,\s*([^\s,\)]*).*?\)/s) {
444 $_ = $'; $again = 1;
445 $regs_entrypoints{$2} = $1;
Patrik Stridvall41f99ba2001-06-11 20:13:21 +0000446 } elsif(/DEFAULT_DEBUG_CHANNEL\s*\((\S+)\)/s) {
447 $_ = $'; $again = 1;
448 unshift @$debug_channels, $1;
449 } elsif(/(DEFAULT|DECLARE)_DEBUG_CHANNEL\s*\((\S+)\)/s) {
450 $_ = $'; $again = 1;
451 push @$debug_channels, $1;
Patrik Stridvall4bb532e2000-03-24 20:39:51 +0000452 } elsif(/\'[^\']*\'/s) {
453 $_ = $'; $again = 1;
454 } elsif(/\"[^\"]*\"/s) {
455 $_ = $'; $again = 1;
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000456 } elsif(/;/s) {
457 $_ = $'; $again = 1;
Patrik Stridvall6a4e8a52000-04-06 20:11:04 +0000458 } elsif(/extern\s+"C"\s+{/s) {
459 $_ = $'; $again = 1;
Patrik Stridvall4bb532e2000-03-24 20:39:51 +0000460 } elsif(/\{/s) {
461 $_ = $'; $again = 1;
462 print "+1: $_\n" if $options->debug >= 2;
463 $level++;
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000464 } else {
465 $lookahead = 1;
466 }
467 }
468 close(IN);
469 print STDERR "done\n" if $options->verbose;
Patrik Stridvall659fcd81999-10-31 02:08:38 +0000470 $output->write("$file: not at toplevel at end of file\n") unless $level == 0;
Patrik Stridvall37fd2d11999-09-23 15:14:20 +0000471}
472
4731;