blob: f148160f0471b192f52ff692f0e68e8d50fc8d4a [file] [log] [blame]
Alexandre Julliard0799c1a2002-03-09 23:29:33 +00001#
2# Copyright 1999, 2000, 2001 Patrik Stridvall
3#
4# This library is free software; you can redistribute it and/or
5# modify it under the terms of the GNU Lesser General Public
6# License as published by the Free Software Foundation; either
7# version 2.1 of the License, or (at your option) any later version.
8#
9# This library is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12# Lesser General Public License for more details.
13#
14# You should have received a copy of the GNU Lesser General Public
15# License along with this library; if not, write to the Free Software
16# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17#
18
Patrik Stridvall6a012e22001-06-13 19:38:29 +000019package config;
20
21use strict;
22
23use setup qw($current_dir $wine_dir $winapi_dir $winapi_check_dir);
24
25use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
26require Exporter;
27
28@ISA = qw(Exporter);
29@EXPORT = qw(
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +000030 &file_absolutize &file_normalize
Patrik Stridvall67f0a702001-07-26 21:42:12 +000031 &file_directory
Patrik Stridvall35a723b2001-06-20 22:53:21 +000032 &file_type &files_filter
Patrik Stridvall67f0a702001-07-26 21:42:12 +000033 &file_skip &files_skip
Patrik Stridvall0704650f2002-07-19 00:31:05 +000034 &get_c_files &get_h_files &get_spec_files
Patrik Stridvall6a012e22001-06-13 19:38:29 +000035);
36@EXPORT_OK = qw(
37 $current_dir $wine_dir $winapi_dir $winapi_check_dir
38);
39
40use vars qw($current_dir $wine_dir $winapi_dir $winapi_check_dir);
41
Patrik Stridvall1c61b3b2001-07-23 23:20:56 +000042use output qw($output);
Patrik Stridvallc3e8ac32001-07-11 17:27:45 +000043
Patrik Stridvall67f0a702001-07-26 21:42:12 +000044use File::Find;
45
Patrik Stridvall6a012e22001-06-13 19:38:29 +000046sub file_type {
Patrik Stridvall35a723b2001-06-20 22:53:21 +000047 local $_ = shift;
Patrik Stridvall6a012e22001-06-13 19:38:29 +000048
Patrik Stridvall35a723b2001-06-20 22:53:21 +000049 $_ = file_absolutize($_);
50
51 m%^(?:libtest|rc|server|tests|tools)/% && return "";
52 m%^(?:programs|debugger|miscemu)/% && return "wineapp";
53 m%^(?:library|tsx11|unicode)/% && return "library";
Patrik Stridvall67f0a702001-07-26 21:42:12 +000054 m%^windows/x11drv/wineclipsrv\.c$% && return "application";
Patrik Stridvall35a723b2001-06-20 22:53:21 +000055
56 return "winelib";
57}
58
59sub files_filter {
60 my $type = shift;
61
62 my @files;
63 foreach my $file (@_) {
64 if(file_type($file) eq $type) {
65 push @files, $file;
66 }
Patrik Stridvall6a012e22001-06-13 19:38:29 +000067 }
68
Patrik Stridvall35a723b2001-06-20 22:53:21 +000069 return @files;
Patrik Stridvall6a012e22001-06-13 19:38:29 +000070}
71
72sub file_skip {
73 local $_ = shift;
74
Patrik Stridvall35a723b2001-06-20 22:53:21 +000075 $_ = file_absolutize($_);
Patrik Stridvall6a012e22001-06-13 19:38:29 +000076
77 m%^(?:libtest|programs|rc|server|tests|tools)/% && return 1;
78 m%^(?:debugger|miscemu|tsx11|server|unicode)/% && return 1;
79 m%^dlls/wineps/data/% && return 1;
Patrik Stridvall67f0a702001-07-26 21:42:12 +000080 m%^windows/x11drv/wineclipsrv\.c$% && return 1;
81 m%^dlls/winmm/wineoss/midipatch\.c$% && return 1;
82 m%(?:glue|spec)\.c$% && return 1;
Patrik Stridvall6a012e22001-06-13 19:38:29 +000083
84 return 0;
85}
86
87sub files_skip {
88 my @files;
89 foreach my $file (@_) {
90 if(!file_skip($file)) {
91 push @files, $file;
92 }
93 }
94
95 return @files;
96}
97
Patrik Stridvall35a723b2001-06-20 22:53:21 +000098sub file_absolutize {
99 local $_ = shift;
100
101 $_ = file_normalize($_);
102 if(!s%^$wine_dir/%%) {
103 $_ = "$current_dir/$_";
104 }
105 s%^\./%%;
106
107 return $_;
108}
109
Patrik Stridvall163652b2001-06-19 03:34:39 +0000110sub file_normalize {
111 local $_ = shift;
112
113 foreach my $dir (split(m%/%, $current_dir)) {
Patrik Stridvall5bc9a0b2001-07-29 20:19:14 +0000114 if(s%^(\.\./)*\.\./$dir/%%) {
115 if(defined($1)) {
116 $_ = "$1$_";
117 }
118 }
119 }
120
121 while(m%^(.*?)([^/\.]+)/\.\./(.*?)$%) {
122 if($2 ne "." && $2 ne "..") {
123 $_ = "$1$3";
Patrik Stridvall163652b2001-06-19 03:34:39 +0000124 }
125 }
126
127 return $_;
128}
129
Patrik Stridvall67f0a702001-07-26 21:42:12 +0000130sub file_directory {
Patrik Stridvallcec294e2001-07-30 18:49:10 +0000131 local $_ = shift;
Patrik Stridvall67f0a702001-07-26 21:42:12 +0000132
Patrik Stridvallcec294e2001-07-30 18:49:10 +0000133 s%/?[^/]*$%%;
134 if(!$_) {
135 $_ = ".";
Patrik Stridvall67f0a702001-07-26 21:42:12 +0000136 }
Patrik Stridvallcec294e2001-07-30 18:49:10 +0000137
138 s%^(?:\./)?(.*?)(?:/\.)?%$1%;
139
140 return $_;
Patrik Stridvall67f0a702001-07-26 21:42:12 +0000141}
142
Patrik Stridvalld07a6462001-07-18 20:09:12 +0000143sub _get_files {
144 my $extension = shift;
145 my $type = shift;
Patrik Stridvall67f0a702001-07-26 21:42:12 +0000146 my $dir = shift;
Patrik Stridvall6a012e22001-06-13 19:38:29 +0000147
Patrik Stridvalld07a6462001-07-18 20:09:12 +0000148 $output->progress("$wine_dir: searching for *.$extension");
149
Patrik Stridvall67f0a702001-07-26 21:42:12 +0000150 if(!defined($dir)) {
151 $dir = $wine_dir;
152 }
153
154 my @files;
155
156 my @dirs = ($dir);
157 while(defined(my $dir = shift @dirs)) {
158 opendir(DIR, $dir);
159 my @entries= readdir(DIR);
160 closedir(DIR);
161 foreach (@entries) {
Alexandre Julliard7cae5582002-06-01 02:55:48 +0000162 $_ = "$dir/$_";
Patrik Stridvall67f0a702001-07-26 21:42:12 +0000163 if(/\.\.?$/) {
164 # Nothing
165 } elsif(-d $_) {
166 push @dirs, $_;
167 } elsif(/\.$extension$/ && (!defined($type) || file_type($_) eq $type)) {
168 s%^$wine_dir/%%;
169 push @files, $_;
170 }
Patrik Stridvall6a012e22001-06-13 19:38:29 +0000171 }
Patrik Stridvall67f0a702001-07-26 21:42:12 +0000172 }
Patrik Stridvall6a012e22001-06-13 19:38:29 +0000173
Patrik Stridvalld07a6462001-07-18 20:09:12 +0000174 return @files;
Patrik Stridvall6a012e22001-06-13 19:38:29 +0000175}
176
Patrik Stridvalld07a6462001-07-18 20:09:12 +0000177sub get_c_files { return _get_files("c", @_); }
178sub get_h_files { return _get_files("h", @_); }
179sub get_spec_files { return _get_files("spec", @_); }
180
Patrik Stridvall6a012e22001-06-13 19:38:29 +00001811;