1 |
+ |
#____________________________________________________________________ |
2 |
+ |
# File: RuntimeFile.pm |
3 |
+ |
#____________________________________________________________________ |
4 |
+ |
# |
5 |
+ |
# Author: Shaun Ashby <Shaun.Ashby@cern.ch> |
6 |
+ |
# Update: 2004-05-19 15:40:10+0200 |
7 |
+ |
# Revision: $Id$ |
8 |
+ |
# |
9 |
+ |
# Copyright: 2004 (C) Shaun Ashby |
10 |
+ |
# |
11 |
+ |
#-------------------------------------------------------------------- |
12 |
+ |
package RuntimeFile; |
13 |
+ |
require 5.004; |
14 |
+ |
use ActiveDoc::SimpleDoc; |
15 |
+ |
use Exporter; |
16 |
+ |
@ISA=qw(Exporter); |
17 |
+ |
@EXPORT_OK=qw( ); |
18 |
+ |
|
19 |
+ |
sub new() |
20 |
+ |
############################################################### |
21 |
+ |
# new() # |
22 |
+ |
############################################################### |
23 |
+ |
# modified : Wed May 19 15:40:33 2004 / SFA # |
24 |
+ |
# params : # |
25 |
+ |
# : # |
26 |
+ |
# function : # |
27 |
+ |
# : # |
28 |
+ |
############################################################### |
29 |
+ |
{ |
30 |
+ |
my $proto=shift; |
31 |
+ |
my $class=ref($proto) || $proto; |
32 |
+ |
my $self={}; |
33 |
+ |
|
34 |
+ |
$self->{runtimefile} = shift; |
35 |
+ |
$self->{content} = {}; |
36 |
+ |
$self->{varstore} = {}; |
37 |
+ |
$self->{thisrtinfo} = []; |
38 |
+ |
|
39 |
+ |
bless $self,$class; |
40 |
+ |
return $self; |
41 |
+ |
} |
42 |
+ |
|
43 |
+ |
sub read() |
44 |
+ |
{ |
45 |
+ |
my $self=shift; |
46 |
+ |
use Cwd; |
47 |
+ |
|
48 |
+ |
# Check to see that the rt file exists: |
49 |
+ |
if ( ! -f cwd()."/".$self->{runtimefile} ) |
50 |
+ |
{ |
51 |
+ |
$::scram->scramfatal("Runtime file \"".$self->{runtimefile}."\" does not exist or is not readable!."); |
52 |
+ |
} |
53 |
+ |
else |
54 |
+ |
{ |
55 |
+ |
print "Reading RT environment from file ",$self->{runtimefile},"\n", if ($ENV{SCRAM_DEBUG}); |
56 |
+ |
} |
57 |
+ |
|
58 |
+ |
# A new SimpleDoc object to parse the file: |
59 |
+ |
$self->{simpledoc} = ActiveDoc::SimpleDoc->new(); |
60 |
+ |
|
61 |
+ |
$self->{simpledoc}->newparse("RUNTIME"); |
62 |
+ |
$self->{simpledoc}->filetoparse($self->{runtimefile}); |
63 |
+ |
$self->{simpledoc}->addtag("RUNTIME","Runtime", |
64 |
+ |
\&runtimetagOpen, $self, |
65 |
+ |
\&runtimetagInfo, $self, |
66 |
+ |
\&runtimetagClose, $self); |
67 |
+ |
|
68 |
+ |
# Parse the file: |
69 |
+ |
$self->{simpledoc}->parse("RUNTIME"); |
70 |
+ |
delete $self->{simpledoc}; |
71 |
+ |
} |
72 |
+ |
|
73 |
+ |
sub content() |
74 |
+ |
{ |
75 |
+ |
my $self = shift; |
76 |
+ |
return $self->{content}; |
77 |
+ |
} |
78 |
+ |
|
79 |
+ |
sub info() |
80 |
+ |
{ |
81 |
+ |
my $self=shift; |
82 |
+ |
my ($rtname) = @_; |
83 |
+ |
|
84 |
+ |
if (exists ($self->{content}->{$rtname})) |
85 |
+ |
{ |
86 |
+ |
if (exists ($self->{content}->{$rtname}->{'info'})) |
87 |
+ |
{ |
88 |
+ |
print $rtname,":\n"; |
89 |
+ |
foreach my $iline (@{$self->{content}->{$rtname}->{'info'}}) |
90 |
+ |
{ |
91 |
+ |
print $iline,"\n"; |
92 |
+ |
} |
93 |
+ |
} |
94 |
+ |
else |
95 |
+ |
{ |
96 |
+ |
print "No description for runtime variable \"",$rtname,"\" in file ".$self->{runtimefile}."!\n"; |
97 |
+ |
} |
98 |
+ |
} |
99 |
+ |
else |
100 |
+ |
{ |
101 |
+ |
$::scram->scramerror("Runtime variable ".$rtname." is not defined in ".$self->{runtimefile}."!"); |
102 |
+ |
exit(1); |
103 |
+ |
} |
104 |
+ |
} |
105 |
+ |
|
106 |
+ |
sub runtimetagOpen() |
107 |
+ |
{ |
108 |
+ |
my ($self, $name, $hashref) = @_; |
109 |
+ |
$self->{simpledoc}->checktag($name, $hashref, "name"); |
110 |
+ |
$self->{thisrtname} = $hashref->{'name'}; |
111 |
+ |
|
112 |
+ |
# Check for values (as value or default): |
113 |
+ |
foreach my $t (qw(value)) # Only support "value" |
114 |
+ |
{ |
115 |
+ |
if (exists ($hashref->{$t})) |
116 |
+ |
{ |
117 |
+ |
# Try to expand the value: |
118 |
+ |
my $thisvalue = $self->_expandvars($self->{varstore},$hashref->{$t}); |
119 |
+ |
# There were no dollar signs so we can assume |
120 |
+ |
# that everything was evaluated properly: |
121 |
+ |
if ($thisvalue !~ /\$/) |
122 |
+ |
{ |
123 |
+ |
$self->{varstore}->{$hashref->{'name'}} = $thisvalue; |
124 |
+ |
$self->{content}->{$hashref->{'name'}} = { value => $thisvalue }; |
125 |
+ |
} |
126 |
+ |
} |
127 |
+ |
} |
128 |
+ |
} |
129 |
+ |
|
130 |
+ |
sub runtimetagInfo() |
131 |
+ |
{ |
132 |
+ |
my ($self, $name, @infotext) = @_; |
133 |
+ |
push(@{$self->{thisrtinfo}},@infotext); |
134 |
+ |
} |
135 |
+ |
|
136 |
+ |
sub runtimetagClose() |
137 |
+ |
{ |
138 |
+ |
my ($self, $name, $hashref) = @_; |
139 |
+ |
$self->{content}->{$self->{thisrtname}}->{'info'} = $self->{thisrtinfo}; |
140 |
+ |
delete $self->{thisrtname}; |
141 |
+ |
$self->{thisrtinfo} = []; |
142 |
+ |
} |
143 |
+ |
|
144 |
+ |
sub _expandvars |
145 |
+ |
{ |
146 |
+ |
my $self=shift; |
147 |
+ |
# $dataenvref is the store of tags already parsed (e.g., X_BASE, LIBDIR etc.): |
148 |
+ |
my ($dataenvref,$string) = @_; |
149 |
+ |
|
150 |
+ |
return "" , if ( ! defined $string ); |
151 |
+ |
# To evaluate variables in brackets, like $(X): |
152 |
+ |
$string =~ s{\$\((\w+)\)} |
153 |
+ |
{ |
154 |
+ |
if (defined $dataenvref->{$1}) |
155 |
+ |
{ |
156 |
+ |
$self->_expandvars($dataenvref, $dataenvref->{$1}); |
157 |
+ |
} |
158 |
+ |
elsif (defined $ENV{$1}) |
159 |
+ |
{ |
160 |
+ |
$self->_expandvars($dataenvref, $ENV{$1}); |
161 |
+ |
} |
162 |
+ |
else |
163 |
+ |
{ |
164 |
+ |
"\$$1"; |
165 |
+ |
} |
166 |
+ |
}egx; |
167 |
+ |
|
168 |
+ |
# To evaluate variables like $X: |
169 |
+ |
$string =~ s{\$(\w+)} |
170 |
+ |
{ |
171 |
+ |
if (defined $dataenvref->{$1}) |
172 |
+ |
{ |
173 |
+ |
$self->_expandvars($dataenvref, $dataenvref->{$1}); |
174 |
+ |
} |
175 |
+ |
elsif (defined $ENV{$1}) |
176 |
+ |
{ |
177 |
+ |
$self->_expandvars($dataenvref, $ENV{$1}); |
178 |
+ |
} |
179 |
+ |
else |
180 |
+ |
{ |
181 |
+ |
"\$$1"; |
182 |
+ |
} |
183 |
+ |
}egx; |
184 |
+ |
|
185 |
+ |
# Now return false if the string wasn't properly evaluated (i.e. some $ remain), otherwise |
186 |
+ |
# return the expanded string: |
187 |
+ |
($string =~ /\$/) ? return undef : return $string; |
188 |
+ |
|
189 |
+ |
} |
190 |
+ |
|
191 |
+ |
1; |