ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/Tool.pm
Revision: 1.1.2.2
Committed: Mon Apr 10 16:41:04 2000 UTC (25 years, 1 month ago) by williamc
Content type: text/plain
Branch: V0_9branch
Changes since 1.1.2.1: +62 -0 lines
Log Message:
added store and reestore routines

File Contents

# Content
1 #
2 # Tool.pm - Store basic tool properties
3 #
4 # Originally Written by Christopher Williams
5 #
6 # Description
7 # -----------
8 # Stores basic tool features
9 #
10 # Interface
11 # ---------
12 # new() : A new FeatureTool object
13 # name() : get/set the tools name
14 # version() : get set the tool version
15 # url() : get set the tool url
16 # features() : return a list of features defined (ordered in relation to
17 # their first definition)
18 # addfeature(name,@value) : add value(s) to the named feature
19 # setfeature(name,@value) : set value(s) for the named feature
20 # getfeature(name) : return a list of elements belonging to the named feature
21 # (with embedded dependencies)
22 # type(name[,type]) : get/set the type associated with a feature
23 # addrequirement() : add a requirement at the current parse position
24 # dependencies() : return a list of dependency objects
25 # nonembeddeddependencies() : return a list of dependency objects that
26 # are not embedded into the parameters
27 # save(location) : Save object to given file
28 # restore(location) : Restore object from specified file
29
30 package BuildSystem::Tool;
31 require 5.004;
32
33 sub new {
34 my $class=shift;
35 my $self={};
36 bless $self, $class;
37 return $self;
38 }
39
40 sub name {
41 my $self=shift;
42
43 @_?$self->{name}=shift
44 :$self->{name};
45 }
46
47 sub version {
48 my $self=shift;
49
50 @_?$self->{version}=shift
51 :$self->{version};
52 }
53
54 sub url {
55 my $self=shift;
56
57 @_?$self->{url}=shift
58 :$self->{url};
59 }
60
61 sub type {
62 my $self=shift;
63 my $name=shift;
64
65 if ( @_ ) {
66 $self->{featuretypes}{$name}=shift;
67 }
68 return ((defined $self->{featuretypes}{$name})?
69 $self->{featuretypes}{$name}:"");
70 }
71
72 sub addfeature {
73 my $self=shift;
74 my $name=shift;
75 my @value=@_;
76
77 $self->_newfeature($name,@value);
78 push @{$self->{features}{$name}}, @value;
79 }
80
81 sub setfeature {
82 my $self=shift;
83 my $name=shift;
84 my @value=@_;
85
86 $self->_newfeature($name,@value);
87 @{$self->{features}{$name}}=@value;
88 }
89
90
91 sub _newfeature {
92 my $self=shift;
93 my $name=shift;
94 my @value=@_;
95
96 # if it dosnt exist , make sure we first mark all the current reqs
97 # get inserted beforehand
98 if ( ! exists $self->{features}{$name} ) {
99 # add feature name to our ordered list
100 push @{$self->{'features_ordered'}},$name;
101 for ( $i=0; $i<=$#{$self->{reqobjs}}; $i++ ) {
102 $self->_recordpos( $name, $i);
103 }
104 }
105 }
106
107 sub features {
108 my $self=shift;
109
110 # return (keys %{$self->{features}});
111 return @{$self->{'features_ordered'}};
112 }
113
114 sub getfeature {
115 my $self=shift;
116 my $name=shift;
117
118 my @rv=();
119 my @rep;
120 # make sure we insert requirements at the right place
121 for ( my $i=-1; $i<=$#{$self->{features}{$name}}; $i++ ) {
122 if ( $i>=0 ) {
123 push @rv, $self->{features}{$name}[$i];
124 }
125 my @rep=$self->_testpos($name, $i);
126 my $repobj;
127 foreach $repobj ( @rep ) {
128 push @rv, $repobj->getfeature($name);
129 }
130 }
131 return @rv;
132 }
133
134 sub clearfeature {
135 my $self=shift;
136 my $name=shift;
137
138 undef @{$self->{features}{$name}};
139 }
140
141 sub addrequirement {
142 my $self=shift;
143 my $reqobj=shift;
144
145 push @{$self->{reqobjs}}, $reqobj;
146 foreach $key ( keys %{$self->{features}} ) {
147 $self->_recordpos($key,$#{$self->{reqobjs}});
148 }
149 }
150
151 sub dependencies {
152 my $self=shift;
153 return @{$self->{recobjs}}
154 }
155
156 sub save {
157 my $self=shift;
158 my $location=shift;
159
160 my $fh=FileHandle->new();
161 $fh->open(">".$location) or die "Unable to open $location for output".
162 $!."\n";
163 print $fh "_sys:name:".$self->name()."\n";
164 print $fh "_sys:version:".$self->version()."\n";
165 foreach $f ( $self->features()) {
166 foreach $val ( $self->getfeature($f) ) {
167 print $fh $self->type($f).":".$f.":".$val."\n";
168 }
169 }
170 undef $fh;
171 }
172
173 sub restore {
174 my $self=shift;
175 my $location=shift;
176
177 my $fh=FileHandle->new();
178 $fh->open("<".$location) or die "Unable to open $location for output".
179 $!."\n";
180 my ($tool,$type,$variable,$value);
181 while ( <$fh> ) {
182 chomp;
183 next if /^#/;
184 next if /^\s*$/;
185 ($type, $variable, $value)=split /:/;
186 next if ( $variable=~/\&/ );
187 $product=~tr[A-Z][a-z];
188 if ( $type eq "_sys" ) {
189 if ( can($variable)) {
190 $self->$variable($value);
191 }
192 }
193 else {
194 $self->addfeature($variable,$value);
195 }
196 }
197 undef $fh;
198 }
199
200 sub _recordpos {
201 my $self=shift;
202 my $name=shift;
203 my $recref=shift;
204
205 push @{$self->{requireposition}{$name}{$#{$self->{features}{$name}}}}
206 ,$recref;
207 }
208
209 # return array of objects that correspond to the required position
210 sub _testpos {
211 my $self=shift;
212 my $name=shift;
213 my $ref=shift;
214
215 my @rv=();
216 if ( exists $self->{requireposition}{$name}{$ref} ) {
217 foreach $recref ( @{$self->{requireposition}{$name}{$ref}} ) {
218 push @rv, $self->{reqobjs}[$recref];
219 }
220 }
221 return @rv;
222 }
223
224