1*b1cdbd2cSJim Jagielski:
2*b1cdbd2cSJim Jagielskieval 'exec perl -wS $0 ${1+"$@"}'
3*b1cdbd2cSJim Jagielski    if 0;
4*b1cdbd2cSJim Jagielski
5*b1cdbd2cSJim Jagielski#**************************************************************
6*b1cdbd2cSJim Jagielski#
7*b1cdbd2cSJim Jagielski#  Licensed to the Apache Software Foundation (ASF) under one
8*b1cdbd2cSJim Jagielski#  or more contributor license agreements.  See the NOTICE file
9*b1cdbd2cSJim Jagielski#  distributed with this work for additional information
10*b1cdbd2cSJim Jagielski#  regarding copyright ownership.  The ASF licenses this file
11*b1cdbd2cSJim Jagielski#  to you under the Apache License, Version 2.0 (the
12*b1cdbd2cSJim Jagielski#  "License"); you may not use this file except in compliance
13*b1cdbd2cSJim Jagielski#  with the License.  You may obtain a copy of the License at
14*b1cdbd2cSJim Jagielski#
15*b1cdbd2cSJim Jagielski#    http://www.apache.org/licenses/LICENSE-2.0
16*b1cdbd2cSJim Jagielski#
17*b1cdbd2cSJim Jagielski#  Unless required by applicable law or agreed to in writing,
18*b1cdbd2cSJim Jagielski#  software distributed under the License is distributed on an
19*b1cdbd2cSJim Jagielski#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
20*b1cdbd2cSJim Jagielski#  KIND, either express or implied.  See the License for the
21*b1cdbd2cSJim Jagielski#  specific language governing permissions and limitations
22*b1cdbd2cSJim Jagielski#  under the License.
23*b1cdbd2cSJim Jagielski#
24*b1cdbd2cSJim Jagielski#**************************************************************
25*b1cdbd2cSJim Jagielski
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski
28*b1cdbd2cSJim Jagielski
29*b1cdbd2cSJim Jagielski#*****************************************************************************************
30*b1cdbd2cSJim Jagielski# ASCII parser for the changeover of the current build.lst files to XML files            *
31*b1cdbd2cSJim Jagielski# programmer: Pascal Junck, Sun Microsystems GmbH                                        *
32*b1cdbd2cSJim Jagielski#*****************************************************************************************
33*b1cdbd2cSJim Jagielski
34*b1cdbd2cSJim Jagielski# this is the first step for the changeover of the current 'build.lst' files to the new
35*b1cdbd2cSJim Jagielski# 'build.xlist'(XML) files
36*b1cdbd2cSJim Jagielski# before we create the new ones we have to parse all important informations from the old files
37*b1cdbd2cSJim Jagielski# important parameters are:
38*b1cdbd2cSJim Jagielski# 1. 'module name'
39*b1cdbd2cSJim Jagielski# 2. 'module dependency names'
40*b1cdbd2cSJim Jagielski# 3. 'dependency type'
41*b1cdbd2cSJim Jagielski# 4. 'job dir'
42*b1cdbd2cSJim Jagielski# 5. 'depending directories'
43*b1cdbd2cSJim Jagielski# 6. 'job platform'(only: 'w', 'u', 'm' and 'all')
44*b1cdbd2cSJim Jagielski# 7. 'job'(only: 'nmake' means 'make')
45*b1cdbd2cSJim Jagielski# 8. 'build requirements'(here called: 'restrictions')
46*b1cdbd2cSJim Jagielski
47*b1cdbd2cSJim Jagielski
48*b1cdbd2cSJim Jagielski#################################  begin of main   #######################################
49*b1cdbd2cSJim Jagielski
50*b1cdbd2cSJim Jagielskiuse strict;
51*b1cdbd2cSJim Jagielskiuse lib ("/home/vg119683/work/modules");
52*b1cdbd2cSJim Jagielski
53*b1cdbd2cSJim Jagielskiuse XMLBuildListParser;
54*b1cdbd2cSJim Jagielski
55*b1cdbd2cSJim Jagielski# get and work with each argument(build.lst files) of the commando line
56*b1cdbd2cSJim Jagielski# e.g. if the user wants to parse the build.lst file(s):
57*b1cdbd2cSJim Jagielski#   user input (on unix) for all modules    : 'perl -w ascii_parser.pl /so/ws/SRC680/src.m42/*/prj/build.lst'
58*b1cdbd2cSJim Jagielski#   user input (on windows) for one module  : 'perl -w ascii_parser.pl O:/SRC680/src.m42/[module]/prj/build.lst'
59*b1cdbd2cSJim Jagielski# get all arguments (build.lst files) of the commando line in this global variable '@buildlist_files'
60*b1cdbd2cSJim Jagielskimy @buildlist_files = @ARGV;
61*b1cdbd2cSJim Jagielski# global variable for each file name that we want to parse in ASCII
62*b1cdbd2cSJim Jagielskimy $parse_file = "";
63*b1cdbd2cSJim Jagielski# set the global variable '$debug' (= 1) to see all results on the terminal,
64*b1cdbd2cSJim Jagielski# else (= 0) it shows nothing of the working output!
65*b1cdbd2cSJim Jagielskimy $debug = 0;
66*b1cdbd2cSJim Jagielski
67*b1cdbd2cSJim Jagielski# open the filehandle 'ERROR_LOG' for all errors
68*b1cdbd2cSJim Jagielskiopen (ERROR_LOG, ">>ascii_parse.log")
69*b1cdbd2cSJim Jagielski  or die "Error. Open the file <ascii_parse.log> wasn't successful!\n\n";
70*b1cdbd2cSJim Jagielski
71*b1cdbd2cSJim Jagielski# reference of the instance of a new object
72*b1cdbd2cSJim Jagielskimy $XMLTree;
73*b1cdbd2cSJim Jagielski
74*b1cdbd2cSJim Jagielskiforeach (@buildlist_files)
75*b1cdbd2cSJim Jagielski{
76*b1cdbd2cSJim Jagielski   # get each element (= module) in '$parse_file'
77*b1cdbd2cSJim Jagielski   $parse_file = $_;
78*b1cdbd2cSJim Jagielski
79*b1cdbd2cSJim Jagielski   # open the filehandle 'PARSE_ASCII' for each module/file that we want to parse
80*b1cdbd2cSJim Jagielski   open (PARSE_ASCII, $parse_file)
81*b1cdbd2cSJim Jagielski     or die "Error. Open the module <$parse_file> wasn't successful!\n\n";
82*b1cdbd2cSJim Jagielski
83*b1cdbd2cSJim Jagielski   # create a new object
84*b1cdbd2cSJim Jagielski   $XMLTree = XMLBuildListParser->new();
85*b1cdbd2cSJim Jagielski
86*b1cdbd2cSJim Jagielski   # invoking of the main subroutine
87*b1cdbd2cSJim Jagielski   reading_file();
88*b1cdbd2cSJim Jagielski
89*b1cdbd2cSJim Jagielski   # is the file name 'build.lst' in the path on the command line?
90*b1cdbd2cSJim Jagielski   # if not, we can not parse and create the new 'build.xlist' file
91*b1cdbd2cSJim Jagielski   if ($parse_file =~ /build(\w+)?\.lst\S*$/)
92*b1cdbd2cSJim Jagielski   {
93*b1cdbd2cSJim Jagielski      my $path = $parse_file;
94*b1cdbd2cSJim Jagielski
95*b1cdbd2cSJim Jagielski      $path =~ s/build(\w+)?\.lst\S*$/build\.xlist/;
96*b1cdbd2cSJim Jagielski
97*b1cdbd2cSJim Jagielski      $XMLTree->saveXMLFile($path);
98*b1cdbd2cSJim Jagielski   }
99*b1cdbd2cSJim Jagielski   else
100*b1cdbd2cSJim Jagielski   {
101*b1cdbd2cSJim Jagielski      add_errorlog_no_buildlst_file_found_statement($parse_file);
102*b1cdbd2cSJim Jagielski   }
103*b1cdbd2cSJim Jagielski
104*b1cdbd2cSJim Jagielski   # close the current $parse_file
105*b1cdbd2cSJim Jagielski   close(PARSE_ASCII);
106*b1cdbd2cSJim Jagielski
107*b1cdbd2cSJim Jagielski}
108*b1cdbd2cSJim Jagielski# after all files were read close the errorlog file
109*b1cdbd2cSJim Jagielskiclose(ERROR_LOG);
110*b1cdbd2cSJim Jagielski
111*b1cdbd2cSJim Jagielski
112*b1cdbd2cSJim Jagielski###########################  begin of subroutines  #####################################
113*b1cdbd2cSJim Jagielski#
114*b1cdbd2cSJim Jagielski#                       global used variable: $parse_file
115*b1cdbd2cSJim Jagielski#
116*b1cdbd2cSJim Jagielski########################################################################################
117*b1cdbd2cSJim Jagielski
118*b1cdbd2cSJim Jagielski
119*b1cdbd2cSJim Jagielski########################################################################################
120*b1cdbd2cSJim Jagielski#       sub: reading_file
121*b1cdbd2cSJim Jagielski#      gets: $_ (current file)
122*b1cdbd2cSJim Jagielski#   returns: -
123*b1cdbd2cSJim Jagielski########################################################################################
124*b1cdbd2cSJim Jagielskisub reading_file
125*b1cdbd2cSJim Jagielski{
126*b1cdbd2cSJim Jagielski   # variable for the name of the current module
127*b1cdbd2cSJim Jagielski   my $module_name = "";
128*b1cdbd2cSJim Jagielski
129*b1cdbd2cSJim Jagielski   # hashes for the infos beginning at the second line of the build.lst files
130*b1cdbd2cSJim Jagielski   my %dir_of_job_platform = ();
131*b1cdbd2cSJim Jagielski   my %dir_of_alias = ();
132*b1cdbd2cSJim Jagielski
133*b1cdbd2cSJim Jagielski   # control variable for the module dependency line of the file
134*b1cdbd2cSJim Jagielski   #   like line 1 of module 'sal' (dependencies means the colon(s)) (SRC680/src.m42)
135*b1cdbd2cSJim Jagielski   #   "sa      sal     :       xml2cmp NULL"
136*b1cdbd2cSJim Jagielski   my $module_dependency_line_exists = 0;
137*b1cdbd2cSJim Jagielski   my $module_dependency_line_was_read = 0;
138*b1cdbd2cSJim Jagielski
139*b1cdbd2cSJim Jagielski   # this line variables are for checking that all lines will be read
140*b1cdbd2cSJim Jagielski   # counts each line
141*b1cdbd2cSJim Jagielski   my $line_number = 0;
142*b1cdbd2cSJim Jagielski   # for the sum of the informative lines (='module dependency line' and 'nmake' lines of the file)
143*b1cdbd2cSJim Jagielski   my $info_line_sum = 0;
144*b1cdbd2cSJim Jagielski   # for the sum of the no-info lines, like:
145*b1cdbd2cSJim Jagielski   # job lines: 'usr1', 'get', ... and comment lines: '# ...' or empty lines
146*b1cdbd2cSJim Jagielski   my $no_info_line_sum = 0;
147*b1cdbd2cSJim Jagielski
148*b1cdbd2cSJim Jagielski   # read all lines of the file to resolve the first alias
149*b1cdbd2cSJim Jagielski   # with the matching dir to know all aliases and directories
150*b1cdbd2cSJim Jagielski   # at the later second file reading
151*b1cdbd2cSJim Jagielski   while (<PARSE_ASCII>)
152*b1cdbd2cSJim Jagielski   {
153*b1cdbd2cSJim Jagielski      # the variable for each line of a file
154*b1cdbd2cSJim Jagielski      my $line = $_;
155*b1cdbd2cSJim Jagielski
156*b1cdbd2cSJim Jagielski      # count each line for more exact error descriptions in the log file
157*b1cdbd2cSJim Jagielski      $line_number += 1;
158*b1cdbd2cSJim Jagielski
159*b1cdbd2cSJim Jagielski      # remember it, if this line exists
160*b1cdbd2cSJim Jagielski      if ( (is_module_dependency_line($line)) && ($module_dependency_line_exists == 0) )
161*b1cdbd2cSJim Jagielski      {
162*b1cdbd2cSJim Jagielski         $module_dependency_line_exists = 1;
163*b1cdbd2cSJim Jagielski
164*b1cdbd2cSJim Jagielski         # get the name of the current module
165*b1cdbd2cSJim Jagielski         $module_name = get_module_name($line);
166*b1cdbd2cSJim Jagielski      }
167*b1cdbd2cSJim Jagielski
168*b1cdbd2cSJim Jagielski      # skip all lines, that hasn't the job 'nmake'
169*b1cdbd2cSJim Jagielski      next if (!(is_nmake_line($line)));
170*b1cdbd2cSJim Jagielski
171*b1cdbd2cSJim Jagielski      # check that the infos (job directory, job platform and alias) exist
172*b1cdbd2cSJim Jagielski      if (my ($job_dir, $job_platform, $alias) = get_alias_resolving_infos($line))
173*b1cdbd2cSJim Jagielski      {
174*b1cdbd2cSJim Jagielski         # prove that it's a valid job_platform
175*b1cdbd2cSJim Jagielski         # and that each first alias and matching job platform exists only once
176*b1cdbd2cSJim Jagielski         check_alias_and_job_platform($job_dir, $job_platform, $alias, \%dir_of_job_platform,
177*b1cdbd2cSJim Jagielski                                      \%dir_of_alias, $module_name, $line_number);
178*b1cdbd2cSJim Jagielski      }
179*b1cdbd2cSJim Jagielski      else
180*b1cdbd2cSJim Jagielski      {
181*b1cdbd2cSJim Jagielski         chomp;
182*b1cdbd2cSJim Jagielski         add_errorlog_unknown_format_statement($line, $module_name, $line_number);
183*b1cdbd2cSJim Jagielski         next;
184*b1cdbd2cSJim Jagielski      }
185*b1cdbd2cSJim Jagielski   }
186*b1cdbd2cSJim Jagielski   # reset the $line_number, because we count it again
187*b1cdbd2cSJim Jagielski   $line_number = 0;
188*b1cdbd2cSJim Jagielski
189*b1cdbd2cSJim Jagielski   # read the same file again
190*b1cdbd2cSJim Jagielski   seek (PARSE_ASCII,0,0);
191*b1cdbd2cSJim Jagielski
192*b1cdbd2cSJim Jagielski   # read each line of the file for all other informations
193*b1cdbd2cSJim Jagielski   # e.g. line 8 of module 'sal'
194*b1cdbd2cSJim Jagielski   # "sa  sal\systools\win32\guistdio  nmake  -     n          sa_guistdio     sa_uwinapi.n          NULL"
195*b1cdbd2cSJim Jagielski   #             $job_dir              $job     $job_platform   1.$alias   2.$alias + alias platform
196*b1cdbd2cSJim Jagielski   while (<PARSE_ASCII>)
197*b1cdbd2cSJim Jagielski   {
198*b1cdbd2cSJim Jagielski      # the variable for each line of a file
199*b1cdbd2cSJim Jagielski      my $line = $_;
200*b1cdbd2cSJim Jagielski
201*b1cdbd2cSJim Jagielski      # count each line to check at the end of the file that all lines were read
202*b1cdbd2cSJim Jagielski      # and for more exact error descriptions in the log file
203*b1cdbd2cSJim Jagielski      $line_number += 1;
204*b1cdbd2cSJim Jagielski
205*b1cdbd2cSJim Jagielski      # is it a 'nmake' or a 'module dependency' line?
206*b1cdbd2cSJim Jagielski      # if not: print this line to STDOUT,
207*b1cdbd2cSJim Jagielski      #         count one to the no-info lines,
208*b1cdbd2cSJim Jagielski      #         try to get the information about the module name from this line
209*b1cdbd2cSJim Jagielski      #         and skip the line
210*b1cdbd2cSJim Jagielski      if ( (!(is_nmake_line($line))) && (!(is_module_dependency_line($line))) )
211*b1cdbd2cSJim Jagielski      {
212*b1cdbd2cSJim Jagielski         my $no_info_line = show_no_info_line($line, $line_number);
213*b1cdbd2cSJim Jagielski
214*b1cdbd2cSJim Jagielski         $no_info_line_sum += $no_info_line;
215*b1cdbd2cSJim Jagielski
216*b1cdbd2cSJim Jagielski         # if no module dependency line exists get the name of the current module from another line
217*b1cdbd2cSJim Jagielski         $module_name = get_module_name($line) if (!($module_name));
218*b1cdbd2cSJim Jagielski
219*b1cdbd2cSJim Jagielski         # skip the no-info line
220*b1cdbd2cSJim Jagielski         next;
221*b1cdbd2cSJim Jagielski      }
222*b1cdbd2cSJim Jagielski
223*b1cdbd2cSJim Jagielski      # only if the module dependency line exists and it wasn't read get the infos about it
224*b1cdbd2cSJim Jagielski      if ( ($module_dependency_line_exists) && (!($module_dependency_line_was_read)) )
225*b1cdbd2cSJim Jagielski      {
226*b1cdbd2cSJim Jagielski         ($module_dependency_line_was_read, $info_line_sum) = get_module_dependency_line_infos
227*b1cdbd2cSJim Jagielski                                                              ($line, $module_name, $line_number);
228*b1cdbd2cSJim Jagielski      }
229*b1cdbd2cSJim Jagielski
230*b1cdbd2cSJim Jagielski      # get all 'nmake' line infos
231*b1cdbd2cSJim Jagielski      my $info_line = get_nmake_line_infos($line, \%dir_of_alias, \%dir_of_job_platform,
232*b1cdbd2cSJim Jagielski                                           $module_name, $line_number);
233*b1cdbd2cSJim Jagielski
234*b1cdbd2cSJim Jagielski      # count the info lines;
235*b1cdbd2cSJim Jagielski      $info_line_sum += $info_line;
236*b1cdbd2cSJim Jagielski   }
237*b1cdbd2cSJim Jagielski
238*b1cdbd2cSJim Jagielski   if ($debug == 1)
239*b1cdbd2cSJim Jagielski   {
240*b1cdbd2cSJim Jagielski      # show the sums of the info and no-info lines
241*b1cdbd2cSJim Jagielski      lines_sums_output($module_name, $line_number, $info_line_sum, $no_info_line_sum);
242*b1cdbd2cSJim Jagielski   }
243*b1cdbd2cSJim Jagielski}
244*b1cdbd2cSJim Jagielski
245*b1cdbd2cSJim Jagielski########################################################################################
246*b1cdbd2cSJim Jagielski#       sub: is_module_dependency_line
247*b1cdbd2cSJim Jagielski#      gets: $line
248*b1cdbd2cSJim Jagielski#   returns: 1 (true) or 0 (false)
249*b1cdbd2cSJim Jagielski########################################################################################
250*b1cdbd2cSJim Jagielskisub is_module_dependency_line
251*b1cdbd2cSJim Jagielski{
252*b1cdbd2cSJim Jagielski   my $line = shift;
253*b1cdbd2cSJim Jagielski
254*b1cdbd2cSJim Jagielski   # if the module dpendency line exists return 1, otherwise 0
255*b1cdbd2cSJim Jagielski   ($line =~ /^\w+\s+\S+\s+:+\s+/)
256*b1cdbd2cSJim Jagielski   ? return 1
257*b1cdbd2cSJim Jagielski   : return 0;
258*b1cdbd2cSJim Jagielski}
259*b1cdbd2cSJim Jagielski
260*b1cdbd2cSJim Jagielski########################################################################################
261*b1cdbd2cSJim Jagielski#       sub: is_nmake_line
262*b1cdbd2cSJim Jagielski#      gets: $line
263*b1cdbd2cSJim Jagielski#   returns: '1' (true) or '0' (false)
264*b1cdbd2cSJim Jagielski########################################################################################
265*b1cdbd2cSJim Jagielskisub is_nmake_line
266*b1cdbd2cSJim Jagielski{
267*b1cdbd2cSJim Jagielski   my $line = shift;
268*b1cdbd2cSJim Jagielski
269*b1cdbd2cSJim Jagielski   # these lines are NO nmake lines:
270*b1cdbd2cSJim Jagielski   # 1. a empty line
271*b1cdbd2cSJim Jagielski   # 2. a comment line (perhaps with the job 'nmake')
272*b1cdbd2cSJim Jagielski   #    like line 20 of module 'bridges' (SRC680/src.m42)
273*b1cdbd2cSJim Jagielski   #    "#br  bridges\source\cli_uno  nmake  -  w,vc7  br_cli_uno br_unotypes NULL========= "
274*b1cdbd2cSJim Jagielski   # 3. the module dependency line
275*b1cdbd2cSJim Jagielski   #    like line 1 of module 'sal' (dependencies means the colon(s)) (SRC680/src.m42)
276*b1cdbd2cSJim Jagielski   #    "sa      sal     :       xml2cmp N                                    ULL"
277*b1cdbd2cSJim Jagielski   # 4. a 'p' job platform line (for OS2)
278*b1cdbd2cSJim Jagielski   # 5. a line with a job, which is not 'nmake'
279*b1cdbd2cSJim Jagielski   ($line =~ (/^[^\s+\#]/) && (!(/\s+:+\s+/)) && (!(/\s+p\s+/)) && (/\bnmake\b/) )
280*b1cdbd2cSJim Jagielski   ? return 1
281*b1cdbd2cSJim Jagielski   : return 0;
282*b1cdbd2cSJim Jagielski}
283*b1cdbd2cSJim Jagielski
284*b1cdbd2cSJim Jagielski########################################################################################
285*b1cdbd2cSJim Jagielski#       sub: get_alias_resolving_infos
286*b1cdbd2cSJim Jagielski#      gets: $line
287*b1cdbd2cSJim Jagielski#   returns: $job_dir, $job_platform, $alias
288*b1cdbd2cSJim Jagielski########################################################################################
289*b1cdbd2cSJim Jagielskisub get_alias_resolving_infos
290*b1cdbd2cSJim Jagielski{
291*b1cdbd2cSJim Jagielski   my $line = shift;
292*b1cdbd2cSJim Jagielski
293*b1cdbd2cSJim Jagielski   if ($line =~ /^\w+\s+(\S+)\s+\w+\s+\-\s+(\w+)\,?(\w+)?\s+(\S+)\s+/)
294*b1cdbd2cSJim Jagielski   {
295*b1cdbd2cSJim Jagielski      # get the current work directory
296*b1cdbd2cSJim Jagielski      my $temp_job_dir = $1;
297*b1cdbd2cSJim Jagielski
298*b1cdbd2cSJim Jagielski      my $job_dir = change_job_directory($temp_job_dir);
299*b1cdbd2cSJim Jagielski
300*b1cdbd2cSJim Jagielski      # get the job platform of the current job
301*b1cdbd2cSJim Jagielski      # if it is a 'n' job platform transform it to 'w'
302*b1cdbd2cSJim Jagielski      # because 'n' can be used now as 'w' (both means windows)
303*b1cdbd2cSJim Jagielski      my $job_platform = $2;
304*b1cdbd2cSJim Jagielski      $job_platform = "w" if($job_platform eq "n");
305*b1cdbd2cSJim Jagielski
306*b1cdbd2cSJim Jagielski      # get the first alias in each line
307*b1cdbd2cSJim Jagielski      my $alias = $4;
308*b1cdbd2cSJim Jagielski
309*b1cdbd2cSJim Jagielski      return ($job_dir, $job_platform, $alias);
310*b1cdbd2cSJim Jagielski   }
311*b1cdbd2cSJim Jagielski   return (undef, undef, undef);
312*b1cdbd2cSJim Jagielski}
313*b1cdbd2cSJim Jagielski
314*b1cdbd2cSJim Jagielski########################################################################################
315*b1cdbd2cSJim Jagielski#       sub: change_job_directory
316*b1cdbd2cSJim Jagielski#      gets: $job_dir
317*b1cdbd2cSJim Jagielski#   returns: $changed_job_dir
318*b1cdbd2cSJim Jagielski########################################################################################
319*b1cdbd2cSJim Jagielski# we don't need the module name and the first '\' in the current directory
320*b1cdbd2cSJim Jagielskisub change_job_directory
321*b1cdbd2cSJim Jagielski{
322*b1cdbd2cSJim Jagielski   my $changed_job_dir = shift;
323*b1cdbd2cSJim Jagielski
324*b1cdbd2cSJim Jagielski   # ignore the module name
325*b1cdbd2cSJim Jagielski   $changed_job_dir =~ s/^\w+//;
326*b1cdbd2cSJim Jagielski   # change all other '\' against the '/' of the current dir
327*b1cdbd2cSJim Jagielski   $changed_job_dir =~ s/\\/\//g;
328*b1cdbd2cSJim Jagielski
329*b1cdbd2cSJim Jagielski   # get only a "/" if we are in the root directory
330*b1cdbd2cSJim Jagielski   $changed_job_dir = "/" if ($changed_job_dir eq "");
331*b1cdbd2cSJim Jagielski
332*b1cdbd2cSJim Jagielski   return $changed_job_dir;
333*b1cdbd2cSJim Jagielski}
334*b1cdbd2cSJim Jagielski
335*b1cdbd2cSJim Jagielski########################################################################################
336*b1cdbd2cSJim Jagielski#       sub: check_alias_and_job_platform
337*b1cdbd2cSJim Jagielski#      gets: $job_dir, $job_platform, $alias, $dir_of_job_platform_ref,
338*b1cdbd2cSJim Jagielski#            $dir_of_alias_ref, $module_name, $line_number
339*b1cdbd2cSJim Jagielski#   returns: -
340*b1cdbd2cSJim Jagielski########################################################################################
341*b1cdbd2cSJim Jagielski# get it in the hash only if it is a valid job platform,
342*b1cdbd2cSJim Jagielski# like 'w', 'u', 'm' and 'n'
343*b1cdbd2cSJim Jagielski# 'all' is also valid but it doesn't exist in an alias platform(!)
344*b1cdbd2cSJim Jagielskisub check_alias_and_job_platform
345*b1cdbd2cSJim Jagielski{
346*b1cdbd2cSJim Jagielski   my ($job_dir, $job_platform, $alias, $dir_of_job_platform_ref,
347*b1cdbd2cSJim Jagielski       $dir_of_alias_ref, $module_name, $line_number) = @_;
348*b1cdbd2cSJim Jagielski
349*b1cdbd2cSJim Jagielski   # is it a valid job_platform?
350*b1cdbd2cSJim Jagielski   if ($job_platform =~ /(w|u|m|n|all)/)
351*b1cdbd2cSJim Jagielski   {
352*b1cdbd2cSJim Jagielski      # get only the 'w', 'u', 'm' and 'n' based job platforms
353*b1cdbd2cSJim Jagielski      if ($job_platform =~ /[wumn]/)
354*b1cdbd2cSJim Jagielski      {
355*b1cdbd2cSJim Jagielski         # doesn't the key already exist?
356*b1cdbd2cSJim Jagielski         (!(exists $$dir_of_job_platform_ref{$job_platform.$alias}))
357*b1cdbd2cSJim Jagielski           # get the first alias with the matching job platform in the hash
358*b1cdbd2cSJim Jagielski         ? get_alias_and_job_platform($job_platform, $alias, $dir_of_job_platform_ref)
359*b1cdbd2cSJim Jagielski           # this is a line with a redundant alias and job platform
360*b1cdbd2cSJim Jagielski         : add_errorlog_alias_redundancy_statement($module_name, $alias, $job_platform, $line_number);
361*b1cdbd2cSJim Jagielski      }
362*b1cdbd2cSJim Jagielski      if (!(exists $$dir_of_alias_ref{$alias}))
363*b1cdbd2cSJim Jagielski      {
364*b1cdbd2cSJim Jagielski         # get each first alias with the matching job platform
365*b1cdbd2cSJim Jagielski         get_alias_and_matching_directory($dir_of_alias_ref, $alias, $job_dir);
366*b1cdbd2cSJim Jagielski      }
367*b1cdbd2cSJim Jagielski   }
368*b1cdbd2cSJim Jagielski   # it's not a valid job platform
369*b1cdbd2cSJim Jagielski   else
370*b1cdbd2cSJim Jagielski   {
371*b1cdbd2cSJim Jagielski      add_errorlog_invalid_platform_statement($module_name, $job_platform, $line_number);
372*b1cdbd2cSJim Jagielski   }
373*b1cdbd2cSJim Jagielski}
374*b1cdbd2cSJim Jagielski
375*b1cdbd2cSJim Jagielski########################################################################################
376*b1cdbd2cSJim Jagielski#       sub: get_alias_and_job_platform
377*b1cdbd2cSJim Jagielski#      gets: $job_platform, $alias, $dir_of_job_platform_ref
378*b1cdbd2cSJim Jagielski#   returns: -
379*b1cdbd2cSJim Jagielski########################################################################################
380*b1cdbd2cSJim Jagielski# get the the job platform and the first alias as a unique key
381*b1cdbd2cSJim Jagielski# and the job platform as value of the hash
382*b1cdbd2cSJim Jagielski# it's for checking later that the alias platform is equal to the job platform
383*b1cdbd2cSJim Jagielski#   e.g.: line 6 + 7 of the module 'gtk' (SRC680/src.m42)
384*b1cdbd2cSJim Jagielski#   "gt  gtk\pkgconfig  nmake  -  u   gt_pkg   NULL"
385*b1cdbd2cSJim Jagielski#   "gt  gtk\glib       nmake  -  u   gt_glib gt_pkg.u NULL"
386*b1cdbd2cSJim Jagielski#   the alias 'gt_pkg' has the directory 'gtk\pkgconfig' (we need only 'pkgconfig')
387*b1cdbd2cSJim Jagielski#   and it has the job platform 'u' - compare it with the alias platform 'gt_pkg.u'
388*b1cdbd2cSJim Jagielskisub get_alias_and_job_platform
389*b1cdbd2cSJim Jagielski{
390*b1cdbd2cSJim Jagielski   my ($job_platform, $alias, $dir_of_job_platform_ref) = @_;
391*b1cdbd2cSJim Jagielski
392*b1cdbd2cSJim Jagielski   # key = 'job platform' and 'first alias'   =>   value = 'job platform'
393*b1cdbd2cSJim Jagielski   $$dir_of_job_platform_ref{$job_platform.$alias} = $job_platform;
394*b1cdbd2cSJim Jagielski}
395*b1cdbd2cSJim Jagielski
396*b1cdbd2cSJim Jagielski########################################################################################
397*b1cdbd2cSJim Jagielski#       sub: get_alias_and_matching_directory
398*b1cdbd2cSJim Jagielski#      gets: $dir_of_alias_ref, $alias, $job_dir
399*b1cdbd2cSJim Jagielski#   returns: -
400*b1cdbd2cSJim Jagielski########################################################################################
401*b1cdbd2cSJim Jagielski# fill the hash with the first alias and the matching directory
402*b1cdbd2cSJim Jagielski#   e.g. line 14 of module 'setup2' (SRC680/src.m42)
403*b1cdbd2cSJim Jagielski#   "se  setup2\win\source\unloader   nmake   -   w   se_wulo se_unotypes NULL"
404*b1cdbd2cSJim Jagielski#   key = 'se_wulo'     =>    value = 'win/source/unloader'
405*b1cdbd2cSJim Jagielskisub get_alias_and_matching_directory
406*b1cdbd2cSJim Jagielski{
407*b1cdbd2cSJim Jagielski   my ($dir_of_alias_ref, $alias, $job_dir) = @_;
408*b1cdbd2cSJim Jagielski
409*b1cdbd2cSJim Jagielski   #     key = 'first alias'  => value = 'job directory'
410*b1cdbd2cSJim Jagielski   $$dir_of_alias_ref{$alias} = $job_dir;
411*b1cdbd2cSJim Jagielski}
412*b1cdbd2cSJim Jagielski
413*b1cdbd2cSJim Jagielski########################################################################################
414*b1cdbd2cSJim Jagielski#       sub: show_no_info_line
415*b1cdbd2cSJim Jagielski#      gets: $line, $line_number
416*b1cdbd2cSJim Jagielski#   returns: $no_info_line
417*b1cdbd2cSJim Jagielski########################################################################################
418*b1cdbd2cSJim Jagielskisub show_no_info_line
419*b1cdbd2cSJim Jagielski{
420*b1cdbd2cSJim Jagielski   my ($line, $line_number) = @_;
421*b1cdbd2cSJim Jagielski   my $no_info_line += 1;
422*b1cdbd2cSJim Jagielski
423*b1cdbd2cSJim Jagielski   chomp($line);
424*b1cdbd2cSJim Jagielski
425*b1cdbd2cSJim Jagielski   print"Ignore line <$line_number>:\n\"$line\"\n\n" if ($debug);
426*b1cdbd2cSJim Jagielski
427*b1cdbd2cSJim Jagielski   return $no_info_line;
428*b1cdbd2cSJim Jagielski}
429*b1cdbd2cSJim Jagielski
430*b1cdbd2cSJim Jagielski########################################################################################
431*b1cdbd2cSJim Jagielski#       sub: get_module_name
432*b1cdbd2cSJim Jagielski#      gets: $line
433*b1cdbd2cSJim Jagielski#   returns: $module_name
434*b1cdbd2cSJim Jagielski########################################################################################
435*b1cdbd2cSJim Jagielskisub get_module_name
436*b1cdbd2cSJim Jagielski{
437*b1cdbd2cSJim Jagielski   my $line = shift;
438*b1cdbd2cSJim Jagielski   my $module_name = "";
439*b1cdbd2cSJim Jagielski
440*b1cdbd2cSJim Jagielski   if ($line =~ /^\w+\s+([\w\.\-]+)\\?/)
441*b1cdbd2cSJim Jagielski   {
442*b1cdbd2cSJim Jagielski      $module_name = $1;
443*b1cdbd2cSJim Jagielski   }
444*b1cdbd2cSJim Jagielski
445*b1cdbd2cSJim Jagielski   # set the 'module name' in the data structure tree
446*b1cdbd2cSJim Jagielski   $XMLTree->setModuleName($module_name);
447*b1cdbd2cSJim Jagielski
448*b1cdbd2cSJim Jagielski   return $module_name;
449*b1cdbd2cSJim Jagielski}
450*b1cdbd2cSJim Jagielski
451*b1cdbd2cSJim Jagielski########################################################################################
452*b1cdbd2cSJim Jagielski#       sub: get_module_dependency_line_infos
453*b1cdbd2cSJim Jagielski#      gets: $line, $module_name, $line_number
454*b1cdbd2cSJim Jagielski#   returns: $module_dependency_line_was_read, $info_line_sum
455*b1cdbd2cSJim Jagielski########################################################################################
456*b1cdbd2cSJim Jagielski# get the informations about the module dependency line
457*b1cdbd2cSJim Jagielski# like line 1 of module 'sal' (SRC680/src.m42)
458*b1cdbd2cSJim Jagielski#    "sa     sal              :                       xml2cmp             NULL"
459*b1cdbd2cSJim Jagielski#        $module_name   $module_dependency    @module_dependency_names
460*b1cdbd2cSJim Jagielskisub get_module_dependency_line_infos
461*b1cdbd2cSJim Jagielski{
462*b1cdbd2cSJim Jagielski   my ($line, $module_name, $line_number) = @_;
463*b1cdbd2cSJim Jagielski   my $module_dependency = "";
464*b1cdbd2cSJim Jagielski   my @module_dependency_names = ();
465*b1cdbd2cSJim Jagielski   my %dep_modules_and_products = ();
466*b1cdbd2cSJim Jagielski   my $product = "";
467*b1cdbd2cSJim Jagielski
468*b1cdbd2cSJim Jagielski   my $module_dependency_line_was_read = 1;
469*b1cdbd2cSJim Jagielski   my $info_line_sum = 1;
470*b1cdbd2cSJim Jagielski
471*b1cdbd2cSJim Jagielski   if ($debug)
472*b1cdbd2cSJim Jagielski   {
473*b1cdbd2cSJim Jagielski      print"\nline number               : <$line_number>\n";
474*b1cdbd2cSJim Jagielski      print"module-name               : <$module_name>\n";
475*b1cdbd2cSJim Jagielski   }
476*b1cdbd2cSJim Jagielski
477*b1cdbd2cSJim Jagielski   # get the dependencies
478*b1cdbd2cSJim Jagielski   if ($line =~ /\s+(:+)\s+/)
479*b1cdbd2cSJim Jagielski   {
480*b1cdbd2cSJim Jagielski      $module_dependency = $1;
481*b1cdbd2cSJim Jagielski      print"module-dependency         : <$module_dependency>\n" if ($debug);
482*b1cdbd2cSJim Jagielski
483*b1cdbd2cSJim Jagielski      # transform the dependency type to the corresponding tag name
484*b1cdbd2cSJim Jagielski      if ($module_dependency eq ":")
485*b1cdbd2cSJim Jagielski      {
486*b1cdbd2cSJim Jagielski         $module_dependency = "md-simple";
487*b1cdbd2cSJim Jagielski      }
488*b1cdbd2cSJim Jagielski      elsif ($module_dependency eq "::")
489*b1cdbd2cSJim Jagielski      {
490*b1cdbd2cSJim Jagielski         $module_dependency = "md-always";
491*b1cdbd2cSJim Jagielski      }
492*b1cdbd2cSJim Jagielski      elsif ($module_dependency eq ":::")
493*b1cdbd2cSJim Jagielski      {
494*b1cdbd2cSJim Jagielski         $module_dependency = "md-force";
495*b1cdbd2cSJim Jagielski      }
496*b1cdbd2cSJim Jagielski   }
497*b1cdbd2cSJim Jagielski
498*b1cdbd2cSJim Jagielski   # get a list of all depending module names
499*b1cdbd2cSJim Jagielski   if ($line =~ /:+\s+([\S\s]+)\s+NULL/)
500*b1cdbd2cSJim Jagielski   {
501*b1cdbd2cSJim Jagielski      @module_dependency_names = split(/\s+/, $1);
502*b1cdbd2cSJim Jagielski
503*b1cdbd2cSJim Jagielski      foreach my $module (@module_dependency_names)
504*b1cdbd2cSJim Jagielski      {
505*b1cdbd2cSJim Jagielski         # check whether that there is another product (as "all") of a module
506*b1cdbd2cSJim Jagielski         if ($module =~ /(\S+):+(\S+)/)
507*b1cdbd2cSJim Jagielski         {
508*b1cdbd2cSJim Jagielski            $dep_modules_and_products{$2} = $1;
509*b1cdbd2cSJim Jagielski         }
510*b1cdbd2cSJim Jagielski         else
511*b1cdbd2cSJim Jagielski         {
512*b1cdbd2cSJim Jagielski            $dep_modules_and_products{$module} = "all";
513*b1cdbd2cSJim Jagielski         }
514*b1cdbd2cSJim Jagielski      }
515*b1cdbd2cSJim Jagielski   }
516*b1cdbd2cSJim Jagielski
517*b1cdbd2cSJim Jagielski   # add the dependency module names, the module dependency type and the product to the data structure
518*b1cdbd2cSJim Jagielski   foreach my $module (sort keys %dep_modules_and_products)
519*b1cdbd2cSJim Jagielski   {
520*b1cdbd2cSJim Jagielski      print"module-dependency-name(s) : key <$module>  value <".$dep_modules_and_products{$module}.">\n" if ($debug);
521*b1cdbd2cSJim Jagielski
522*b1cdbd2cSJim Jagielski      $XMLTree->addModuleDependencies($module, $module_dependency, $dep_modules_and_products{$module});
523*b1cdbd2cSJim Jagielski   }
524*b1cdbd2cSJim Jagielski
525*b1cdbd2cSJim Jagielski   return ($module_dependency_line_was_read, $info_line_sum);
526*b1cdbd2cSJim Jagielski}
527*b1cdbd2cSJim Jagielski
528*b1cdbd2cSJim Jagielski########################################################################################
529*b1cdbd2cSJim Jagielski#       sub: get_nmake_line_infos
530*b1cdbd2cSJim Jagielski#      gets: $line, \%dir_of_alias, \%dir_of_job_platform, $module_name, $line_number
531*b1cdbd2cSJim Jagielski#   returns: $info_line
532*b1cdbd2cSJim Jagielski########################################################################################
533*b1cdbd2cSJim Jagielski# get all infos about the 'nmake' lines
534*b1cdbd2cSJim Jagielski# e.g. line 8 of module 'sal'
535*b1cdbd2cSJim Jagielski# "sa  sal\systools\win32\guistdio  nmake  -     n         sa_guistdio     sa_uwinapi.n          NULL"
536*b1cdbd2cSJim Jagielski#             $job_dir              $job     $job_platform  1.$alias   2.$alias + alias platform
537*b1cdbd2cSJim Jagielskisub get_nmake_line_infos
538*b1cdbd2cSJim Jagielski{
539*b1cdbd2cSJim Jagielski   my ($line, $dir_of_alias_ref, $dir_of_job_platform_ref, $module_name, $line_number) = @_;
540*b1cdbd2cSJim Jagielski   my $directories_ref = "";
541*b1cdbd2cSJim Jagielski   my $info_line = 0;
542*b1cdbd2cSJim Jagielski
543*b1cdbd2cSJim Jagielski   # get the infos about the 'nmake' lines
544*b1cdbd2cSJim Jagielski   if ($line =~ /^\w+\s+(\S+)\s+(\w+)\s+\-\s+(\w+)\,?(\S+)?/)
545*b1cdbd2cSJim Jagielski   {
546*b1cdbd2cSJim Jagielski      # get the current working directory
547*b1cdbd2cSJim Jagielski      my $temp_job_dir = $1;
548*b1cdbd2cSJim Jagielski      my $job_dir = change_job_directory($temp_job_dir);
549*b1cdbd2cSJim Jagielski
550*b1cdbd2cSJim Jagielski      # get the job
551*b1cdbd2cSJim Jagielski      my $job = $2;
552*b1cdbd2cSJim Jagielski      $job = "make" if ($job eq "nmake");
553*b1cdbd2cSJim Jagielski
554*b1cdbd2cSJim Jagielski      # get the job platform of the current job
555*b1cdbd2cSJim Jagielski      # if it is a 'n' job platform transform it to 'wnt'
556*b1cdbd2cSJim Jagielski      # available values are: 'wnt', 'unx', 'mac' or 'all'
557*b1cdbd2cSJim Jagielski      my $job_platform = $3;
558*b1cdbd2cSJim Jagielski      $job_platform = change_job_platform_name($job_platform);
559*b1cdbd2cSJim Jagielski
560*b1cdbd2cSJim Jagielski      # get the first alias in each line
561*b1cdbd2cSJim Jagielski      my $restriction = $4;
562*b1cdbd2cSJim Jagielski      my %build_req = ( "$restriction" => "$job_platform") if ($restriction && $job_platform);
563*b1cdbd2cSJim Jagielski
564*b1cdbd2cSJim Jagielski
565*b1cdbd2cSJim Jagielski      # get all aliases (but not the first) in an array
566*b1cdbd2cSJim Jagielski      my $aliases_ref = get_aliases($line);
567*b1cdbd2cSJim Jagielski
568*b1cdbd2cSJim Jagielski      # filter the list of aliases, which has a 'p' job platform
569*b1cdbd2cSJim Jagielski      # and transform a 'n' ending alias platform to a 'w' ending alias platform
570*b1cdbd2cSJim Jagielski      filter_aliases($aliases_ref);
571*b1cdbd2cSJim Jagielski
572*b1cdbd2cSJim Jagielski      # resolve all aliases (alias[.job platform] => matching directory)
573*b1cdbd2cSJim Jagielski      $directories_ref = resolve_aliases($aliases_ref, $dir_of_alias_ref,
574*b1cdbd2cSJim Jagielski                                         $dir_of_job_platform_ref, $module_name, $line_number);
575*b1cdbd2cSJim Jagielski
576*b1cdbd2cSJim Jagielski      # count the informative lines
577*b1cdbd2cSJim Jagielski      $info_line = 1;
578*b1cdbd2cSJim Jagielski
579*b1cdbd2cSJim Jagielski      $XMLTree->addJob($job_dir, $job, $job_platform, $directories_ref, \%build_req);
580*b1cdbd2cSJim Jagielski
581*b1cdbd2cSJim Jagielski      # show the infos, that we know about each line
582*b1cdbd2cSJim Jagielski      if ($debug == 1)
583*b1cdbd2cSJim Jagielski      {
584*b1cdbd2cSJim Jagielski         show_line_infos($line_number, $job_dir, $job, $job_platform, $restriction, $aliases_ref, $directories_ref);
585*b1cdbd2cSJim Jagielski      }
586*b1cdbd2cSJim Jagielski   }
587*b1cdbd2cSJim Jagielski   return $info_line;
588*b1cdbd2cSJim Jagielski}
589*b1cdbd2cSJim Jagielski
590*b1cdbd2cSJim Jagielski########################################################################################
591*b1cdbd2cSJim Jagielski#       sub: change_job_platform_name
592*b1cdbd2cSJim Jagielski#      gets: $job_platform
593*b1cdbd2cSJim Jagielski#   returns: $job_platform
594*b1cdbd2cSJim Jagielski########################################################################################
595*b1cdbd2cSJim Jagielskisub change_job_platform_name
596*b1cdbd2cSJim Jagielski{
597*b1cdbd2cSJim Jagielski   my $job_platform = shift;
598*b1cdbd2cSJim Jagielski
599*b1cdbd2cSJim Jagielski   $job_platform = "wnt" if($job_platform eq "n" || $job_platform eq "w");
600*b1cdbd2cSJim Jagielski   $job_platform = "unx" if($job_platform eq "u");
601*b1cdbd2cSJim Jagielski   $job_platform = "mac" if($job_platform eq "m");
602*b1cdbd2cSJim Jagielski
603*b1cdbd2cSJim Jagielski   return $job_platform;
604*b1cdbd2cSJim Jagielski}
605*b1cdbd2cSJim Jagielski
606*b1cdbd2cSJim Jagielski########################################################################################
607*b1cdbd2cSJim Jagielski#       sub: get_aliases
608*b1cdbd2cSJim Jagielski#      gets: $_ (current line)
609*b1cdbd2cSJim Jagielski#   returns: \@aliases
610*b1cdbd2cSJim Jagielski########################################################################################
611*b1cdbd2cSJim Jagielski# get all aliases of the line in an array
612*b1cdbd2cSJim Jagielskisub get_aliases
613*b1cdbd2cSJim Jagielski{
614*b1cdbd2cSJim Jagielski   my $line = shift;
615*b1cdbd2cSJim Jagielski   my @aliases = ();
616*b1cdbd2cSJim Jagielski
617*b1cdbd2cSJim Jagielski   # get all aliases in an array (but cut out the first alias)
618*b1cdbd2cSJim Jagielski   if ($line =~ /\-\s+[\w+\,]+\s+([\S\s]+)\s+NULL$/)
619*b1cdbd2cSJim Jagielski   {
620*b1cdbd2cSJim Jagielski      print"\nall job aliases           : <$1>\n" if ($debug);
621*b1cdbd2cSJim Jagielski
622*b1cdbd2cSJim Jagielski      @aliases = split /\s+/, $1;
623*b1cdbd2cSJim Jagielski
624*b1cdbd2cSJim Jagielski      # we don't need the first alias (it stands for the current job directory)
625*b1cdbd2cSJim Jagielski      shift @aliases;
626*b1cdbd2cSJim Jagielski   }
627*b1cdbd2cSJim Jagielski   return \@aliases;
628*b1cdbd2cSJim Jagielski}
629*b1cdbd2cSJim Jagielski
630*b1cdbd2cSJim Jagielski########################################################################################
631*b1cdbd2cSJim Jagielski#       sub: filter_aliases
632*b1cdbd2cSJim Jagielski#      gets: $aliases_ref
633*b1cdbd2cSJim Jagielski#   returns: -
634*b1cdbd2cSJim Jagielski########################################################################################
635*b1cdbd2cSJim Jagielski# filter all aliases, because we only need the 'w', 'u' and 'm' job platform based aliases
636*b1cdbd2cSJim Jagielskisub filter_aliases
637*b1cdbd2cSJim Jagielski{
638*b1cdbd2cSJim Jagielski   my $aliases_ref = shift;
639*b1cdbd2cSJim Jagielski
640*b1cdbd2cSJim Jagielski   # get the highest index of the array (number of elements of the array - 1)
641*b1cdbd2cSJim Jagielski   # also works: my $index = scalar(@$aliases_ref)-1;
642*b1cdbd2cSJim Jagielski   my $index = $#{@{$aliases_ref}};
643*b1cdbd2cSJim Jagielski
644*b1cdbd2cSJim Jagielski   for (; $index >= 0; $index--)
645*b1cdbd2cSJim Jagielski   {
646*b1cdbd2cSJim Jagielski      # filter the 'p' job platform based aliases from '@aliases'
647*b1cdbd2cSJim Jagielski      splice(@$aliases_ref, $index, 1) if ($$aliases_ref[$index] =~ /\.p$/);
648*b1cdbd2cSJim Jagielski
649*b1cdbd2cSJim Jagielski      # transform a '.n' ending alias platform to '.w' ending alias platform
650*b1cdbd2cSJim Jagielski      if ($$aliases_ref[$index] =~ /\.n$/)
651*b1cdbd2cSJim Jagielski      {
652*b1cdbd2cSJim Jagielski         $$aliases_ref[$index] =~ s/\.n$/\.w/;
653*b1cdbd2cSJim Jagielski         splice(@$aliases_ref, $index, 1, $$aliases_ref[$index]);
654*b1cdbd2cSJim Jagielski      }
655*b1cdbd2cSJim Jagielski   }
656*b1cdbd2cSJim Jagielski}
657*b1cdbd2cSJim Jagielski
658*b1cdbd2cSJim Jagielski########################################################################################
659*b1cdbd2cSJim Jagielski#       sub: resolve_aliases
660*b1cdbd2cSJim Jagielski#      gets: $aliases_ref, $dir_of_alias_ref, $dir_of_job_platform_ref,
661*b1cdbd2cSJim Jagielski#            $module_name, $line_number
662*b1cdbd2cSJim Jagielski#   returns: \@directories
663*b1cdbd2cSJim Jagielski########################################################################################
664*b1cdbd2cSJim Jagielski# here we get each alias with the matching job directory
665*b1cdbd2cSJim Jagielskisub resolve_aliases
666*b1cdbd2cSJim Jagielski{
667*b1cdbd2cSJim Jagielski   my ($aliases_ref, $dir_of_alias_ref, $dir_of_job_platform_ref, $module_name, $line_number) = @_;
668*b1cdbd2cSJim Jagielski
669*b1cdbd2cSJim Jagielski   my @directories = ();
670*b1cdbd2cSJim Jagielski   my ($alias_platform, $alias, $temp_alias) = "";
671*b1cdbd2cSJim Jagielski
672*b1cdbd2cSJim Jagielski   # resolving all directory aliases
673*b1cdbd2cSJim Jagielski   foreach $temp_alias (@$aliases_ref)
674*b1cdbd2cSJim Jagielski   {
675*b1cdbd2cSJim Jagielski      ($alias, $alias_platform) = compare_job_platform_with_alias_platform
676*b1cdbd2cSJim Jagielski                                  ($temp_alias, $dir_of_job_platform_ref, $module_name, $line_number);
677*b1cdbd2cSJim Jagielski
678*b1cdbd2cSJim Jagielski      # does the alias exist?
679*b1cdbd2cSJim Jagielski      if (exists $$dir_of_alias_ref{$alias})
680*b1cdbd2cSJim Jagielski      {
681*b1cdbd2cSJim Jagielski         # then get the matching directory in the array
682*b1cdbd2cSJim Jagielski         push (@directories, $$dir_of_alias_ref{$alias});
683*b1cdbd2cSJim Jagielski      }
684*b1cdbd2cSJim Jagielski      else
685*b1cdbd2cSJim Jagielski      {
686*b1cdbd2cSJim Jagielski         add_errorlog_no_directory_of_alias_statement($module_name, $alias, $line_number);
687*b1cdbd2cSJim Jagielski      }
688*b1cdbd2cSJim Jagielski   }
689*b1cdbd2cSJim Jagielski   return \@directories;
690*b1cdbd2cSJim Jagielski}
691*b1cdbd2cSJim Jagielski
692*b1cdbd2cSJim Jagielski########################################################################################
693*b1cdbd2cSJim Jagielski#       sub: compare_job_platform_with_alias_platform
694*b1cdbd2cSJim Jagielski#      gets: $alias, $dir_of_job_platform_ref, $module_name, $line_number
695*b1cdbd2cSJim Jagielski#   returns: $alias
696*b1cdbd2cSJim Jagielski########################################################################################
697*b1cdbd2cSJim Jagielskisub compare_job_platform_with_alias_platform
698*b1cdbd2cSJim Jagielski{
699*b1cdbd2cSJim Jagielski   my ($alias, $dir_of_job_platform_ref, $module_name, $line_number) = @_;
700*b1cdbd2cSJim Jagielski
701*b1cdbd2cSJim Jagielski   my $alias_platform = "";
702*b1cdbd2cSJim Jagielski
703*b1cdbd2cSJim Jagielski   # compare the alias platform (with a dot and an ending letter, like "al_alib.u")
704*b1cdbd2cSJim Jagielski   # with the job platform of the line in which this alias was resolved
705*b1cdbd2cSJim Jagielski   if ($alias =~ /\.([wum])$/)
706*b1cdbd2cSJim Jagielski   {
707*b1cdbd2cSJim Jagielski      $alias_platform = $1;
708*b1cdbd2cSJim Jagielski
709*b1cdbd2cSJim Jagielski      # don't memorize the ending dot and letter
710*b1cdbd2cSJim Jagielski      $alias =~ s/\.\w$//;
711*b1cdbd2cSJim Jagielski
712*b1cdbd2cSJim Jagielski      # if the value(= job platform) of the hash or the alias platform has no value
713*b1cdbd2cSJim Jagielski      # set it to "no valid value"
714*b1cdbd2cSJim Jagielski      if (!(exists $$dir_of_job_platform_ref{$alias_platform.$alias}))
715*b1cdbd2cSJim Jagielski      {
716*b1cdbd2cSJim Jagielski         $$dir_of_job_platform_ref{$alias_platform.$alias} = "no valid value";
717*b1cdbd2cSJim Jagielski      }
718*b1cdbd2cSJim Jagielski      $alias_platform = "no valid value" if (!($alias_platform));
719*b1cdbd2cSJim Jagielski
720*b1cdbd2cSJim Jagielski      # are the job platform and the alias platform equal?
721*b1cdbd2cSJim Jagielski      if ($$dir_of_job_platform_ref{$alias_platform.$alias} ne $alias_platform)
722*b1cdbd2cSJim Jagielski      {
723*b1cdbd2cSJim Jagielski         add_errorlog_not_equal_platforms_statement
724*b1cdbd2cSJim Jagielski         ($module_name, $alias, $alias_platform, $dir_of_job_platform_ref, $line_number);
725*b1cdbd2cSJim Jagielski      }
726*b1cdbd2cSJim Jagielski   }
727*b1cdbd2cSJim Jagielski   return ($alias, $alias_platform);
728*b1cdbd2cSJim Jagielski}
729*b1cdbd2cSJim Jagielski
730*b1cdbd2cSJim Jagielski########################################################################################
731*b1cdbd2cSJim Jagielski#       sub: show_line_infos
732*b1cdbd2cSJim Jagielski#      gets: $line_number, $job_dir, $job, $job_platform, $restriction,
733*b1cdbd2cSJim Jagielski#            $aliases_ref, $directories_ref
734*b1cdbd2cSJim Jagielski#   returns: -
735*b1cdbd2cSJim Jagielski########################################################################################
736*b1cdbd2cSJim Jagielski# print the infos about each line
737*b1cdbd2cSJim Jagielskisub show_line_infos
738*b1cdbd2cSJim Jagielski{
739*b1cdbd2cSJim Jagielski   my ($line_number, $job_dir, $job, $job_platform, $restriction, $aliases_ref, $directories_ref) = @_;
740*b1cdbd2cSJim Jagielski
741*b1cdbd2cSJim Jagielski   print"line number               : <$line_number>\n";
742*b1cdbd2cSJim Jagielski   print"job directory             : <$job_dir>\n";
743*b1cdbd2cSJim Jagielski   print"job                       : <$job>\n";
744*b1cdbd2cSJim Jagielski   print"job platform              : <$job_platform>\n" if ($job_platform =~ /(w|u|m|all)/);
745*b1cdbd2cSJim Jagielski   print"restriction               : <$restriction>\n" if ($restriction);
746*b1cdbd2cSJim Jagielski   print"alias dependencies        : <@$aliases_ref>\n";
747*b1cdbd2cSJim Jagielski   print"directory dependencies    : <@$directories_ref>\n\n";
748*b1cdbd2cSJim Jagielski}
749*b1cdbd2cSJim Jagielski
750*b1cdbd2cSJim Jagielski########################################################################################
751*b1cdbd2cSJim Jagielski#       sub: lines_sums_output
752*b1cdbd2cSJim Jagielski#      gets: $module_name, $line_number, $info_line_sum, $no_info_line_sum
753*b1cdbd2cSJim Jagielski#   returns: -
754*b1cdbd2cSJim Jagielski########################################################################################
755*b1cdbd2cSJim Jagielskisub lines_sums_output
756*b1cdbd2cSJim Jagielski{
757*b1cdbd2cSJim Jagielski   # this line variables are for checking that all lines will be read:
758*b1cdbd2cSJim Jagielski   my ($module_name, $line_number, $info_line_sum, $no_info_line_sum) = @_;
759*b1cdbd2cSJim Jagielski   my $lines_sum = 0;
760*b1cdbd2cSJim Jagielski
761*b1cdbd2cSJim Jagielski   add_errorlog_no_module_name_statement() if (!($module_name));
762*b1cdbd2cSJim Jagielski
763*b1cdbd2cSJim Jagielski   # were all lines read? and is the checksum okay?
764*b1cdbd2cSJim Jagielski   $lines_sum = $info_line_sum + $no_info_line_sum;
765*b1cdbd2cSJim Jagielski   if ($lines_sum == $line_number)
766*b1cdbd2cSJim Jagielski   {
767*b1cdbd2cSJim Jagielski      print"All $line_number line(s) of module <$module_name> were read and checked!\n\n";
768*b1cdbd2cSJim Jagielski   }
769*b1cdbd2cSJim Jagielski   else
770*b1cdbd2cSJim Jagielski   {
771*b1cdbd2cSJim Jagielski      add_errorlog_different_lines_sums_statement($module_name);
772*b1cdbd2cSJim Jagielski   }
773*b1cdbd2cSJim Jagielski
774*b1cdbd2cSJim Jagielski   print"module: <$module_name>\n".
775*b1cdbd2cSJim Jagielski        "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n".
776*b1cdbd2cSJim Jagielski        "   info line(s) sum    =  $info_line_sum\n".
777*b1cdbd2cSJim Jagielski        "no-info line(s) sum    =  $no_info_line_sum\n".
778*b1cdbd2cSJim Jagielski        "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n".
779*b1cdbd2cSJim Jagielski        "  total line(s) sum    =  $line_number\n\n\n";
780*b1cdbd2cSJim Jagielski}
781*b1cdbd2cSJim Jagielski
782*b1cdbd2cSJim Jagielski
783*b1cdbd2cSJim Jagielski############################ ERROR_LOG subroutines #####################################
784*b1cdbd2cSJim Jagielski
785*b1cdbd2cSJim Jagielski
786*b1cdbd2cSJim Jagielski########################################################################################
787*b1cdbd2cSJim Jagielski#       sub: add_errorlog_invalid_job_platform_statement
788*b1cdbd2cSJim Jagielski#      gets: $module_name, $platform, $line_number
789*b1cdbd2cSJim Jagielski#   returns: -
790*b1cdbd2cSJim Jagielski########################################################################################
791*b1cdbd2cSJim Jagielskisub add_errorlog_invalid_job_platform_statement
792*b1cdbd2cSJim Jagielski{
793*b1cdbd2cSJim Jagielski   my ($module_name, $job_platform, $line_number) = @_;
794*b1cdbd2cSJim Jagielski
795*b1cdbd2cSJim Jagielski   print ERROR_LOG "Error in module <$module_name> of dir/file <$parse_file> line <$line_number>.\n".
796*b1cdbd2cSJim Jagielski                   "The job platform <$job_platform> is not valid.\n\n";
797*b1cdbd2cSJim Jagielski}
798*b1cdbd2cSJim Jagielski
799*b1cdbd2cSJim Jagielski########################################################################################
800*b1cdbd2cSJim Jagielski#       sub: add_errorlog_not_equal_platforms_statement
801*b1cdbd2cSJim Jagielski#      gets: $module_name, $alias, $alias_platform, $dir_of_job_platform_ref, $line_number
802*b1cdbd2cSJim Jagielski#   returns: -
803*b1cdbd2cSJim Jagielski########################################################################################
804*b1cdbd2cSJim Jagielskisub add_errorlog_not_equal_platforms_statement
805*b1cdbd2cSJim Jagielski{
806*b1cdbd2cSJim Jagielski   my ($module_name, $alias, $alias_platform, $dir_of_job_platform_ref, $line_number) = @_;
807*b1cdbd2cSJim Jagielski
808*b1cdbd2cSJim Jagielski   print ERROR_LOG "Error in module <$module_name> of dir/file <$parse_file> line <$line_number>.\n".
809*b1cdbd2cSJim Jagielski                   "The alias platform <$alias.$alias_platform> is not equal ".
810*b1cdbd2cSJim Jagielski                   "with the job platform <$$dir_of_job_platform_ref{$alias_platform.$alias}>.\n\n";
811*b1cdbd2cSJim Jagielski}
812*b1cdbd2cSJim Jagielski
813*b1cdbd2cSJim Jagielski########################################################################################
814*b1cdbd2cSJim Jagielski#       sub: add_errorlog_no_directory_of_alias_statement
815*b1cdbd2cSJim Jagielski#      gets: $module_name, $alias, $line_number
816*b1cdbd2cSJim Jagielski#   returns: -
817*b1cdbd2cSJim Jagielski########################################################################################
818*b1cdbd2cSJim Jagielskisub add_errorlog_no_directory_of_alias_statement
819*b1cdbd2cSJim Jagielski{
820*b1cdbd2cSJim Jagielski   my ($module_name, $alias, $line_number) = @_;
821*b1cdbd2cSJim Jagielski
822*b1cdbd2cSJim Jagielski   print ERROR_LOG "Error in module <$module_name> of dir/file <$parse_file> line <$line_number>.\n".
823*b1cdbd2cSJim Jagielski                   "The directory of the alias <$alias> doesn't exist!\n\n";
824*b1cdbd2cSJim Jagielski}
825*b1cdbd2cSJim Jagielski
826*b1cdbd2cSJim Jagielski########################################################################################
827*b1cdbd2cSJim Jagielski#       sub: add_errorlog_no_module_name_statement
828*b1cdbd2cSJim Jagielski#      gets: -
829*b1cdbd2cSJim Jagielski#   returns: -
830*b1cdbd2cSJim Jagielski########################################################################################
831*b1cdbd2cSJim Jagielskisub add_errorlog_no_module_name_statement
832*b1cdbd2cSJim Jagielski{
833*b1cdbd2cSJim Jagielski   print ERROR_LOG "Error. No module name found in dir/file <$parse_file>.\n\n";
834*b1cdbd2cSJim Jagielski}
835*b1cdbd2cSJim Jagielski
836*b1cdbd2cSJim Jagielski########################################################################################
837*b1cdbd2cSJim Jagielski#       sub: add_errorlog_alias_redundancy_statement
838*b1cdbd2cSJim Jagielski#      gets: $module_name, $alias, $job_platform, $line_number
839*b1cdbd2cSJim Jagielski#   returns: -
840*b1cdbd2cSJim Jagielski########################################################################################
841*b1cdbd2cSJim Jagielskisub add_errorlog_alias_redundancy_statement
842*b1cdbd2cSJim Jagielski{
843*b1cdbd2cSJim Jagielski   my ($module_name, $alias, $job_platform, $line_number)= @_;
844*b1cdbd2cSJim Jagielski
845*b1cdbd2cSJim Jagielski   print ERROR_LOG "Error in module <$module_name> of dir/file <$parse_file> line <$line_number>.\n".
846*b1cdbd2cSJim Jagielski                   "The alias <$alias> with the job platform <$job_platform> is redundant.\n\n";
847*b1cdbd2cSJim Jagielski}
848*b1cdbd2cSJim Jagielski
849*b1cdbd2cSJim Jagielski########################################################################################
850*b1cdbd2cSJim Jagielski#       sub: add_errorlog_unknown_format_statement
851*b1cdbd2cSJim Jagielski#      gets: $module_name, $line_number
852*b1cdbd2cSJim Jagielski#   returns: -
853*b1cdbd2cSJim Jagielski########################################################################################
854*b1cdbd2cSJim Jagielskisub add_errorlog_unknown_format_statement
855*b1cdbd2cSJim Jagielski{
856*b1cdbd2cSJim Jagielski   my ($line, $module_name, $line_number) = @_;
857*b1cdbd2cSJim Jagielski
858*b1cdbd2cSJim Jagielski   print ERROR_LOG "Error in module <$module_name> of dir/file <$parse_file> line <$line_number>.".
859*b1cdbd2cSJim Jagielski                   "\nUnknown format:\n\"$line\"\n\n";
860*b1cdbd2cSJim Jagielski}
861*b1cdbd2cSJim Jagielski
862*b1cdbd2cSJim Jagielski########################################################################################
863*b1cdbd2cSJim Jagielski#       sub: add_errorlog_different_lines_sums_statement
864*b1cdbd2cSJim Jagielski#      gets: $module_name
865*b1cdbd2cSJim Jagielski#   returns: -
866*b1cdbd2cSJim Jagielski########################################################################################
867*b1cdbd2cSJim Jagielskisub add_errorlog_different_lines_sums_statement
868*b1cdbd2cSJim Jagielski{
869*b1cdbd2cSJim Jagielski   my $module_name = shift;
870*b1cdbd2cSJim Jagielski
871*b1cdbd2cSJim Jagielski   print ERROR_LOG "Error in module <$module_name> of dir/file <$parse_file>.\n".
872*b1cdbd2cSJim Jagielski                   "The sums of all info and no-info lines are not correct!\n\n";
873*b1cdbd2cSJim Jagielski}
874*b1cdbd2cSJim Jagielski
875*b1cdbd2cSJim Jagielski########################################################################################
876*b1cdbd2cSJim Jagielski#       sub: add_errorlog_no_buildlst_file_found_statement
877*b1cdbd2cSJim Jagielski#      gets: $parse_file
878*b1cdbd2cSJim Jagielski#   returns: -
879*b1cdbd2cSJim Jagielski########################################################################################
880*b1cdbd2cSJim Jagielskisub add_errorlog_no_buildlst_file_found_statement
881*b1cdbd2cSJim Jagielski{
882*b1cdbd2cSJim Jagielski   my $parse_file = shift;
883*b1cdbd2cSJim Jagielski
884*b1cdbd2cSJim Jagielski   print ERROR_LOG "Error in command line argument <$parse_file>.\n".
885*b1cdbd2cSJim Jagielski                   "File 'build.lst' not found!\n";
886*b1cdbd2cSJim Jagielski}
887*b1cdbd2cSJim Jagielski
888*b1cdbd2cSJim Jagielski############################# end of the subroutines ###################################
889