Several bug fixes and additions.
[wine] / tools / winapi / config.pm
1 package config;
2
3 use strict;
4
5 use setup qw($current_dir $wine_dir $winapi_dir $winapi_check_dir);
6
7 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
8 require Exporter;
9
10 @ISA = qw(Exporter);
11 @EXPORT = qw(
12     &file_type &files_filter
13     &file_skip &files_skip 
14     &file_absolutize &file_normalize
15     &get_spec_files
16     &translate_calling_convention16 &translate_calling_convention32
17 );
18 @EXPORT_OK = qw(
19     $current_dir $wine_dir $winapi_dir $winapi_check_dir
20 );
21
22 use vars qw($current_dir $wine_dir $winapi_dir $winapi_check_dir);
23
24 sub file_type {
25     local $_ = shift;
26
27     $_ = file_absolutize($_);
28
29     m%^(?:libtest|rc|server|tests|tools)/% && return "";
30     m%^(?:programs|debugger|miscemu)/% && return "wineapp";
31     m%^(?:library|tsx11|unicode)/% && return "library";
32     m%^windows/x11drv/wineclipsrv.c% && return "application";
33
34     return "winelib";
35 }
36
37 sub files_filter {
38     my $type = shift;
39
40     my @files;
41     foreach my $file (@_) {
42         if(file_type($file) eq $type) {
43             push @files, $file;
44         }
45     }
46
47     return @files;
48 }
49
50 sub file_skip {
51     local $_ = shift;
52
53     $_ = file_absolutize($_);
54
55     m%^(?:libtest|programs|rc|server|tests|tools)/% && return 1;
56     m%^(?:debugger|miscemu|tsx11|server|unicode)/% && return 1;
57     m%^dlls/wineps/data/% && return 1;
58     m%^windows/x11drv/wineclipsrv.c% && return 1;
59     m%^dlls/winmm/wineoss/midipatch.c% && return 1;
60
61     return 0;
62 }
63
64 sub files_skip {
65     my @files;
66     foreach my $file (@_) {
67         if(!file_skip($file)) {
68             push @files, $file;
69         }
70     }
71
72     return @files;
73 }
74
75 sub file_absolutize {
76     local $_ = shift;
77
78     $_ = file_normalize($_);
79     if(!s%^$wine_dir/%%) {
80         $_ = "$current_dir/$_";
81     }
82     s%^\./%%;
83
84     return $_;
85 }
86
87 sub file_normalize {
88     local $_ = shift;
89
90     foreach my $dir (split(m%/%, $current_dir)) {
91         s%^(\.\./)*\.\./$dir/%%;
92         if(defined($1)) {
93             $_ = "$1$_";
94         }
95     }
96
97     return $_;
98 }
99
100 sub get_spec_files {
101     output->progress("$wine_dir: searching for *.spec");
102
103     my @spec_files = map {
104         s%^\./%%;
105         s%^$wine_dir/%%;
106         if(file_type($_) eq "winelib") {
107             $_;
108         } else {
109             ();
110         }
111     } split(/\n/, `find $wine_dir -name \\*.spec`);
112
113     return @spec_files;
114 }
115
116 sub translate_calling_convention16 {
117     local $_ = shift;
118
119     if(/^__cdecl$/) {
120         return "cdecl";
121     } elsif(/^VFWAPIV|WINAPIV$/) {
122         return "varargs";
123     } elsif(/^__stdcall|VFWAPI|WINAPI|CALLBACK$/) {
124         return "pascal";
125     } elsif(/^__asm$/) {
126         return "asm";
127     } else {
128         return "cdecl";
129     }
130 }
131
132 sub translate_calling_convention32 {
133     local $_ = shift;
134
135     if(/^__cdecl$/) {
136         return "cdecl";
137     } elsif(/^VFWAPIV|WINAPIV$/) {
138         return "varargs";
139     } elsif(/^__stdcall|VFWAPI|WINAPI|CALLBACK$/) {
140         return "stdcall";
141     } elsif(/^__asm$/) {
142         return "asm";
143     } else {
144         return "cdecl";
145     }
146 }
147
148 1;