--routeTopology.mesa DIRECTORY RouteDefs; RouteTopology:PROGRAM IMPORTS RouteDefs EXPORTS RouteDefs=BEGIN OPEN RouteDefs; Error:SIGNAL=CODE; CreateTopology:PUBLIC CtlProc={MakeTopology; ShowTopology; RETURN[-1]}; MakeTopology:PROCEDURE=BEGIN topology_NIL; EnumerateRectangles[Topo1]; END; Topo1:PROCEDURE[r1:RectanglePtr]=BEGIN Topo2:PROCEDURE[r2:RectanglePtr]= {side:Side=Butt[r1,r2]; IF side#x THEN AddTopo[[r1,r2,side]]}; EnumerateRectangles[Topo2]; END; Butt:PROCEDURE[l,r:RectanglePtr] RETURNS[Side]=BEGIN lp:CoordL=l.pos; ls:CoordL=l.sizeL; rp:CoordL=r.pos; rs:CoordL=r.sizeL; RETURN[SELECT TRUE FROM lp.x+ls.x=rp.x AND lp.ye, lp.y+ls.y=rp.y AND lp.xn, ENDCASE=>x]; END; AddTopo:PROCEDURE[x:Topology]=BEGIN tl:TopologyListPtr_AllocateList[]; t:TopologyPtr_AllocateTopology[]; t^_x; tl^_[t,topology]; topology_tl; END; ShowTopology:PROCEDURE=BEGIN ShowLabel["TOPOLOGY"]; FOR tl:TopologyListPtr_topology, tl.t UNTIL tl=NIL DO t:TopologyPtr=tl.h; r:RectanglePtr=IF t.oneToTwo=e THEN t.two.w ELSE t.two.s; Return[]; ShowString[" "]; ShowLink[t.one]; ShowString[" is "]; ShowChar[SELECT t.oneToTwo FROM e=>'w, n=>'s, ENDCASE=>'x]; ShowString[" of "]; ShowLink[t.two]; IF r # t.one THEN ShowString[" fake "]; ENDLOOP; END; ShowLink:PROCEDURE[x:RectanglePtr]=BEGIN IF x=NIL THEN Error; ShowDecimal[x.channelNo,IF x.orient=inter THEN "inter " ELSE "channel "]; END; END.