| #!/usr/bin/perl -w |
| # |
| # Extract #define symbol information from C header files. |
| # |
| # Copyright 2002 Alexandre Julliard |
| # |
| # This library is free software; you can redistribute it and/or |
| # modify it under the terms of the GNU Lesser General Public |
| # License as published by the Free Software Foundation; either |
| # version 2.1 of the License, or (at your option) any later version. |
| # |
| # This library is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| # Lesser General Public License for more details. |
| # |
| # You should have received a copy of the GNU Lesser General Public |
| # License along with this library; if not, write to the Free Software |
| # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| # |
| |
| # list of symbols (regexps) to skip for each header |
| %skip_list = |
| ( |
| "winnt.h" => [ "APIENTRY", "APIPRIVATE", "CALLBACK", "CONST", "EXTERN_C", "PASCAL", |
| "VOID", "DUMMY(STRUCT|UNION)NAME.*", "STDAPI.*", "STDMETHOD.*", "WINAPI.*", |
| "WINE_.*", "_*(cdecl|CDECL|pascal|export|fastcall|stdcall)", |
| "MEM_SYSTEM", "_GET_CONTEXT", "_QUAD_.*", |
| "CONTEXT_(ALPHA|R4000|SPARC|X86|i386|i486)" ], |
| "winbase.h" => [ "(Fill|Move|Zero|Copy)Memory" ], |
| "wingdi.h" => [ "PROFILE_LINKED", "PROFILE_EMBEDDED", "GetCharWidth[AW]" ], |
| "winuser.h" => [ "OemToAnsi[AW]", "OemToAnsiBuff[AW]", "AnsiToOem[AW]", "AnsiToOemBuff[AW]", |
| "Ansi(Next|Prev|Lower|Upper|LowerBuff|UpperBuff)[AW]", "GetNextWindow" ], |
| "winsock2.h" => [ "WSAEVENT", "LPWSAEVENT", "WSAOVERLAPPED", "WS_.*" ] |
| ); |
| |
| %header_list = |
| ( |
| "windef.h" => "windef.pm", |
| "winnt.h" => "winnt.pm", |
| "winbase.h" => "winbase.pm", |
| "wingdi.h" => "wingdi.pm", |
| "winuser.h" => "winuser.pm", |
| "winerror.h" => "winerror.pm", |
| "winnls.h" => "winnls.pm", |
| "winreg.h" => "winreg.pm", |
| "winsock2.h" => "winsock2.pm", |
| "winspool.h" => "winspool.pm", |
| "winver.h" => "winver.pm", |
| "wincon.h" => "wincon.pm", |
| "setupapi.h" => "setupapi_h.pm", |
| ); |
| |
| $include_dir = "../../include"; |
| |
| @list = ($#ARGV >= 0) ? @ARGV : keys %header_list; |
| |
| foreach $basename (@list) |
| { |
| my $skip = $skip_list{$basename}; |
| my $result = "include/" . $header_list{$basename}; |
| my $package = $header_list{$basename}; |
| $package =~ s/\.pm$//; |
| |
| open INPUT, "$include_dir/$basename" or die "Cannot open $include_dir/$basename"; |
| open OUTPUT, ">sym.c" or die "Cannot create sym.c"; |
| print "Building $result\n"; |
| |
| print OUTPUT <<EOF; |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <limits.h> |
| #include "windef.h" |
| #include "winnt.h" |
| #include "winbase.h" |
| #include "wingdi.h" |
| #include "winuser.h" |
| #include "winerror.h" |
| #include "winnls.h" |
| #include "winreg.h" |
| #include "winsock2.h" |
| #include "winspool.h" |
| #include "winver.h" |
| #include "wincon.h" |
| #include "setupapi.h" |
| EOF |
| |
| print OUTPUT <<EOF; |
| int main() |
| { |
| printf( "# Automatically generated by make_symbols; DO NOT EDIT!! \\n" ); |
| printf( "#\\n" ); |
| printf( "# Perl definitions for header file $basename\\n" ); |
| printf( "#\\n\\n" ); |
| printf( "\\n" ); |
| printf( "package $package;\\n" ); |
| printf( "\\n" ); |
| printf( "use strict;\\n" ); |
| printf( "\\n" ); |
| printf( "use vars qw(\$VERSION \@ISA \@EXPORT \@EXPORT_OK);\\n" ); |
| printf( "\\n" ); |
| printf( "require Exporter;\\n" ); |
| printf( "\\n" ); |
| printf( "\@ISA = qw(Exporter);\\n" ); |
| printf( "\@EXPORT = qw(\\n" ); |
| EOF |
| |
| my %symbols = (); |
| while (<INPUT>) |
| { |
| # extract all #defines |
| next unless (/^\s*\#\s*define\s+([A-Za-z0-9_]+)\s+(.*)$/); |
| my ($name,$value) = ($1,$2); |
| # skip empty value |
| next if ($value eq ""); |
| # skip the WINELIB defines |
| next if ($value =~ /WINELIB_NAME_AW/); |
| # skip macros containing multiple values |
| next if ($value =~ /{.*}/); |
| # check against regexps to skip |
| next if (grep { $name =~ /^$_$/ } @$skip); |
| $symbols{$name} = $value; |
| } |
| foreach $sym (sort keys %symbols) |
| { |
| printf OUTPUT " printf(\" $sym\\n\");\n"; |
| } |
| printf OUTPUT " printf(\");\\n\");\n"; |
| printf OUTPUT " printf(\"\@EXPORT_OK = qw();\\n\");\n"; |
| printf OUTPUT " printf(\"\\n\");\n"; |
| |
| foreach $sym (sort keys %symbols) |
| { |
| printf OUTPUT " printf(\"use constant $sym => %%d;\\n\", (int)($sym));\n"; |
| } |
| printf OUTPUT " printf(\"\\n\");\n"; |
| printf OUTPUT " printf(\"1;\\n\");\n"; |
| print OUTPUT " exit(0);\n}\n"; |
| close OUTPUT; |
| #print "cc -I../../include -o sym sym.c\n"; |
| if (system( "cc -I../../include -o sym sym.c" )) { die "Could not compile sym.c"; } |
| #print "./sym >$result\n"; |
| if (system( "./sym >$result" )) { die "Could not run ./sym\n"; } |
| unlink "sym","sym.c"; |
| } |
| |
| chdir "../.."; |
| exec "tools/winapi/winapi_extract", "--no-progress", "--no-verbose"; |