$prs2region{$prs} = $rn;
}
-my $sre = qr{(\")(.*)\1$}; # 2 captures, $2 is the name
+my $sre = qr{(:?(\")|(?=\w))(.*)\1$}; # 2 captures, $2 is the name
-open F, "<", $facesf or die $!;
-while (<P>) { last if m/^\&faces$/; }
+sub prs2r ($) { $prs2region{$_[0]} // die "@_ ?" }
+sub prs2rr ($) { $region{prs2r($_[0])} }
+sub read_faces () {
+ # Sets
+ # $region{NAME}{Adj}[]{Ends}[] = $vertexname
-open P, "<", $plagf or die $!;
-while (<P>) {
- if (m/^$sre#/) {
- my $invertex= $2;
- } elsif (m/^ \@(.*),(.*)$/) {
- die unless $invertex;
- $v2pos{$invertex} = [ $1,$2 ];
- } elsif (m/^ \^lface $sre$/) {
- die unless $invertex;
+ open F, "<", $facesf or die $!;
+ while (<P>) { last if m/^\&faces$/; }
+ my $rr;
+ my @edges;
+ my $process_rr = sub {
+ my $last_ai;
+ for my $ei (0..@edges) {
+ my $ej = $ei % @edges;
+ if (!defined $last_ai) {
+ my $ai;
+ for my $ai (0..@{ $rr->{Adj} }) {
+ next unless $rr->{Adj}[$ai]{Name} eq $edges[$ei]{Adjoins};
+ $last_ai = $ai+1;
+ }
+ confess unless defined $last_ai;
+ }
+ my $ai = ($last_ai-1+@edges) % @edges;
+ my $adj = $rr->{Adj}[$ai];
+ confess unless $adj->{Name} eq $edges[$ei]{Adjoins};
+
+ for $endi (0..1) {
+ $adj->{Ends}[$endi] = $edges[ ($ei + $endi) % @edges ][1];
+ }
+ }
+ };
+ while (<P>) {
+ if (m/^$sre$/) {
+ $process_rr->() if $rr;
+ my $rr= prs2rr($2);
+ } elsif (m/^\s+$sre$/) {
+ push @edges, { VxName => $2 };
+ } elsif (m/^\s+$sre$/) {
+ confess unless $rr;
+ push @edges, { VxName => $2 };
+ } elsif (m/^\s+\^adjoins\s+$sre$/) {
+ $edges[-1]{Adjoins} = prs2r($2);
+ }
+ }
+ $process_rr->();
+}
+
+sub read_optplag () {
+ open P, "<", $plagf or die $!;
+ while (<P>) {
+ if (m/^$sre#/) {
+ my $invertex= $2;
+ } elsif (m/^ \@(.*),(.*)$/) {
+ confess unless $invertex;
+ $v2pos{$invertex} = [ $1,$2 ];
+ } elsif (m/^ \^lface $sre$/) {
+ confess unless $invertex;
# Local variables: