chiark / gitweb /
bugfixes to graph extraction and numbering
authorian <ian>
Sun, 20 Mar 2005 10:31:09 +0000 (10:31 +0000)
committerian <ian>
Sun, 20 Mar 2005 10:31:09 +0000 (10:31 +0000)
layout/extractgraph
layout/graph-data.h
layout/layout
layout/redactgraph.c

index 26d64773326b8032539f0226d82f0f1ae0584942..dd047cce1cb426ddbfcaf4e241a93d1fcc6e22c2 100755 (executable)
@@ -63,6 +63,7 @@ our @nodes;
 # $nodes[]{X}
 # $nodes[]{Y}
 # $nodes[]{A}
+# $nodes[]{NodeNum}
 # $nodes[]{LayerMin}
 # $nodes[]{LayerMax}
 # $nodes[]{"Edges$back"}[] = [ \$edges[], $far ]
@@ -133,7 +134,7 @@ sub find_node (@) {
            return ($node,$back);
        }
     }
-    $node= { X => $x, Y => $y, A => $a,
+    $node= { X => $x, Y => $y, A => $a, NodeNum => scalar(@nodes),
             LayerMin => $l, LayerMax => $l, LineInfo => $lni };
     $back= $isdest;
     push @nodes, $node;
@@ -176,9 +177,9 @@ sub o ($@) {
 
 sub pr ($$) {
     my ($kind,$ref) = @_;
-    $ref= "$ref";
-    $ref =~ y/()/__/;
-    return lc $ref.lc $kind;
+    my ($n);
+    $n= $ref->{"${kind}Num"};
+    return sprintf "%s%d", lc($kind), $n;
 }
 
 sub pr_edgeend ($) {
@@ -221,7 +222,7 @@ sub writeout () {
     my ($node, $edge, $i, $side, $sideedges);
     my ($end, $endnum, $sss, $reverse, $nodeside, $connectnum, $j, $edgeend);
     my ($segname, $segment, $movfeats, $movfeat, $delim);
-    my ($movfeatpos, $movpos);
+    my ($movfeatpos, $movpos, $maxedgenum);
     o("\n");
     o("#include \"graph-data.h\"\n");
     for $node (@nodes) { o("static Node ",pr(Node,$node),";\n"); }
@@ -272,13 +273,17 @@ sub writeout () {
        o("\n  }\n};\n");
     }
     o("\n");
+    $maxedgenum=-1;
     for ($i=0; $i<@edges; $i++) {
        $edge= $edges[$i];
        o("static Edge ",pr(Edge,$edge),"= { $edge->{EdgeNum},\n");
+       if ($edge->{EdgeNum} > $maxedgenum) {
+           $maxedgenum= $edge->{EdgeNum};
+       }
        o("  $edge->{Dist}, ");
        $sss= $edge->{SubSegSpec};
+       o("/* $sss */ ");
        $reverse= !!($sss =~ s/^\-//);
-       if ($reverse) { o("/*reverse*/ "); }
        $sss =~ m,^(\w*)/(([A-Za-z]*)(\d*))$, or die;
        ($segname, $movfeatpos, $movfeat, $movpos) = ($1,$2,$3,$4);
        o("&movfeats_${segname}","[",
@@ -307,7 +312,7 @@ sub writeout () {
                   '&'.pr_edgeend($sideedges->[$connectnum-1]) : '0'),
              ", ".($connectnum < $#$sideedges ?
                    '&'.pr_edgeend($sideedges->[$connectnum+1]) : '0'));
-           o(",\n      &".pr(Edge,$edge),", $end, ",
+           o(",\n      &".pr(Edge,$edge),", $endnum, ",
              "&".pr(Node,$node).".sides[$side]");
            o(" }");
            $delim= ',';
@@ -319,6 +324,8 @@ sub writeout () {
       (@nodes ? '&'.pr(Node,$nodes[0]) : 0), ", ",
       (@nodes ? '&'.pr(Node,$nodes[$#nodes]) : 0),
       " };\n");
+    o("int next_nodenum= ".scalar(@nodes).";\n".
+      "int next_edgenum= ".($maxedgenum+1).";\n");
 }
 
 o("/*autogenerated - do not edit*/\n\n");
index b9fbfe94ad11c5a255acded1be6d59ca021f879c..eaafde65a05e14a3fea7d6332f3e7306de632458 100644 (file)
@@ -57,6 +57,7 @@ struct NodeList {
 };
 
 extern NodeList all_nodes;
+extern int next_nodenum, next_edgenum;
 
 
 #endif /*GRAPH_DATA_H*/
index 2c5321580c68e71003a1dcaab8e777e1f108fb70..7269eb260290f2a14bdc55625ad69ae31a91b84b 100755 (executable)
@@ -1038,7 +1038,10 @@ sub cmd_join {
 
 sub line ($$$) {
     my ($from,$to,$len) = @_;
-    parametric_segment(0.0, 1.0, abs($len) + 1e-6, undef, sub {
+    if ($len < 0) {
+       ($from,$to,$len) = ($to,$from,-$len);
+    }
+    parametric_segment(0.0, 1.0, $len + 1e-6, undef, sub {
        ev_lincomb({}, $from, $to, $param);
     });
 }
index b330172e47f7c0c4f0eec3c95831b863d5aa97fe..6f50fbb100d60f0c4d653ddf11f37693e0abf730 100644 (file)
@@ -68,11 +68,11 @@ OF(trace,1)
 /*---------- general graph-manipulation and printing stuff ----------*/
 
 static void trace_node(Node *node) {
-  trace("n%p",node);
+  trace("node%d",node->nodenum);
 }
 
 static void trace_edgeend(EdgeEnd *edge) {
-  trace("n%p%c",edge->node->node,"OI"[edge->node->side]);
+  trace("edge%d %c",edge->edge->edgenum,"OI"[edge->end]);
 }
 
 static EdgeEnd *edgeend_otherend(EdgeEnd *thisend) {
@@ -241,14 +241,14 @@ static void check(const char *why) {
   
   trace("consistency check (%s) ...\n",why);
   for (node=all_nodes.head; node; node=node->next) {
-    trace(" consistency node %p\n", node);
+    trace(" consistency node%d\n", node->nodenum);
     LIST_CHECKNODE(all_nodes,node);
     for (side=0; side<2; side++) {
-      trace(" consistency node %p%c\n", node, "OI"[side]);
+      trace(" consistency node%d %c\n", node->nodenum, "OI"[side]);
       assert(node->sides[side].node == node);
       assert(node->sides[side].side == side);
       for (edgeend=node->sides[side].head; edgeend; edgeend=edgeend->next) {
-       trace(" consistency node %p%c ", node, "OI"[side]);
+       trace(" consistency node%d %c ", node->nodenum, "OI"[side]);
        trace_edgeend(edgeend);
        trace("\n");
        
@@ -265,7 +265,7 @@ static void check(const char *why) {
             search_edone < edone + used_edone && search_edone->edge != edge;
             search_edone++);
        if (search_edone >= edone + used_edone) {
-         search_edone->edge= 0;
+         search_edone->edge= edge;
          search_edone->endsdone= 0;
          used_edone++;
        }
@@ -276,8 +276,11 @@ static void check(const char *why) {
   }
   for (search_edone= edone;
        search_edone < edone + used_edone;
-       search_edone++)
+       search_edone++) {
+    trace("consistency edge%d count=%d\n",
+         search_edone->edge, search_edone->endsdone);
     assert(search_edone->endsdone == 2);
+  }
   trace("consistency check (%s) ok\n",why);
 }