Mercurial > hg > xemacs-beta
comparison lib-src/make-mswin-unicode.pl @ 4962:e813cf16c015
merge
| author | Ben Wing <ben@xemacs.org> |
|---|---|
| date | Mon, 01 Feb 2010 05:29:05 -0600 |
| parents | 70089046adef |
| children | 7eec2a1f3412 |
comparison
equal
deleted
inserted
replaced
| 4961:b90f8cf474e0 | 4962:e813cf16c015 |
|---|---|
| 154 my %bracket; | 154 my %bracket; |
| 155 | 155 |
| 156 my $current_file; | 156 my $current_file; |
| 157 my @current_bracket; | 157 my @current_bracket; |
| 158 | 158 |
| 159 my ($ws_re, $must_ws_re, $tok_ch) = | |
| 160 ("\\s*", "\\s+", "\\w"); | |
| 161 # unfortunately there is no surefire way short of | |
| 162 # parsing all include files for typedefs to | |
| 163 # distinguish types from parameters, and prototypes | |
| 164 # appear in the include files both with and without | |
| 165 # parameters -- the latter kinds appear in a very | |
| 166 # different style and were obviously added later. so | |
| 167 # we rely on the fact that defined types are all | |
| 168 # upper-case, and parameters generally are not, and | |
| 169 # special-case the exceptions. | |
| 170 my $typeword_re = | |
| 171 # note the negative lookahead assertions: the first | |
| 172 # one excludes the words "X" and "Y" from type | |
| 173 # words, since they appear as parameter names in | |
| 174 # CreateWindowEx; the second prevents "void | |
| 175 # *Argument" from being parsed as a type "void *A" | |
| 176 # followed by a parameter "rgument". | |
| 177 "(?:(?!(?:X\\b|Y\\b))(?:unsigned|int|long|const|short|va_list|[A-Z_0-9]+)(?!${tok_ch}))"; | |
| 178 my $typetoken_re = "(?:$typeword_re$ws_re\\**$ws_re)"; | |
| 179 # Regexp matching a particular argument | |
| 180 my $arg_re = "(?:(?:$typetoken_re+)(?:${tok_ch}+)?(?: OPTIONAL)?)"; | |
| 181 # Same, but with groups to match the type and name | |
| 182 my $argmatch_re = "(?:($typetoken_re+)(${tok_ch}+)?(?: OPTIONAL)?)"; | |
| 183 # regexp matching a parenthesized argument list in a prototype | |
| 184 my $args_re = "\\(((?:${ws_re}${arg_re}${ws_re},)*${ws_re}${arg_re}${ws_re})\\)"; | |
| 185 # regexp matching a return type in a protype | |
| 186 my $rettype_re = "(SHSTDAPI_\\(${tok_ch}+\\)|${tok_ch}" . "[A-Za-z_0-9 \t\n\r\f]*?${tok_ch})"; | |
| 187 # regexp matching a function name | |
| 188 my $funname_re = "(${tok_ch}+)"; | |
| 189 # Regexp matching a function prototype, $1 = rettype, $2 = name, $3 = args | |
| 190 my $fun_re = "${rettype_re}${ws_re}${funname_re}${ws_re}${args_re};"; | |
| 191 # Regexp matching a particular Unicode function (ending in ...W) | |
| 192 my $wfun_re = "${rettype_re}${ws_re}${funname_re}W${ws_re}${args_re};"; | |
| 193 | |
| 194 # print "regexp: $wfun_re\n"; | |
| 195 | |
| 159 while (<>) | 196 while (<>) |
| 160 { | 197 { |
| 161 chomp; | 198 chomp; |
| 162 # remove trailing CR. #### Should not be necessary! Perl should be | 199 # remove trailing CR. #### Should not be necessary! Perl should be |
| 163 # opening these in text mode by default, as the docs claim, and | 200 # opening these in text mode by default, as the docs claim, and |
| 174 } | 211 } |
| 175 elsif ($in_script) | 212 elsif ($in_script) |
| 176 { | 213 { |
| 177 next if (m!^//!); | 214 next if (m!^//!); |
| 178 next if (/^[ \t]*$/); | 215 next if (/^[ \t]*$/); |
| 179 if (/(file|yes|soon|no|review|skip|split|begin-bracket|end-bracket)(?: (.*))?/) | 216 if (/(file|yes|soon|no|review|skip|split|begin-bracket|end-bracket|override)(?: (.*))?/) |
| 180 { | 217 { |
| 181 my ($command, $parms) = ($1, $2); | 218 my ($command, $parms) = ($1, $2); |
| 182 if ($command eq "file") | 219 if ($command eq "file") |
| 183 { | 220 { |
| 184 $current_file = $parms; | 221 $current_file = $parms; |
| 197 push @current_bracket, $current_bracket; | 234 push @current_bracket, $current_bracket; |
| 198 } | 235 } |
| 199 elsif ($command eq "end-bracket") | 236 elsif ($command eq "end-bracket") |
| 200 { | 237 { |
| 201 pop @current_bracket; | 238 pop @current_bracket; |
| 239 } | |
| 240 elsif ($command eq "override") | |
| 241 { | |
| 242 die "Cannot parse prototype $parms" unless $parms =~ /$wfun_re(?: ?(.*))?/; | |
| 243 my ($rettype, $fun, $args, $reason) = ($1, $2, $3, $4); | |
| 244 $files{$current_file}{$fun} = | |
| 245 [$command, $reason, $rettype, $fun, $args]; | |
| 246 $bracket{$current_file}{$fun} = | |
| 247 $current_bracket[$#current_bracket]; | |
| 202 } | 248 } |
| 203 else | 249 else |
| 204 { | 250 { |
| 205 my ($fun, $reason) = split /\s+/, $parms, 2; | 251 my ($fun, $reason) = split /\s+/, $parms, 2; |
| 206 $files{$current_file}{$fun} = [$command, $reason]; | 252 $files{$current_file}{$fun} = [$command, $reason]; |
| 231 (" " x $alignspaceright) . "*/ | 277 (" " x $alignspaceright) . "*/ |
| 232 /*----------------------------------------------------------------------*/ | 278 /*----------------------------------------------------------------------*/ |
| 233 | 279 |
| 234 "; | 280 "; |
| 235 | 281 |
| 236 my ($ws_re, $must_ws_re, $tok_ch) = | 282 while ($slurp =~ /$wfun_re/g) |
| 237 ("\\s*", "\\s+", "\\w"); | |
| 238 # unfortunately there is no surefire way short of | |
| 239 # parsing all include files for typedefs to | |
| 240 # distinguish types from parameters, and prototypes | |
| 241 # appear in the include files both with and without | |
| 242 # parameters -- the latter kinds appear in a very | |
| 243 # different style and were obviously added later. so | |
| 244 # we rely on the fact that defined types are all | |
| 245 # upper-case, and parameters generally are not, and | |
| 246 # special-case the exceptions. | |
| 247 my $typeword_re = | |
| 248 # note the negative lookahead assertions: the first | |
| 249 # one excludes the words "X" and "Y" from type | |
| 250 # words, since they appear as parameter names in | |
| 251 # CreateWindowEx; the second prevents "void | |
| 252 # *Argument" from being parsed as a type "void *A" | |
| 253 # followed by a parameter "rgument". | |
| 254 "(?:(?!(?:X\\b|Y\\b))(?:unsigned|int|long|const|short|va_list|[A-Z_0-9]+)(?!${tok_ch}))"; | |
| 255 my $typetoken_re = "(?:$typeword_re$ws_re\\**$ws_re)"; | |
| 256 my $arg_re = "(?:($typetoken_re+)(${tok_ch}+)?(?: OPTIONAL)?)"; | |
| 257 my $fun_re = "(SHSTDAPI_\\(${tok_ch}+\\)|${tok_ch}" . "[A-Za-z_0-9 \t\n\r\f]*?${tok_ch})${ws_re}(${tok_ch}+)W${ws_re}\\(((${ws_re}${arg_re}${ws_re},)*${ws_re}${arg_re}${ws_re})\\);"; | |
| 258 | |
| 259 # print "regexp: $fun_re\n"; | |
| 260 while ($slurp =~ /$fun_re/g) | |
| 261 { | 283 { |
| 262 my ($rettype, $fun, $args) = ($1, $2, $3); | 284 my ($rettype, $fun, $args) = ($1, $2, $3); |
| 263 | 285 |
| 264 if ($processed{$fun}) | 286 if ($processed{$fun}) |
| 265 { | 287 { |
| 269 | 291 |
| 270 $processed{$fun} = 1; | 292 $processed{$fun} = 1; |
| 271 | 293 |
| 272 print "Processing: $fun"; | 294 print "Processing: $fun"; |
| 273 | 295 |
| 274 my ($command, $reason) = ($files{$file}{$fun}[0], $files{$file}{$fun}[1]); | 296 #my ($command, $reason) = ($files{$file}{$fun}[0], $files{$file}{$fun}[1]); |
| 297 # Fuck perl! There seems to be no way to write something like | |
| 298 # my ($command, $reason) = @$files{$file}{$fun}; | |
| 299 # You have to use a temporary var. | |
| 300 my $filesarr = $files{$file}{$fun}; | |
| 301 my ($command, $reason) = @$filesarr; | |
| 275 if (!defined ($command)) | 302 if (!defined ($command)) |
| 276 { | 303 { |
| 277 print " (no command found)\n"; | 304 print " (no command found)\n"; |
| 278 } | 305 } |
| 279 else | 306 else |
| 325 $split_rettype); | 352 $split_rettype); |
| 326 if ($command eq "split") | 353 if ($command eq "split") |
| 327 { | 354 { |
| 328 ($split_struct, $reason) = split /\s+/, $reason, 2; | 355 ($split_struct, $reason) = split /\s+/, $reason, 2; |
| 329 } | 356 } |
| 357 elsif ($command eq "override") | |
| 358 { | |
| 359 my ($nrettype, $nfun, $nargs) = @$filesarr[2 .. 4]; | |
| 360 $reason = "$reason.\n NOTE: " if $reason; | |
| 361 $reason = "${reason}Prototype manually overridden. | |
| 362 Header file claims: | |
| 363 $rettype $fun($args) | |
| 364 Overridden with: | |
| 365 $nrettype $nfun($nargs) | |
| 366 Differences in return-type qualifiers, e.g. WINAPI, are not important. | |
| 367 "; | |
| 368 ($rettype, $fun, $args) = ($nrettype, $nfun, $nargs); | |
| 369 } | |
| 330 my $argno = 0; | 370 my $argno = 0; |
| 331 while ($args =~ /$arg_re/g) | 371 while ($args =~ /$argmatch_re/g) |
| 332 { | 372 { |
| 333 $argno++; | 373 $argno++; |
| 334 my ($argtype, $argname) = ($1, $2); | 374 my ($argtype, $argname) = ($1, $2); |
| 335 $argtype =~ s/\s*$//; | 375 $argtype =~ s/\s*$//; |
| 336 next if $argtype eq "void" || $argtype eq "VOID"; | 376 next if $argtype eq "void" || $argtype eq "VOID"; |
