#!/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 < #include #include #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 <) { # 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";