- Added code for detection of missing types.

- Added missing types.
- Added a function for each type test to improve compiling with -O2.
This commit is contained in:
Patrik Stridvall 2002-11-06 21:58:50 +00:00 committed by Alexandre Julliard
parent b9ae9eca13
commit aac9ff400c
2 changed files with 147 additions and 59 deletions

View File

@ -47,7 +47,11 @@ EMR
EMRABORTPATH EMRABORTPATH
EMRANGLEARC EMRANGLEARC
EMRARC EMRARC
EMRARCTO
EMRBEGINPATH
EMRBITBLT EMRBITBLT
EMRCHORD
EMRCLOSEFIGURE
EMRCREATEBRUSHINDIRECT EMRCREATEBRUSHINDIRECT
!EMRCREATECOLORSPACE !EMRCREATECOLORSPACE
!EMRCREATECOLORSPACEW !EMRCREATECOLORSPACEW
@ -58,6 +62,7 @@ EMRCREATEPEN
EMRDELETECOLORSPACE EMRDELETECOLORSPACE
EMRDELETEOBJECT EMRDELETEOBJECT
EMRELLIPSE EMRELLIPSE
EMRENDPATH
EMREOF EMREOF
EMREXCLUDECLIPRECT EMREXCLUDECLIPRECT
EMREXTCREATEFONTINDIRECTW EMREXTCREATEFONTINDIRECTW
@ -65,45 +70,80 @@ EMREXTCREATEPEN
EMREXTFLOODFILL EMREXTFLOODFILL
EMREXTSELECTCLIPRGN EMREXTSELECTCLIPRGN
EMREXTTEXTOUTA EMREXTTEXTOUTA
EMREXTTEXTOUTW
EMRFILLPATH EMRFILLPATH
EMRFILLRGN EMRFILLRGN
EMRFLATTENPATH
EMRFORMAT EMRFORMAT
EMRFRAMERGN EMRFRAMERGN
EMRGDICOMMENT EMRGDICOMMENT
EMRGLSBOUNDEDRECORD EMRGLSBOUNDEDRECORD
EMRGLSRECORD EMRGLSRECORD
EMRINVERTRGN EMRINVERTRGN
EMRINTERSECTCLIPRECT
EMRLINETO EMRLINETO
EMRMASKBLT EMRMASKBLT
EMRMODIFYWORLDTRANSFORM EMRMODIFYWORLDTRANSFORM
EMRMOVETOEX
EMROFFSETCLIPRGN EMROFFSETCLIPRGN
EMRPAINTRGN
EMRPIE
EMRPIXELFORMAT EMRPIXELFORMAT
EMRPLGBLT EMRPLGBLT
EMRPOLYBEZIER
EMRPOLYBEZIERTO
EMRPOLYDRAW EMRPOLYDRAW
EMRPOLYGON
EMRPOLYLINE EMRPOLYLINE
EMRPOLYLINETO
EMRPOLYPOLYGON
EMRPOLYPOLYLINE EMRPOLYPOLYLINE
EMRPOLYTEXTOUTA EMRPOLYTEXTOUTA
EMRPOLYTEXTOUTW
EMRREALIZEPALETTE
EMRRECTANGLE
EMRRESIZEPALETTE EMRRESIZEPALETTE
EMRRESTOREDC EMRRESTOREDC
EMRROUNDRECT EMRROUNDRECT
EMRSAVEDC
EMRSCALEVIEWPORTEXTEX EMRSCALEVIEWPORTEXTEX
EMRSCALEWINDOWEXTEX
EMRSELECTCLIPPATH EMRSELECTCLIPPATH
EMRSELECTCOLORSPACE
EMRSELECTOBJECT
EMRSELECTPALETTE EMRSELECTPALETTE
EMRSETARCDIRECTION EMRSETARCDIRECTION
EMRSETBKCOLOR EMRSETBKCOLOR
EMRSETBKMODE
EMRSETBRUSHORGEX EMRSETBRUSHORGEX
EMRSETCOLORADJUSTMENT EMRSETCOLORADJUSTMENT
!EMRSETCOLORSPACE
EMRSETDIBITSTODEVICE EMRSETDIBITSTODEVICE
EMRSETICMMODE
!EMRSETLAYOUT
EMRSETMAPMODE
EMRSETMAPPERFLAGS EMRSETMAPPERFLAGS
EMRSETMETARGN
EMRSETMITERLIMIT EMRSETMITERLIMIT
!EMRSETPALETTEENTRIES !EMRSETPALETTEENTRIES
EMRSETPIXELV EMRSETPIXELV
EMRSETPOLYFILLMODE
EMRSETROP2
EMRSETSTRETCHBLTMODE
EMRSETTEXTALIGN
EMRSETTEXTCOLOR
!EMRSETTEXTJUSTIFICATION !EMRSETTEXTJUSTIFICATION
EMRSETVIEWPORTEXTEX EMRSETVIEWPORTEXTEX
EMRSETVIEWPORTORGEX
EMRSETWINDOWEXTEX
EMRSETWINDOWORGEX
EMRSETWORLDTRANSFORM EMRSETWORLDTRANSFORM
EMRSTRETCHBLT EMRSTRETCHBLT
EMRSTRETCHDIBITS EMRSTRETCHDIBITS
EMRSTROKEANDFILLPATH
EMRSTROKEPATH
EMRTEXT EMRTEXT
EMRWIDENPATH
ENHMETAHEADER: !szlMicrometers ENHMETAHEADER: !szlMicrometers
ENHMETARECORD ENHMETARECORD
ENHMFENUMPROC ENHMFENUMPROC
@ -178,7 +218,7 @@ LPGRADIENT_RECT
LPGRADIENT_TRIANGLE LPGRADIENT_TRIANGLE
LPHANDLETABLE LPHANDLETABLE
LPKERNINGPAIR LPKERNINGPAIR
LPLOCALESIGNATUREE LPLOCALESIGNATURE
LPLOGBRUSH LPLOGBRUSH
LPLOGCOLORSPACEA LPLOGCOLORSPACEA
LPLOGCOLORSPACEW LPLOGCOLORSPACEW
@ -325,6 +365,7 @@ PEMRSETBRUSHORGEX
PEMRSETCOLORADJUSTMENT PEMRSETCOLORADJUSTMENT
!PEMRSETCOLORSPACE !PEMRSETCOLORSPACE
PEMRSETDIBITSTODEVICE PEMRSETDIBITSTODEVICE
PEMRSETICMMODE
!PEMRSETLAYOUT !PEMRSETLAYOUT
PEMRSETMAPMODE PEMRSETMAPMODE
PEMRSETMAPPERFLAGS PEMRSETMAPPERFLAGS
@ -359,7 +400,7 @@ PGRADIENT_RECT
PGRADIENT_TRIANGLE PGRADIENT_TRIANGLE
PHANDLETABLE PHANDLETABLE
PIXELFORMATDESCRIPTOR PIXELFORMATDESCRIPTOR
PLOCALESIGNATUR PLOCALESIGNATURE
PLOGBRUSH PLOGBRUSH
PLOGFONTA PLOGFONTA
PLOGFONTW PLOGFONTW
@ -428,17 +469,18 @@ CRITICAL_SECTION
CRITICAL_SECTION_DEBUG CRITICAL_SECTION_DEBUG
DCB DCB
DEBUG_EVENT DEBUG_EVENT
ENUMRESLANGPROCA !ENUMRESLANGPROCA
ENUMRESLANGPROCW !ENUMRESLANGPROCW
ENUMRESNAMEPROCA !ENUMRESNAMEPROCA
ENUMRESNAMEPROCW !ENUMRESNAMEPROCW
ENUMRESTYPEPROCA !ENUMRESTYPEPROCA
ENUMRESTYPEPROCW !ENUMRESTYPEPROCW
EXCEPTION_DEBUG_INFO EXCEPTION_DEBUG_INFO
EXIT_PROCESS_DEBUG_INFO EXIT_PROCESS_DEBUG_INFO
EXIT_THREAD_DEBUG_INFO EXIT_THREAD_DEBUG_INFO
!FILETIME !FILETIME
HW_PROFILE_INFOA HW_PROFILE_INFOA
HW_PROFILE_INFOW
LDT_ENTRY LDT_ENTRY
LOAD_DLL_DEBUG_INFO LOAD_DLL_DEBUG_INFO
LPBY_HANDLE_FILE_INFORMATION LPBY_HANDLE_FILE_INFORMATION
@ -520,7 +562,7 @@ SYSTEMTIME
SYSTEM_POWER_STATUS SYSTEM_POWER_STATUS
TIME_ZONE_INFORMATION TIME_ZONE_INFORMATION
UNLOAD_DLL_DEBUG_INFO UNLOAD_DLL_DEBUG_INFO
WAITORTIMERCALLBACK !WAITORTIMERCALLBACK
WIN32_FILE_ATTRIBUTE_DATA WIN32_FILE_ATTRIBUTE_DATA
WIN32_FIND_DATAA WIN32_FIND_DATAA
WIN32_FIND_DATAW WIN32_FIND_DATAW
@ -560,9 +602,11 @@ CCHAR
CHAR CHAR
COLORREF COLORREF
!CONTEXT !CONTEXT
!CONTEXT86
!DATE !DATE
!DOUBLE !DOUBLE
DWORD DWORD
DWORD32
!DWORD64 !DWORD64
!DWORDLONG !DWORDLONG
DWORD_PTR DWORD_PTR
@ -576,6 +620,7 @@ FLOATING_SAVE_AREA
FPO_DATA FPO_DATA
GENERIC_MAPPING GENERIC_MAPPING
GLOBALHANDLE GLOBALHANDLE
HALF_PTR
HANDLE HANDLE
HCURSOR HCURSOR
HFILE HFILE
@ -617,7 +662,10 @@ IMAGE_THUNK_DATA
IMAGE_TLS_DIRECTORY IMAGE_TLS_DIRECTORY
IMAGE_VXD_HEADER IMAGE_VXD_HEADER
INT INT
!INT16
INT32
!INT64 !INT64
!INT8
INT_PTR INT_PTR
LANGID LANGID
!LARGE_INTEGER !LARGE_INTEGER
@ -625,6 +673,7 @@ LCID
LIST_ENTRY LIST_ENTRY
LOCALHANDLE LOCALHANDLE
LONG LONG
LONG32
!LONG64 !LONG64
!LONGLONG !LONGLONG
LONG_PTR LONG_PTR
@ -664,7 +713,7 @@ PCSTR
PCWCH PCWCH
PCWSTR PCWSTR
!PEXCEPTION_FRAME !PEXCEPTION_FRAME
PEXCEPTION_HANDLER !PEXCEPTION_HANDLER
PEXCEPTION_POINTERS PEXCEPTION_POINTERS
PEXCEPTION_RECORD PEXCEPTION_RECORD
PFLOATING_SAVE_AREA PFLOATING_SAVE_AREA
@ -713,6 +762,9 @@ PMESSAGE_RESOURCE_BLOCK
PMESSAGE_RESOURCE_DATA PMESSAGE_RESOURCE_DATA
PMESSAGE_RESOURCE_ENTRY PMESSAGE_RESOURCE_ENTRY
PNT_TIB PNT_TIB
POINT
POINTL
POINTS
PPOINT PPOINT
PPOINTS PPOINTS
PPRIVILEGE_SET PPRIVILEGE_SET
@ -741,8 +793,11 @@ PULARGE_INTEGER
PVOID PVOID
PWCH PWCH
PWSTR PWSTR
RECT
RECTL
RTL_CRITICAL_SECTION RTL_CRITICAL_SECTION
RTL_CRITICAL_SECTION_DEBUG RTL_CRITICAL_SECTION_DEBUG
RTL_RESOURCE_DEBUG
SECURITY_CONTEXT_TRACKING_MODE SECURITY_CONTEXT_TRACKING_MODE
SECURITY_DESCRIPTOR SECURITY_DESCRIPTOR
SECURITY_DESCRIPTOR_CONTROL SECURITY_DESCRIPTOR_CONTROL
@ -754,9 +809,11 @@ SID
SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES
SID_IDENTIFIER_AUTHORITY SID_IDENTIFIER_AUTHORITY
SINGLE_LIST_ENTRY SINGLE_LIST_ENTRY
SIZE
SIZEL SIZEL
SIZE_T SIZE_T
SSIZE_T SSIZE_T
!STACK_FRAME_HEADER
SYSTEM_ALARM_ACE SYSTEM_ALARM_ACE
SYSTEM_AUDIT_ACE SYSTEM_AUDIT_ACE
TCHAR TCHAR
@ -769,11 +826,16 @@ TOKEN_SOURCE
!TOKEN_STATISTICS !TOKEN_STATISTICS
TOKEN_USER TOKEN_USER
UCHAR UCHAR
UHALF_PTR
UINT UINT
!UINT16
UINT32
!UINT64 !UINT64
!UINT8
UINT_PTR UINT_PTR
!ULARGE_INTEGER !ULARGE_INTEGER
ULONG ULONG
ULONG32
!ULONG64 !ULONG64
!ULONGLONG !ULONGLONG
ULONG_PTR ULONG_PTR
@ -784,6 +846,7 @@ WORD
WPARAM WPARAM
__int16 __int16
__int32 __int32
!__int64
__int8 __int8
%%%dlls/user/tests %%%dlls/user/tests
@ -816,6 +879,7 @@ CBTACTIVATESTRUCT
CBT_CREATEWNDA CBT_CREATEWNDA
CBT_CREATEWNDW CBT_CREATEWNDW
CLIENTCREATESTRUCT CLIENTCREATESTRUCT
COMBOBOXINFO
COMPAREITEMSTRUCT COMPAREITEMSTRUCT
COPYDATASTRUCT COPYDATASTRUCT
CREATESTRUCTA CREATESTRUCTA
@ -829,19 +893,15 @@ DESKTOPENUMPROCA
DESKTOPENUMPROCW DESKTOPENUMPROCW
DLGITEMTEMPLATE DLGITEMTEMPLATE
DLGPROC DLGPROC
DLGPROC
DLGTEMPLATE DLGTEMPLATE
!DRAWITEMSTRUCT !DRAWITEMSTRUCT
DRAWSTATEPROC DRAWSTATEPROC
DRAWSTATEPROC
DRAWTEXTPARAMS DRAWTEXTPARAMS
EDITWORDBREAKPROCA EDITWORDBREAKPROCA
EDITWORDBREAKPROCA
EDITWORDBREAKPROCW
EDITWORDBREAKPROCW EDITWORDBREAKPROCW
EVENTMSG EVENTMSG
FILTERKEYS FILTERKEYS
GRAYSTRINGPROC GUITHREADINFO
GRAYSTRINGPROC GRAYSTRINGPROC
HARDWAREHOOKSTRUCT HARDWAREHOOKSTRUCT
HARDWAREINPUT HARDWAREINPUT
@ -853,7 +913,6 @@ HELPWININFOW
HIGHCONTRASTA HIGHCONTRASTA
HIGHCONTRASTW HIGHCONTRASTW
HOOKPROC HOOKPROC
HOOKPROC
ICONINFO ICONINFO
ICONMETRICSA ICONMETRICSA
ICONMETRICSW ICONMETRICSW
@ -974,8 +1033,6 @@ MSLLHOOKSTRUCT
MULTIKEYHELPA MULTIKEYHELPA
MULTIKEYHELPW MULTIKEYHELPW
NAMEENUMPROCA NAMEENUMPROCA
NAMEENUMPROCA
NAMEENUMPROCW
NAMEENUMPROCW NAMEENUMPROCW
NCCALCSIZE_PARAMS NCCALCSIZE_PARAMS
NMHDR NMHDR
@ -1024,12 +1081,8 @@ PNONCLIENTMETRICSA
PNONCLIENTMETRICSW PNONCLIENTMETRICSW
PPAINTSTRUCT PPAINTSTRUCT
PROPENUMPROCA PROPENUMPROCA
PROPENUMPROCA
PROPENUMPROCEXA
PROPENUMPROCEXA PROPENUMPROCEXA
PROPENUMPROCEXW PROPENUMPROCEXW
PROPENUMPROCEXW
PROPENUMPROCW
PROPENUMPROCW PROPENUMPROCW
PWINDOWINFO PWINDOWINFO
PWINDOWPLACEMENT PWINDOWPLACEMENT
@ -1040,7 +1093,6 @@ PWNDCLASSEXW
PWNDCLASSW PWNDCLASSW
SCROLLINFO SCROLLINFO
SENDASYNCPROC SENDASYNCPROC
SENDASYNCPROC
SERIALKEYSA SERIALKEYSA
SERIALKEYSW SERIALKEYSW
SOUNDSENTRYA SOUNDSENTRYA
@ -1048,7 +1100,6 @@ SOUNDSENTRYW
STICKYKEYS STICKYKEYS
STYLESTRUCT STYLESTRUCT
TIMERPROC TIMERPROC
TIMERPROC
TOGGLEKEYS TOGGLEKEYS
TPMPARAMS TPMPARAMS
TRACKMOUSEEVENT TRACKMOUSEEVENT
@ -1056,7 +1107,6 @@ WINDOWINFO: !dwWindowStatus
!WINDOWPLACEMENT !WINDOWPLACEMENT
WINDOWPOS WINDOWPOS
WINEVENTPROC WINEVENTPROC
WINEVENTPROC
WINSTAENUMPROCA WINSTAENUMPROCA
WINSTAENUMPROCW WINSTAENUMPROCW
WNDCLASSA WNDCLASSA
@ -1064,5 +1114,4 @@ WNDCLASSEXA
WNDCLASSEXW WNDCLASSEXW
WNDCLASSW WNDCLASSW
WNDENUMPROC WNDENUMPROC
WNDENUMPROC
WNDPROC WNDPROC

