--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.y<rp.y+rs.y AND rp.y<lp.y+ls.y=>e,
lp.y+ls.y=rp.y AND lp.x<rp.x+rs.x AND rp.x<lp.x+ls.x=>n,
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.