ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/SCRAM/src/BuildSystem/Tool.pm
(Generate patch)

Comparing COMP/SCRAM/src/BuildSystem/Tool.pm (file contents):
Revision 1.1 by williamc, Fri Apr 7 08:12:48 2000 UTC vs.
Revision 1.1.2.5 by williamc, Thu Apr 20 11:32:26 2000 UTC

# Line 0 | Line 1
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 + # listtype(type) : return a list of all features of the specified type
19 + # addfeature(name,@value) : add value(s) to the named feature
20 + # setfeature(name,@value) : set value(s) for the named feature
21 + # getfeature(name) : return a list of elements belonging to the named feature
22 + #                       (with embedded dependencies)
23 + # type(name[,type]) : get/set the type associated with a feature
24 + # addrequirement() : add a requirement at the current parse position
25 + # dependencies()   : return a list of dependency objects
26 + # store(location)   : Save object to given file
27 + # restore(location) : Restore object from specified file
28 + # reset()           : Clean out all the features
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 listtype {
62 +        my $self=shift;
63 +        my $type=shift;
64 +
65 +        my @list=();
66 +        foreach $v ( $self->features() ) {
67 +          if ( $self->type($v) eq $type ) {
68 +                push @list, $v;
69 +          }
70 +        }
71 +        return @list;
72 + }
73 +
74 + sub type {
75 +        my $self=shift;
76 +        my $name=shift;
77 +
78 +        if ( @_ ) {
79 +          $self->{featuretypes}{$name}=shift;
80 +        }
81 +        return ((defined $self->{featuretypes}{$name})?
82 +                $self->{featuretypes}{$name}:"");
83 + }
84 +
85 + sub addfeature {
86 +        my $self=shift;
87 +        my $name=shift;
88 +        my @value=@_;
89 +
90 +        $self->_newfeature($name,@value);
91 +        push @{$self->{features}{$name}}, @value;
92 + }
93 +
94 + sub setfeature {
95 +        my $self=shift;
96 +        my $name=shift;
97 +        my @value=@_;
98 +
99 +        $self->_newfeature($name,@value);
100 +        @{$self->{features}{$name}}=@value;
101 + }
102 +
103 + sub reset {
104 +        my $self=shift;
105 +        undef $self->{features};
106 +        undef $self->{'features_ordered'};
107 +        undef $self->{reqobjs};
108 +        undef $self->{requireposition};
109 + }
110 +
111 + sub _newfeature {
112 +        my $self=shift;
113 +        my $name=shift;
114 +        my @value=@_;
115 +
116 +        # if it dosnt exist , make sure we first mark all the current reqs
117 +        # get inserted beforehand
118 +        if ( ! exists $self->{features}{$name} ) {
119 +         # add feature name to our ordered list
120 +         push @{$self->{'features_ordered'}},$name;
121 +         for ( $i=0; $i<=$#{$self->{reqobjs}}; $i++ ) {
122 +           $self->_recordpos( $name, $i);
123 +         }
124 +        }
125 + }
126 +
127 + sub features {
128 +        my $self=shift;
129 +
130 + #       return (keys %{$self->{features}});
131 +        return @{$self->{'features_ordered'}};
132 + }
133 +
134 + sub getfeature {
135 +        my $self=shift;
136 +        my $name=shift;
137 +
138 +        my @rv=();
139 +        my @rep;
140 +        # make sure we insert requirements at the right place
141 +        for ( my $i=-1; $i<=$#{$self->{features}{$name}}; $i++ ) {
142 +         if ( $i>=0 ) {
143 +           push @rv, $self->{features}{$name}[$i];
144 +         }
145 +         my @rep=$self->_testpos($name, $i);
146 +         my $repobj;
147 +         foreach $repobj ( @rep ) {
148 +             push @rv, $repobj->getfeature($name);
149 +         }
150 +        }
151 +        return @rv;
152 + }
153 +
154 + sub clearfeature {
155 +        my $self=shift;
156 +        my $name=shift;
157 +
158 +        undef @{$self->{features}{$name}};
159 + }
160 +
161 + sub addrequirement {
162 +        my $self=shift;
163 +        my $reqobj=shift;
164 +
165 +        push @{$self->{reqobjs}}, $reqobj;
166 +        foreach $key ( keys %{$self->{features}} ) {
167 +           $self->_recordpos($key,$#{$self->{reqobjs}});
168 +        }
169 + }
170 +
171 + sub dependencies {
172 +        my $self=shift;
173 +        return @{$self->{recobjs}}
174 + }
175 +
176 + sub store {
177 +        my $self=shift;
178 +        my $location=shift;
179 +
180 +        my $fh=FileHandle->new();
181 +        $fh->open(">".$location) or die "Unable to open $location for output".
182 +                                $!."\n";
183 +        print $fh "name:".$self->name().":_sys\n";
184 +        print $fh "version:".$self->version().":_sys\n";
185 +        print $fh "url:".$self->url().":_sys\n";
186 +        foreach $f ( $self->features()) {
187 +          foreach $val ( $self->getfeature($f) ) {
188 +           print $fh $f.":".$val.":".$self->type($f)."\n";
189 +          }
190 +        }
191 +        undef $fh;
192 + }
193 +
194 + sub restore {
195 +        my $self=shift;
196 +        my $location=shift;
197 +
198 +        my $fh=FileHandle->new();
199 +        $fh->open("<".$location) or die "Unable to open $location for output".
200 +                                $!."\n";
201 +        my ($tool,$type,$variable,$value);
202 +        while ( <$fh> ) {
203 +          chomp;
204 +          next if /^#/;
205 +          next if /^\s*$/;
206 +          ($variable, $value, $type)=split /:/;
207 +          next if ( $variable=~/\&/ );
208 +          $product=~tr[A-Z][a-z];
209 +          if ( $type eq "_sys" ) {
210 +             if ( $self->can($variable)) {
211 +               $self->$variable($value);
212 +             }
213 +          }
214 +          else {
215 +            $self->addfeature($variable,$value);
216 +          }
217 +        }
218 +        undef $fh;
219 + }
220 +
221 + sub _recordpos {
222 +        my $self=shift;
223 +        my $name=shift;
224 +        my $recref=shift;
225 +
226 +        push @{$self->{requireposition}{$name}{$#{$self->{features}{$name}}}}
227 +                ,$recref;
228 + }
229 +
230 + # return array of objects that correspond to the required position
231 + sub _testpos {
232 +        my $self=shift;
233 +        my $name=shift;
234 +        my $ref=shift;
235 +
236 +        my @rv=();
237 +        if ( exists $self->{requireposition}{$name}{$ref} ) {
238 +           foreach $recref ( @{$self->{requireposition}{$name}{$ref}} ) {
239 +             push @rv, $self->{reqobjs}[$recref];
240 +           }
241 +        }
242 +        return @rv;
243 + }
244 +
245 +

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines