# $segs{$seg}{Feats}{$pt}{Posns} ) for Point only
# $segs{$seg}{Feats}{$pt}{BoOb} ) for Point only
# $segs{$seg}{Feats}{$pt}{Fixed} position, for Fixed only
+# $segs{$seg}{Ends}[$combpos][$end] = [ $node,$side ]
+# $nodes{$node}[$side]{Seg}
our ($mode,$invertible);
$mode= 'barf';
sub line_endwiring () {
my (@ns,$seg,$subspec,$dist);
- m,^\s*segment\s+(\w+\.\d+)\s+(\w+\.\d+)\s+(\w+)((?:/\w+\*\d+)?)\s+([0-9.]+)$, or die "$_ ?";
+ m,^\s*segment\s+(\w+\.\d+)\s+(\w+\.\d+)\s+(\w+)(?:/((?:[A-Za-z]+\d+)+)\*\d+)?\s+([0-9.]+)$, or die "$_ ?";
($ns[0],$ns[1],$seg,$subspec,$dist)=($1,$2,$3,$4,$5);
if (!exists $segs{$seg}) {
print STDERR "ditching unwired $seg$subspec\n";
return;
}
+ $segr= $segs{$seg};
+ @subsegil= $subspec =~ m/([A-Za-z]+)(\d+)/g;
+ while (@subsegil) {
+ ($feat,$pos,@subsegil) = @subsegil;
+ die "$feat ?" unless exists $segr->{Feats}{$feat};
+ $featr= $segr->{Feats}{$feat};
+ if (exists $featr->{Fixed}) {
+ die "$pos $featr->{Fixed} ?" unless $pos == $featr->{Fixed};
+ } else {
+ die "$pos $featr->{Posns} ?" unless $pos < $featr->{Posns};
+ $featposwant{$feat}= $pos;
+ }
+ }
+ $combpos= 0;
+ for $feat (keys %{ $segr->{Feats} }) {
+ $featr= $segr->{Feats}{$feat};
+ next if exists $featr->{Fixed}
+ die "$feat ?" if !exists $featposwant{$feat};
+ $combpos += $featposwant{$feat} * $featr->{Weight};
+ }
for ($end=0; $end<2; $end++) {
$ns[$end] =~ m/^([a-z]\w+)\.([01])$;
($node,$side)=($1,$2);
- if (exists $nodes{$node}
+ $nsr= $nodes{$node}[$side];
+ if (!exists $nsr->{Seg}) {
+ $nsr->{Seg}= $seg;
+ } elsif ($seg ne $nsr->{Seg}) {
+ die "$seg $nsr->{Seg} ?";
+ }
+ die "$seg $combpos ?" if @{ $segr->{Ends}[$combpos] };
+ $segr->{Ends}[$combpos][$end]= [ $node, $side ];
}
}
sub writeout () {
my ($seg,$segv,$pt,$ptv, $delim);
o("/* autogenerated - do not edit */\n\n");
+ @segs;
for $seg (keys %segs) {
+ $segs{$seg}{Num}= @segs;
+ push @segs, $seg;
+ }
+ for ($segn=0; $segn<@segs; $segn++) {
$segv= $segs{$seg};
next unless $segv->{FeatCount};
o("static const MovFeatInfo mfi_${seg}[]= {");
}
o("\n};\n");
}
+ o("static const SegmentInfo info_segments[".scalar(@segs)."]= {");
+ $delim= '';
+ foreach $seg (@segs) {
+ $segr= $segs{$seg};
+ o("$delim\n");
+ o(" { \"$seg\", $segr->{Inv},\n".
+ " $segr->{FeatCount}, ".
+ ($segr->{FeatCount} ? "mfi_${seg}" : 0).",".
+ " $segr->{Posns}, POSCOMBS, ".so_oboob($segr->{BoOb})." }");
+ $delim= ',';
+ }
+ o("\n};\n");
}
mainread();