1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
##
## slice_pass2.pl -- Pass 2
## Copyright (c) 1997-2002 Ralf S. Engelschall.
## Copyright (c) 1999-2002 Denis Barbier.
##
package main;
##
##
## Pass 2: Calculation of slice sets
##
##
sub pass2 {
my ($CFG) = @_;
my ($n, $asc, $slice, $set, $setA);
verbose("\nPass 2: Calculation of slice sets\n\n");
# convert ASCII set representation string into internal set object
sub asc2set {
my ($asc, $set, $onlylevel, $notcleared) = @_;
my ($i, $I, $internal, $from, $to, $level);
$set->Empty() if (($notcleared eq '') or (not $notcleared));
return $set if ($asc =~ m|^\d+:0:-1$|); # string represents the empty set
# split out the interval substrings
@I = ($asc);
@I = split(',', $asc) if (index($asc, ',') > 0);
# iterate over each interval and
# set the corresponding elements in the set
foreach $interval (@I) {
($level, $from, $to) = ($interval =~ m|^(\d+):(\d+):(\d+)$|);
next if (($onlylevel ne '') and ($level != $onlylevel));
next if ($from > $to);
$set->Interval_Fill($from, $to);
}
}
$n = length($CFG->{INPUT}->{PLAIN})+1;
$set = new Bit::Vector($n); # working set
$setA = new Bit::Vector($n); # "all" set
# restore slice names
foreach $slice (keys(%{$CFG->{SLICE}->{SET}->{ASC}})) {
$asc = $CFG->{SLICE}->{SET}->{ASC}->{$slice};
delete $CFG->{SLICE}->{SET}->{ASC}->{$slice};
$slice =~ s|:\d+$||g;
$CFG->{SLICE}->{SET}->{ASC}->{$slice} .=
($CFG->{SLICE}->{SET}->{ASC}->{"$slice"} ? ',' : '') . $asc;
}
# convert ASCII representation to real internal set objects
foreach $slice (keys(%{$CFG->{SLICE}->{SET}->{ASC}})) {
$asc = $CFG->{SLICE}->{SET}->{ASC}->{$slice};
$set->Empty();
asc2set($asc, $set);
$CFG->{SLICE}->{SET}->{OBJ}->{$slice} = $set->Clone();
}
# define the various (un)defined slice areas
$set->Fill();
$CFG->{SLICE}->{SET}->{OBJ}->{'UNDEF0'} = $set->Clone();
$set->Empty();
$CFG->{SLICE}->{SET}->{OBJ}->{'DEF0'} = $set->Clone();
$setA->Empty();
for ($i = 1; $i <= $CFG->{SLICE}->{MAXLEVEL}; $i++) {
$set->Empty();
foreach $slice (keys(%{$CFG->{SLICE}->{SET}->{ASC}})) {
$asc = $CFG->{SLICE}->{SET}->{ASC}->{$slice};
asc2set($asc, $set, $i, 1); # load $set with entries of level $i
$setA->Union($setA, $set); # add to $setA these entries
}
$CFG->{SLICE}->{SET}->{OBJ}->{"DEF$i"} = $set->Clone();
$set->Complement($set);
$CFG->{SLICE}->{SET}->{OBJ}->{"UNDEF$i"} = $set->Clone();
}
$CFG->{SLICE}->{SET}->{OBJ}->{'DEF'} = $setA->Clone();
$setA->Complement($setA);
$CFG->{SLICE}->{SET}->{OBJ}->{'UNDEF'} = $setA->Clone();
$CFG->{SLICE}->{SET}->{OBJ}->{'ALL'} = $CFG->{SLICE}->{SET}->{OBJ}->{'UNDEF0'};
# define the various slice areas which are not overwritten
foreach $slice (keys(%{$CFG->{SLICE}->{SET}->{ASC}})) {
$asc = $CFG->{SLICE}->{SET}->{ASC}->{$slice};
$set->Empty();
asc2set($asc, $set);
$L = $CFG->{SLICE}->{MINLEVELS}->{$slice};
for ($i = $L+1; $i <= $CFG->{SLICE}->{MAXLEVEL}; $i++) {
$set->Difference($set, $CFG->{SLICE}->{SET}->{OBJ}->{"DEF$i"});
}
$CFG->{SLICE}->{SET}->{OBJ}->{"NOV_$slice"} = $set->Clone();
}
if ($CFG->{OPT}->{X}) {
foreach $slice (sort(keys(%{$CFG->{SLICE}->{SET}->{OBJ}}))) {
$set = $CFG->{SLICE}->{SET}->{OBJ}->{$slice};
if ($set->Norm > 0) {
verbose(" slice `$slice': " . $set->to_ASCII() . "\n");
}
else {
verbose(" slice `$slice': -Empty-\n");
}
}
}
}
1;
##EOF##
|