chiark / gitweb /
wip
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 28 Feb 2019 13:28:02 +0000 (13:28 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 28 Feb 2019 13:28:02 +0000 (13:28 +0000)
generate-board

index 8ce82b6d6af8eba954448f9fb41414212d9e8e40..bd0276a18a93508e56aba66b29f331759002e399 100755 (executable)
@@ -2,25 +2,32 @@
 
 use strict;
 use Carp;
+use Data::Dumper;
+use Math::GSL::Vector;
+use Math::GSL::Matrix;
 
 BEGIN { unshift @INC, qw(.); }
 
 use Parse;
 
+our $facesf;
 our %vxname2pos; # $vxname2pos{VXNAME} = Math::GSL::Vector
 
-# ----- region name reverse mapping -----
+# ----- region names from plag, incl. reverse mapping -----
 
 our %prs2region;
-foreach my $rn (keys %region) {
-  my $prs = plag_prs($rn);
-  die if $prs2region{$prs};
-  $prs2region{$prs} = $rn;
+
+sub prep_region_rmap () {
+  foreach my $rn (keys %region) {
+    my $prs = plag_prs($rn);
+    die if $prs2region{$prs};
+    $prs2region{$prs} = $rn;
+  }
 }
 
-my $sre = qr{(:?(\")|(?=\w))(.*)\1$}; # 2 captures, $2 is the name
+our $sre = qr{(?:(\")|(?=\w))(.*)\1$}; # 2 captures, $2 is the name
 
-sub prs2r ($) { $prs2region{$_[0]} // die "@_ ?" }
+sub prs2r ($) { $prs2region{$_[0]} // confess "@_ ?" }
 sub prs2rr ($) { $region{prs2r($_[0])} }
 
 #----- file reader for plag output -----
@@ -33,45 +40,50 @@ sub read_faces () {
   # also incidentally
   #  $region{NAME}{Adj}[]{Ends}[]{Adjoins} which should be ignored
 
-  open F, "<", $facesf or die $!;
+  open P, "<", $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) {
+    for my $ei (0..$#edges) {
       my $ej = $ei % @edges;
       if (!defined $last_ai) {
        my $ai;
-       for my $ai (0..@{ $rr->{Adj} }) {
+       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;
+      $last_ai = $ai;
       my $adj = $rr->{Adj}[$ai];
-      confess unless $adj->{Name} eq $edges[$ei]{Adjoins};
+      confess Dumper($rr, \@edges, $ei, $ej, $adj, $last_ai, $ai)." ?"
+         unless $adj->{Name} eq $edges[$ei]{Adjoins};
       
-      for $endi (0..1) {
+      for my $endi (0..1) {
        $adj->{Ends}[$endi] = $edges[ ($ei + $endi) % @edges ];
       }
     }
   };
-  while (<P>) {
+  my $vxname;
+  for (;;) {
+    $!=0; $_=<P> // confess $!;
+    last if m/^\&$/;
     if (m/^$sre$/) {
       $process_rr->() if $rr;
-      my $rr= prs2rr($2);
+      $rr= prs2rr($2);
     } elsif (m/^\s+$sre$/) {
       confess unless $rr;
-      my $vxname = $2;
+      $vxname = $2;
       push @edges, { VxName => $vxname };
     } elsif (m/^\s+\^adjoins\s+$sre$/) {
       $edges[-1]{Adjoins} = prs2r($2);
-    } elsif (m/^\s+\^\@(\w+)\.(\w+)$/) {
+    } elsif (m/^\s+\^\@([-e.0-9]+)\,([-e.0-9]+)$/) {
       my $pos = Math::GSL::Vector->new([$1,$2]);
       confess unless defined $vxname;
-      $edges[-1]{Pos} = $pos;
+      #$edges[-1]{Pos} = $pos;
       $vxname2pos{$vxname} = $pos;
     }
   }
@@ -80,11 +92,12 @@ sub read_faces () {
 
 #----- main program -----
 
-our ($facesf, @ARGV) = @ARGV or die;
+($facesf, @ARGV) = @ARGV or die;
 parse_input_graph();
+prep_region_rmap();
 read_faces();
 
-print Dumper(\%regions);
+print Dumper(\%region);
 
 # Local variables:
 # cperl-indent-level: 2