--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.