View File

@ -225,11 +225,7 @@ sub _find_align_kind_size {
$align = 4; $align = 4;
$kind = "unsigned"; $kind = "unsigned";
$size = 4; $size = 4;
} elsif (/^LP(?:CSTR|CWSTR|DWORD|STR|VOID|THREAD_START_ROUTINE|WSTR)$/) { } elsif (/^LP(?:CSTR|CWSTR|DWORD|VOID|WSTR)$/) {
$align = 4;
$kind = "pointer";
$size = 4;
} elsif (/^(?:(?:MSGBOX)CALLBACK[AW]?|(?:FAR|WND)PROC[AW]?)$/) {
$align = 4; $align = 4;
$kind = "pointer"; $kind = "pointer";
$size = 4; $size = 4;
@ -247,7 +243,10 @@ sub _find_align_kind_size {
$output->write("$type_name: can't parse type\n"); $output->write("$type_name: can't parse type\n");
$size_parse_reported{$_} = 1; $size_parse_reported{$_} = 1;
} }
} elsif (/^\w+\s*\((?:\s*CALLBACK|\s*NTAPI|\s*WINAPI)?\s*\*\s*\)\s*\(.*?\)$/) {
$align = 4;
$kind = "pointer";
$size = 4;
} }
my $align2; my $align2;
@ -627,17 +626,24 @@ sub output_test_pack_type {
if (defined($type2)) { if (defined($type2)) {
return $type2; return $type2;
} else { } else {
$output->write("$type_name2: type not found (ignored)\n"); if ($type_name2 !~ /^(?:PVOID|VOID|void)$/) {
$output->write("$type_name2: warning: type not found 1\n");
}
return undef; return undef;
} }
} else { } elsif ($type_name2 =~ /^\w+$/) {
my $type2 = $$type_name2type{$type_name2}; my $type2 = $$type_name2type{$type_name2};
if (defined($type2)) { if (defined($type2)) {
return &$dereference_type($type2); return &$dereference_type($type2);
} else { } else {
$output->write("$type_name2: type not found (ignored)\n"); $output->write("$type_name2: warning: type not found\n");
return undef; return undef;
} }
} elsif ($type_name2 =~ /^\w+\s*\((?:\s*CALLBACK|\s*NTAPI|\s*WINAPI)?\s*\*\s*\)\s*\(.*?\)$/) {
return undef;
} else {
$output->write("$type_name2: warning: type can't be parsed\n");
return undef;
} }
}; };
@ -653,7 +659,7 @@ sub output_test_pack_type {
if (!$optional && !scalar(keys(%$optional_fields2)) && defined($type_align2) && defined($type_size2)) { if (!$optional && !scalar(keys(%$optional_fields2)) && defined($type_align2) && defined($type_size2)) {
print OUT " TEST_TYPE_POINTER($type_name, $type_size2, $type_align2);\n"; print OUT " TEST_TYPE_POINTER($type_name, $type_size2, $type_align2);\n";
} else { } else {
$output->write("$type_name: type size not found (ignored)\n"); # $output->write("$type_name: warning: type size not found\n");
} }
} }
} elsif ($type_kind eq "signed") { } elsif ($type_kind eq "signed") {
@ -715,12 +721,13 @@ sub output_test_pack {
my $test_dir = shift; my $test_dir = shift;
my $test = shift; my $test = shift;
my $type_names_used = shift;
$output->prefix("$test_dir: $test: "); $output->prefix("$test_dir: $test: ");
my @headers = $tests->get_section($test_dir, $test, "header"); my @headers = $tests->get_section($test_dir, $test, "header");
my @type_names = $tests->get_section($test_dir, $test, "type"); my @type_names = $tests->get_section($test_dir, $test, "type");
my %type_name_not_used;
my %type_name2optional; my %type_name2optional;
my %type_name2optional_fields; my %type_name2optional_fields;
@ -742,7 +749,6 @@ sub output_test_pack {
} }
$type_name2optional_fields{$type_name} = $optional_fields; $type_name2optional_fields{$type_name} = $optional_fields;
$type_name_not_used{$type_name} = 1;
} }
foreach my $header (@headers) { foreach my $header (@headers) {
@ -751,31 +757,25 @@ sub output_test_pack {
foreach my $_type_name (@type_names) { foreach my $_type_name (@type_names) {
my $type_name = $_type_name; my $type_name = $_type_name;
next if $type_name =~ /^!/; my $skip = ($type_name =~ s/^!//);
$type_name =~ s/:.*?$//; $type_name =~ s/:.*?$//;
my $type = $$type_name2type{$type_name}; my $type = $$type_name2type{$type_name};
if (!defined($type)) { if (!defined($type)) {
next; next;
} }
$type_name_not_used{$type_name} = 0; $$type_names_used{$type_name} = $skip ? -1 : 1;
next if $skip;
output_test_pack_type(\*OUT, $type_name2type, \%type_name2optional, \%type_name2optional_fields, $type_name, $type);
output_test_pack_fields(\*OUT, $type_name2type, \%type_name2optional, \%type_name2optional_fields, $type_name, $type, 0); print OUT "static void test_${test}_$type_name(void)\n";
print OUT "{\n";
output_test_pack_type(\*OUT, $type_name2type, \%type_name2optional, \%type_name2optional_fields,
$type_name, $type);
output_test_pack_fields(\*OUT, $type_name2type, \%type_name2optional, \%type_name2optional_fields,
$type_name, $type, 0);
print OUT "}\n";
print OUT "\n"; print OUT "\n";
} }
} }
foreach my $_type_name (@type_names) {
my $type_name = $_type_name;
next if $type_name =~ /^!/;
$type_name =~ s/:.*?$//;
if ($type_name_not_used{$type_name}) {
# $output->write("$type_name: type not found (ignored)\n");
}
}
} }
@ -788,18 +788,27 @@ sub output_file {
my $test_dir = shift; my $test_dir = shift;
my @tests = @{(shift)}; my @tests = @{(shift)};
my $type_names_used = shift;
output_header(\*OUT, $test_dir, \@tests); output_header(\*OUT, $test_dir, \@tests);
foreach my $test (@tests) { foreach my $test (@tests) {
print OUT "void test_$test(void)\n"; my %type_names_used2;
print OUT "{\n";
if ($test eq "pack") { if ($test eq "pack") {
output_test_pack(\*OUT, $test_dir, $test); output_test_pack(\*OUT, $test_dir, $test, \%type_names_used2);
} else { } else {
die "no such test ($test)\n"; die "no such test ($test)\n";
} }
print OUT "static void test_$test(void)\n";
print OUT "{\n";
foreach my $type_name (sort(keys(%type_names_used2))) {
$$type_names_used{$type_name} = $type_names_used2{$type_name};
if ($type_names_used2{$type_name} > 0) {
print OUT " test_${test}_$type_name();\n";
}
}
print OUT "}\n"; print OUT "}\n";
print OUT "\n"; print OUT "\n";
} }
@ -812,8 +821,38 @@ sub output_file {
######################################################################## ########################################################################
# main # main
my %type_names_used = ();
my @test_dirs = $tests->get_test_dirs(); my @test_dirs = $tests->get_test_dirs();
foreach my $test_dir (@test_dirs) { foreach my $test_dir (@test_dirs) {
my $file = "$wine_dir/$test_dir/generated.c"; my $file = "$wine_dir/$test_dir/generated.c";
replace_file($file, \&output_file, $test_dir, \@tests); replace_file($file, \&output_file, $test_dir, \@tests, \%type_names_used);
}
foreach my $header (sort(keys(%file2types))) {
$output->prefix("$header: ");
$header =~ s%^include/%%;
my $type_name2type = $file2types{"include/$header"};
foreach my $_type_name (sort(keys(%$type_name2type))) {
my $type_name = $_type_name;
if (!exists($type_names_used{$type_name})) {
$output->write("$type_name: type not used\n");
}
}
}
$output->prefix("$winapi_dir/tests.dat: ");
foreach my $type_name (sort(keys(%type_names_used))) {
my $found = 0;
foreach my $header (sort(keys(%file2types))) {
my $type_name2type = $file2types{"include/$header"};
if (exists($type_name2type{$type_name})) {
$found = 1;
}
}
if (!$found) {
$output->write("$type_name: type not used\n");
}
} }