-- ChipSortLists.mesa
-- A Chipmonk package that sorts Chipmonk object
-- lists in increasing order by smallest x, and within equal
-- smallest x in increasing order by smallest y.
-- last modified by E. McCreight, November 1, 1982 4:37 PM
-- written by E. McCreight, October 13, 1981 3:15 PM
DIRECTORY
ChipNetDefs,
ChipOrient,
ppdefs;
ChipSortLists: PROGRAM IMPORTS ChipOrient
EXPORTS ChipNetDefs =
BEGIN OPEN ppdefs, ChipOrient, ChipNetDefs;
SortListPtrSeq: PUBLIC PROCEDURE[lps: ListPtrSeqPtr,
less: PROCEDURE[lp1, lp2: listPtr] RETURNS[BOOLEAN]
] =
BEGIN
r, l: CellIndex;
IF lps.count=0 THEN RETURN; -- Nothing to sort.
r ← lps.count-1; -- max legal index
l ← (r+1)/2;
WHILE r>0 DO
i, j: CellIndex;
item: listPtr;
IF l>0 THEN {l ← l-1; item ← lps.lp[l]}
ELSE
BEGIN
item ← lps.lp[r];
lps.lp[r] ← lps.lp[0];
r ← r-1;
END;
FOR i ← l, j DO
j ← i+i+1; -- I'd like to say 2*i+1 but
-- I don't trust the optimizer
IF j>r THEN EXIT;
IF j<r THEN
BEGIN
IF less[lps.lp[j], lps.lp[j+1]] THEN j ← j+1;
END;
IF less[item, lps.lp[j]] THEN lps.lp[i] ← lps.lp[j]
ELSE EXIT;
ENDLOOP;
lps.lp[i] ← item;
ENDLOOP;
END; -- of SortListPtrSeq
orientToSortClass: PUBLIC ARRAY orientationIndex OF SortClass ←
[minX, maxX, -- [0..1]
minX, maxX, -- [2..3] (really illegal)
maxY, minY, -- [4..5]
maxY, minY, -- [6..7] (really illegal)
maxX, minX, -- [8..9]
maxX, minX, -- [10..11] (really illegal)
minY, maxY, -- [12..13]
minY, maxY -- [14..15] (really illegal)
];
SortOrder: PUBLIC ARRAY SortClass OF
PROCEDURE[lp1, lp2: listPtr] RETURNS[BOOLEAN] ←
[minX: ByMinX, maxX: ByMaxX,
minY: ByMinY, maxY: ByMaxY
];
ByMinX: PROCEDURE[lp1, lp2: listPtr] RETURNS[BOOLEAN] =
{RETURN[lp1.lx<lp2.lx]};
ByMinY: PROCEDURE[lp1, lp2: listPtr] RETURNS[BOOLEAN] =
{RETURN[lp1.ly<lp2.ly]};
ByMaxX: PROCEDURE[lp1, lp2: listPtr] RETURNS[BOOLEAN] =
{RETURN[lp2.lx+lp2.ob.size[Rot90[lp2.idx]]<
lp1.lx+lp1.ob.size[Rot90[lp1.idx]]]};
ByMaxY: PROCEDURE[lp1, lp2: listPtr] RETURNS[BOOLEAN] =
{RETURN[lp2.ly+lp2.ob.size[1-Rot90[lp2.idx]]<
lp1.ly+lp1.ob.size[1-Rot90[lp1.idx]]]};
END. -- of ChipSortLists