parent
d313073247
commit
df6d37e0f2
|
@ -69,6 +69,17 @@ sub name {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub pack {
|
||||||
|
my $self = shift;
|
||||||
|
my $pack = \${$self->{PACK}};
|
||||||
|
|
||||||
|
local $_ = shift;
|
||||||
|
|
||||||
|
if(defined($_)) { $$pack = $_; }
|
||||||
|
|
||||||
|
return $$pack;
|
||||||
|
}
|
||||||
|
|
||||||
sub fields {
|
sub fields {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
|
|
|
@ -52,3 +52,251 @@ WIN32_FILE_ATTRIBUTE_DATA
|
||||||
WIN32_FIND_DATAA
|
WIN32_FIND_DATAA
|
||||||
WIN32_FIND_DATAW
|
WIN32_FIND_DATAW
|
||||||
WIN32_STREAM_ID
|
WIN32_STREAM_ID
|
||||||
|
|
||||||
|
%%%dlls/gdi/tests
|
||||||
|
|
||||||
|
%%pack
|
||||||
|
|
||||||
|
%description
|
||||||
|
|
||||||
|
Unit tests for data structure packing
|
||||||
|
|
||||||
|
%include
|
||||||
|
|
||||||
|
wingdi.h
|
||||||
|
|
||||||
|
%struct
|
||||||
|
|
||||||
|
ABC
|
||||||
|
ABCFLOAT
|
||||||
|
BITMAP
|
||||||
|
BITMAPCOREHEADER
|
||||||
|
# BITMAPCOREINFO
|
||||||
|
BITMAPFILEHEADER
|
||||||
|
# BITMAPINFO
|
||||||
|
BITMAPINFOHEADER
|
||||||
|
# BITMAPV4HEADER
|
||||||
|
# BITMAPV5HEADER
|
||||||
|
BLENDFUNCTION
|
||||||
|
# CHARSETINFO
|
||||||
|
CIEXYZ
|
||||||
|
# CIEXYZTRIPLE
|
||||||
|
# COLORADJUSTMENT
|
||||||
|
# DEVMODEA
|
||||||
|
# DEVMODEW
|
||||||
|
# DIBSECTION
|
||||||
|
DISPLAY_DEVICEA
|
||||||
|
DISPLAY_DEVICEW
|
||||||
|
DOCINFOA
|
||||||
|
DOCINFOW
|
||||||
|
EMR
|
||||||
|
EMRABORTPATH
|
||||||
|
EMRANGLEARC
|
||||||
|
EMRARC
|
||||||
|
EMRBITBLT
|
||||||
|
# EMRCREATEBRUSHINDIRECT
|
||||||
|
# EMRCREATECOLORSPACE
|
||||||
|
# EMRCREATECOLORSPACEW
|
||||||
|
EMRCREATEDIBPATTERNBRUSHPT
|
||||||
|
EMRCREATEMONOBRUSH
|
||||||
|
# EMRCREATEPALETTE
|
||||||
|
# EMRCREATEPEN
|
||||||
|
EMRDELETECOLORSPACE
|
||||||
|
EMRDELETEOBJECT
|
||||||
|
EMRELLIPSE
|
||||||
|
EMREOF
|
||||||
|
EMREXCLUDECLIPRECT
|
||||||
|
# EMREXTCREATEFONTINDIRECTW
|
||||||
|
# EMREXTCREATEPEN
|
||||||
|
EMREXTFLOODFILL
|
||||||
|
# EMREXTSELECTCLIPRGN
|
||||||
|
# EMREXTTEXTOUTA
|
||||||
|
EMRFILLPATH
|
||||||
|
# EMRFILLRGN
|
||||||
|
EMRFORMAT
|
||||||
|
# EMRFRAMERGN
|
||||||
|
# EMRGDICOMMENT
|
||||||
|
# EMRGLSBOUNDEDRECORD
|
||||||
|
# EMRGLSRECORD
|
||||||
|
# EMRINVERTRGN
|
||||||
|
EMRLINETO
|
||||||
|
EMRMASKBLT
|
||||||
|
EMRMODIFYWORLDTRANSFORM
|
||||||
|
EMROFFSETCLIPRGN
|
||||||
|
# EMRPIXELFORMAT
|
||||||
|
EMRPLGBLT
|
||||||
|
# EMRPOLYDRAW
|
||||||
|
EMRPOLYLINE
|
||||||
|
EMRPOLYPOLYLINE
|
||||||
|
# EMRPOLYTEXTOUTA
|
||||||
|
EMRRESIZEPALETTE
|
||||||
|
EMRRESTOREDC
|
||||||
|
EMRROUNDRECT
|
||||||
|
EMRSCALEVIEWPORTEXTEX
|
||||||
|
EMRSELECTCLIPPATH
|
||||||
|
EMRSELECTPALETTE
|
||||||
|
EMRSETARCDIRECTION
|
||||||
|
EMRSETBKCOLOR
|
||||||
|
EMRSETBRUSHORGEX
|
||||||
|
# EMRSETCOLORADJUSTMENT
|
||||||
|
EMRSETDIBITSTODEIVCE
|
||||||
|
EMRSETMAPPERFLAGS
|
||||||
|
EMRSETMITERLIMIT
|
||||||
|
EMRSETPALETTEENTRIES
|
||||||
|
EMRSETPIXELV
|
||||||
|
EMRSETTEXTJUSTIFICATION
|
||||||
|
EMRSETVIEWPORTEXTEX
|
||||||
|
EMRSETWORLDTRANSFORM
|
||||||
|
EMRSTRETCHBLT
|
||||||
|
EMRSTRETCHDIBITS
|
||||||
|
EMRTEXT
|
||||||
|
# ENHMETAHEADER
|
||||||
|
ENHMETARECORD
|
||||||
|
# ENUMLOGFONTA
|
||||||
|
# ENUMLOGFONTEXA
|
||||||
|
# ENUMLOGFONTEXW
|
||||||
|
# ENUMLOGFONTW
|
||||||
|
# EXTLOGFONTA
|
||||||
|
# EXTLOGFONTW
|
||||||
|
EXTLOGPEN
|
||||||
|
# FIXED
|
||||||
|
FONTSIGNATURE
|
||||||
|
GCP_RESULTSA
|
||||||
|
GCP_RESULTSW
|
||||||
|
# GLYPHMETRICS
|
||||||
|
GRADIENT_RECT
|
||||||
|
GRADIENT_TRIANGLE
|
||||||
|
HANDLETABLE
|
||||||
|
KERNINGPAIR
|
||||||
|
LOCALESIGNATURE
|
||||||
|
LOGBRUSH
|
||||||
|
# LOGCOLORSPACEA
|
||||||
|
# LOGCOLORSPACEW
|
||||||
|
# LOGFONTA
|
||||||
|
# LOGFONTW
|
||||||
|
LOGPALETTE
|
||||||
|
LOGPEN
|
||||||
|
MAT2
|
||||||
|
METAFILEPICT
|
||||||
|
METAHEADER
|
||||||
|
METARECORD
|
||||||
|
# NEWTEXTMETRICA
|
||||||
|
# NEWTEXTMETRICEXA
|
||||||
|
# NEWTEXTMETRICEXW
|
||||||
|
# NEWTEXTMETRICW
|
||||||
|
# OUTLINETEXTMETRICA
|
||||||
|
# OUTLINETEXTMETRICW
|
||||||
|
PALETTEENTRY
|
||||||
|
# PANOSE
|
||||||
|
PELARRAY
|
||||||
|
PIXELFORMATDESCRIPTOR
|
||||||
|
POINTFX
|
||||||
|
# POLYTEXTA
|
||||||
|
# POLYTEXTW
|
||||||
|
# RASTERIZER_STATUS
|
||||||
|
RGBQUAD
|
||||||
|
# RGBTRIPLE
|
||||||
|
# RGNDATA
|
||||||
|
# RGNDATAHEADER
|
||||||
|
TEXTMETRICA
|
||||||
|
TEXTMETRICW
|
||||||
|
# TRIVERTEX
|
||||||
|
# TTPOLYCURVE
|
||||||
|
# TTPOLYGONHEADER
|
||||||
|
XFORM
|
||||||
|
|
||||||
|
%%%dlls/user/tests
|
||||||
|
|
||||||
|
%%pack
|
||||||
|
|
||||||
|
%description
|
||||||
|
|
||||||
|
Unit tests for data structure packing
|
||||||
|
|
||||||
|
%include
|
||||||
|
|
||||||
|
winbase.h
|
||||||
|
winuser.h
|
||||||
|
|
||||||
|
%struct
|
||||||
|
|
||||||
|
# ACCEL
|
||||||
|
ACCESSTIMEOUT
|
||||||
|
ANIMATIONINFO
|
||||||
|
CBTACTIVATESTRUCT
|
||||||
|
CBT_CREATEWNDA
|
||||||
|
CBT_CREATEWNDW
|
||||||
|
CLIENTCREATESTRUCT
|
||||||
|
COMPAREITEMSTRUCT
|
||||||
|
COPYDATASTRUCT
|
||||||
|
CREATESTRUCTA
|
||||||
|
CREATESTRUCTW
|
||||||
|
CURSORINFO
|
||||||
|
CWPRETSTRUCT
|
||||||
|
CWPSTRUCT
|
||||||
|
DEBUGHOOKINFO
|
||||||
|
DELETEITEMSTRUCT
|
||||||
|
DLGITEMTEMPLATE
|
||||||
|
DLGTEMPLATE
|
||||||
|
DRAWITEMSTRUCT
|
||||||
|
DRAWTEXTPARAMS
|
||||||
|
EVENTMSG
|
||||||
|
FILTERKEYS
|
||||||
|
HARDWAREHOOKSTRUCT
|
||||||
|
HARDWAREINPUT
|
||||||
|
HELPINFO
|
||||||
|
HELPWININFOA
|
||||||
|
HELPWININFOW
|
||||||
|
HIGHCONTRASTA
|
||||||
|
HIGHCONTRASTW
|
||||||
|
ICONINFO
|
||||||
|
# ICONMETRICSA
|
||||||
|
# ICONMETRICSW
|
||||||
|
# INPUT
|
||||||
|
KBDLLHOOKSTRUCT
|
||||||
|
KEYBDINPUT
|
||||||
|
MDICREATESTRUCTA
|
||||||
|
MDICREATESTRUCTW
|
||||||
|
MDINEXTMENU
|
||||||
|
MEASUREITEMSTRUCT
|
||||||
|
MENUINFO
|
||||||
|
MENUITEMINFOA
|
||||||
|
MENUITEMINFOW
|
||||||
|
# MENUITEMTEMPLATE
|
||||||
|
MENUITEMTEMPLATEHEADER
|
||||||
|
MINIMIZEDMETRICS
|
||||||
|
MINMAXINFO
|
||||||
|
MONITORINFO
|
||||||
|
# MONITORINFOEXA
|
||||||
|
# MONITORINFOEXW
|
||||||
|
MOUSEHOOKSTRUCT
|
||||||
|
MOUSEINPUT
|
||||||
|
MOUSEKEYS
|
||||||
|
MSG
|
||||||
|
MSGBOXPARAMSA
|
||||||
|
MSGBOXPARAMSW
|
||||||
|
MSLLHOOKSTRUCT
|
||||||
|
MULTIKEYHELPA
|
||||||
|
MULTIKEYHELPW
|
||||||
|
NCCALCSIZE_PARAMS
|
||||||
|
NMHDR
|
||||||
|
# NONCLIENTMETRICSA
|
||||||
|
# NONCLIENTMETRICSW
|
||||||
|
PAINTSTRUCT
|
||||||
|
SCROLLINFO
|
||||||
|
SERIALKEYSA
|
||||||
|
SERIALKEYSW
|
||||||
|
SOUNDSENTRYA
|
||||||
|
SOUNDSENTRYW
|
||||||
|
STICKYKEYS
|
||||||
|
STYLESTRUCT
|
||||||
|
TOGGLEKEYS
|
||||||
|
TPMPARAMS
|
||||||
|
TRACKMOUSEEVENT
|
||||||
|
WINDOWINFO
|
||||||
|
WINDOWPLACEMENT
|
||||||
|
WINDOWPOS
|
||||||
|
WNDCLASSA
|
||||||
|
WNDCLASSEXA
|
||||||
|
WNDCLASSEXW
|
||||||
|
WNDCLASSW
|
||||||
|
|
|
@ -91,6 +91,7 @@ foreach my $file (@files) {
|
||||||
|
|
||||||
my $line;
|
my $line;
|
||||||
my $type;
|
my $type;
|
||||||
|
my @packs = (4);
|
||||||
|
|
||||||
my $update_output = sub {
|
my $update_output = sub {
|
||||||
my $progress = "";
|
my $progress = "";
|
||||||
|
@ -116,9 +117,28 @@ foreach my $file (@files) {
|
||||||
};
|
};
|
||||||
$parser->set_found_line_callback($found_line);
|
$parser->set_found_line_callback($found_line);
|
||||||
|
|
||||||
|
my $found_preprocessor = sub {
|
||||||
|
my $begin_line = shift;
|
||||||
|
my $begin_column = shift;
|
||||||
|
my $preprocessor = shift;
|
||||||
|
|
||||||
|
local $_ = $preprocessor;
|
||||||
|
if (/^\#\s*include\s+\"pshpack(\d+)\.h\"$/) {
|
||||||
|
push @packs, $1;
|
||||||
|
} elsif(/^\#\s*include\s+\"poppack\.h\"$/) {
|
||||||
|
unshift @packs;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
};
|
||||||
|
$parser->set_found_preprocessor_callback($found_preprocessor);
|
||||||
|
|
||||||
my $found_type = sub {
|
my $found_type = sub {
|
||||||
$type = shift;
|
$type = shift;
|
||||||
|
|
||||||
|
my $pack = $packs[$#packs];
|
||||||
|
$type->pack($pack);
|
||||||
|
|
||||||
my $name = $type->name;
|
my $name = $type->name;
|
||||||
$file2types{$file}{$name} = $type;
|
$file2types{$file}{$name} = $type;
|
||||||
|
|
||||||
|
@ -139,20 +159,25 @@ foreach my $file (@files) {
|
||||||
$output->prefix("");
|
$output->prefix("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# output_header
|
||||||
|
|
||||||
sub output_header {
|
sub output_header {
|
||||||
local *OUT = shift;
|
local *OUT = shift;
|
||||||
|
|
||||||
my $test_dir = shift;
|
my $test_dir = shift;
|
||||||
my $test = shift;
|
my @tests = @{(shift)};
|
||||||
|
|
||||||
print OUT "/* File generated automatically from $wine_dir/tools/winapi/test.dat; do not edit! */\n";
|
print OUT "/* File generated automatically from tools/winapi/test.dat; do not edit! */\n";
|
||||||
print OUT "/* This file can be copied, modified and distributed without restriction. */\n";
|
print OUT "/* This file can be copied, modified and distributed without restriction. */\n";
|
||||||
print OUT "\n";
|
print OUT "\n";
|
||||||
|
|
||||||
print OUT "/*\n";
|
print OUT "/*\n";
|
||||||
my @description = $tests->get_section($test_dir, $test, "description");
|
foreach my $test (@tests) {
|
||||||
foreach my $description (@description) {
|
my @description = $tests->get_section($test_dir, $test, "description");
|
||||||
print OUT " * $description\n";
|
foreach my $description (@description) {
|
||||||
|
print OUT " * $description\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
print OUT " */\n";
|
print OUT " */\n";
|
||||||
|
|
||||||
|
@ -160,25 +185,37 @@ sub output_header {
|
||||||
print OUT "#include <stdio.h>\n";
|
print OUT "#include <stdio.h>\n";
|
||||||
print OUT "\n";
|
print OUT "\n";
|
||||||
print OUT "#include \"wine/test.h\"\n";
|
print OUT "#include \"wine/test.h\"\n";
|
||||||
my @includes = $tests->get_section($test_dir, $test, "include");
|
foreach my $test (@tests) {
|
||||||
foreach my $include (@includes) {
|
my @includes = $tests->get_section($test_dir, $test, "include");
|
||||||
print OUT "#include \"$include\"\n";
|
foreach my $include (@includes) {
|
||||||
|
print OUT "#include \"$include\"\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
print OUT "\n";
|
print OUT "\n";
|
||||||
|
|
||||||
print OUT "START_TEST(generated_$test)\n";
|
|
||||||
print OUT "{\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# output_footer
|
||||||
|
|
||||||
sub output_footer {
|
sub output_footer {
|
||||||
local *OUT = shift;
|
local *OUT = shift;
|
||||||
|
|
||||||
my $test_dir = shift;
|
my $test_dir = shift;
|
||||||
my $test = shift;
|
my @tests = @{(shift)};
|
||||||
|
|
||||||
|
print OUT "START_TEST(generated)\n";
|
||||||
|
print OUT "{\n";
|
||||||
|
foreach my $test (@tests) {
|
||||||
|
print OUT " test_$test();\n";
|
||||||
|
}
|
||||||
print OUT "}\n";
|
print OUT "}\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# output_field_size
|
||||||
|
|
||||||
|
my %type_name2size;
|
||||||
|
|
||||||
sub field_size {
|
sub field_size {
|
||||||
my $name = shift;
|
my $name = shift;
|
||||||
my $field_type = shift;
|
my $field_type = shift;
|
||||||
|
@ -194,15 +231,19 @@ sub field_size {
|
||||||
}
|
}
|
||||||
|
|
||||||
my $size;
|
my $size;
|
||||||
if(/^(?:(?:signed\s+|unsigned\s+)?char|CHAR|BYTE|UCHAR)$/) {
|
if (defined($size = $type_name2size{$field_type})) {
|
||||||
|
# Nothing
|
||||||
|
} elsif(/^(?:(?:signed\s+|unsigned\s+)?char|CHAR|BYTE|UCHAR)$/) {
|
||||||
$size = 1;
|
$size = 1;
|
||||||
} elsif (/^(?:(?:signed\s+|unsigned\s+)?short|UWORD|WCHAR|WORD)$/) {
|
} elsif (/^(?:(?:signed\s+|unsigned\s+)?short|ATOM|UWORD|WCHAR|WORD)$/) {
|
||||||
$size = 2;
|
$size = 2;
|
||||||
} elsif (/^(?:FILETIME|LARGE_INTEGER|LONGLONG|ULONGLONG)$/) {
|
} elsif (/^(?:FILETIME|LARGE_INTEGER|LONGLONG|ULONGLONG)$/) {
|
||||||
$size = 8;
|
$size = 8;
|
||||||
} elsif (/^(?:SYSTEMTIME)$/) {
|
} elsif (/^(?:EMR|POINTL?|SIZEL)$/) {
|
||||||
|
$size = 8;
|
||||||
|
} elsif (/^(?:RECTL?|SYSTEMTIME)$/) {
|
||||||
$size = 16;
|
$size = 16;
|
||||||
} elsif (/^(?:CRITICAL_SECTION)$/) {
|
} elsif (/^(?:CRITICAL_SECTION|XFORM)$/) {
|
||||||
$size = 24;
|
$size = 24;
|
||||||
} elsif (/^(?:DCB)$/) {
|
} elsif (/^(?:DCB)$/) {
|
||||||
$size = 28;
|
$size = 28;
|
||||||
|
@ -232,26 +273,36 @@ sub field_size {
|
||||||
}
|
}
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# output_file
|
# output_test_pack
|
||||||
|
|
||||||
sub output_file {
|
sub output_test_pack {
|
||||||
local *OUT = shift;
|
local *OUT = shift;
|
||||||
|
|
||||||
my $test_dir = shift;
|
my $test_dir = shift;
|
||||||
my $test = shift;
|
my $test = shift;
|
||||||
|
|
||||||
output_header(\*OUT, $test_dir, $test);
|
|
||||||
|
|
||||||
my @includes = $tests->get_section($test_dir, $test, "include");
|
my @includes = $tests->get_section($test_dir, $test, "include");
|
||||||
my @type_names = $tests->get_section($test_dir, $test, "struct");
|
my @type_names = $tests->get_section($test_dir, $test, "struct");
|
||||||
|
|
||||||
|
my %type_name_not_used;
|
||||||
|
|
||||||
|
foreach my $type_name (@type_names) {
|
||||||
|
$type_name_not_used{$type_name} = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
# FIXME: Topological sort of @type_names
|
||||||
|
|
||||||
foreach my $include (@includes) {
|
foreach my $include (@includes) {
|
||||||
my $types = $file2types{"include/$include"};
|
my $types = $file2types{"include/$include"};
|
||||||
|
|
||||||
foreach my $type_name (@type_names) {
|
foreach my $type_name (@type_names) {
|
||||||
my $pack = 4; # FIXME: Not always correct
|
|
||||||
|
|
||||||
my $type = $$types{$type_name};
|
my $type = $$types{$type_name};
|
||||||
|
if (!defined($type)) {
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
$type_name_not_used{$type_name} = 0;
|
||||||
|
|
||||||
|
my $pack = $type->pack;
|
||||||
|
|
||||||
my $offset = 0;
|
my $offset = 0;
|
||||||
my $offset_bits = 0;
|
my $offset_bits = 0;
|
||||||
|
@ -284,6 +335,7 @@ sub output_file {
|
||||||
if ($type_size % $pack != 0) {
|
if ($type_size % $pack != 0) {
|
||||||
$type_size = (int($type_size / $pack) + 1) * $pack;
|
$type_size = (int($type_size / $pack) + 1) * $pack;
|
||||||
}
|
}
|
||||||
|
$type_name2size{$type_name} = $type_size;
|
||||||
|
|
||||||
print OUT " ok(sizeof($type_name) == $type_size, ";
|
print OUT " ok(sizeof($type_name) == $type_size, ";
|
||||||
print OUT "\"sizeof($type_name) == %d (expected $type_size)\", ";
|
print OUT "\"sizeof($type_name) == %d (expected $type_size)\", ";
|
||||||
|
@ -292,13 +344,47 @@ sub output_file {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
output_footer(\*OUT, $test_dir, $test);
|
foreach my $type_name (@type_names) {
|
||||||
}
|
if ($type_name_not_used{$type_name}) {
|
||||||
|
$output->write("$test_dir: $test: $type_name: type not found (ignored)\n");
|
||||||
foreach my $test (@tests) {
|
}
|
||||||
my @test_dirs = $tests->get_test_dirs($test);
|
|
||||||
foreach my $test_dir (@test_dirs) {
|
|
||||||
my $file = "$wine_dir/$test_dir/generated_$test.c";
|
|
||||||
replace_file($file, \&output_file, $test_dir, $test);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# output_file
|
||||||
|
|
||||||
|
sub output_file {
|
||||||
|
local *OUT = shift;
|
||||||
|
|
||||||
|
my $test_dir = shift;
|
||||||
|
my @tests = @{(shift)};
|
||||||
|
|
||||||
|
output_header(\*OUT, $test_dir, \@tests);
|
||||||
|
|
||||||
|
foreach my $test (@tests) {
|
||||||
|
print OUT "void test_$test(void)\n";
|
||||||
|
print OUT "{\n";
|
||||||
|
|
||||||
|
if ($test eq "pack") {
|
||||||
|
output_test_pack(\*OUT, $test_dir, $test);
|
||||||
|
} else {
|
||||||
|
die "no such test ($test)\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
print OUT "}\n";
|
||||||
|
print OUT "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
output_footer(\*OUT, $test_dir, \@tests);
|
||||||
|
}
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# main
|
||||||
|
|
||||||
|
my @test_dirs = $tests->get_test_dirs();
|
||||||
|
foreach my $test_dir (@test_dirs) {
|
||||||
|
my $file = "$wine_dir/$test_dir/generated.c";
|
||||||
|
replace_file($file, \&output_file, $test_dir, \@tests);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue