-- File CIFDrcNewList.mesa -- Written by Dan Fitzpatrick and Martin Newell, September 1980 -- Last updated: March 24, 1981 2:55 PM -- CIF Drc List Routines DIRECTORY CIFDrcNewListDefs: FROM "CIFDrcNewListDefs", CIFDrcUtilsDefs: FROM "CIFDrcUtilsDefs" USING [FreeTrap,Trapezoid], IntervalsDefs: FROM "IntervalsDefs" USING [InitIntervals,Insert,FreeIntervals, GetFirst,GetNext,GetHandleRecord,Node]; CIFDrcNewList: PROGRAM IMPORTS CIFDrcUtilsDefs, IntervalsDefs EXPORTS CIFDrcNewListDefs = BEGIN OPEN CIFDrcNewListDefs, IntervalsDefs, CIFDrcUtilsDefs; InitList: PUBLIC PROCEDURE[left,right: LONG INTEGER] = BEGIN xmin _ left; xmax _ right; FOR layer:CARDINAL IN [MinLayer..MaxLayer] DO FOR swath:SwathType IN [bottom..top] DO Swath[layer][swath] _ InitIntervals[xmin,xmax]; ENDLOOP; ENDLOOP; END; InsertTrap:PUBLIC PROCEDURE [trap:Trapezoid,layer:CARDINAL,swath:SwathType] = BEGIN Insert[Swath[layer][swath],trap.minx,trap.maxx,trap]; END; EmptyList:PUBLIC PROCEDURE [layer:CARDINAL] = BEGIN -- no-op ? END; StepSwaths:PUBLIC PROCEDURE [] = BEGIN FOR layer:CARDINAL IN [MinLayer..MaxLayer] DO FreeIntervals[Swath[layer][bottom],FreeTrap]; Swath[layer][bottom] _ Swath[layer][middle]; Swath[layer][middle] _ Swath[layer][top]; Swath[layer][top] _ InitIntervals[xmin,xmax]; ENDLOOP; END; GenSwath: PUBLIC PROCEDURE [layer:CARDINAL, swath:SwathType,list:POINTER TO ListDescriptor] RETURNS[trap:Trapezoid] = BEGIN list.swath _ swath; RETURN[GetFirst[Swath[layer][swath],xmin,xmax,@list.handle]]; END; GetSwath: PUBLIC PROCEDURE [list:POINTER TO ListDescriptor] RETURNS[trap:Trapezoid] = BEGIN RETURN[GetNext[@(list.handle)]]; END; GenLocal: PUBLIC PROCEDURE [minx,maxx:LONG INTEGER, layer:CARDINAL, list:POINTER TO ListDescriptor] RETURNS[trap:Trapezoid] = BEGIN list.swath _ bottom; list.min _ minx; list.max _ maxx; list.layer _ layer; trap _ GetFirst[Swath[layer][bottom],minx,maxx,@(list.handle)]; IF trap = NIL THEN { trap _ GetFirst[Swath[list.layer][middle],list.min,list.max, @(list.handle)]; list.swath _ middle; }; IF trap = NIL THEN { trap _ GetFirst[Swath[list.layer][top],list.min,list.max, @(list.handle)]; list.swath _ top; } END; GetLocal: PUBLIC PROCEDURE [list:POINTER TO ListDescriptor] RETURNS[trap:Trapezoid] = BEGIN trap _ GetNext[@(list.handle)]; IF trap = NIL AND list.swath = bottom THEN { trap _ GetFirst[Swath[list.layer][middle],list.min,list.max, @(list.handle)]; list.swath _ middle; }; IF trap = NIL AND list.swath = middle THEN { trap _ GetFirst[Swath[list.layer][top],list.min,list.max, @(list.handle)]; list.swath _ top; } END; MinLayer:CARDINAL = 0; MaxLayer:CARDINAL = 7; xmin,xmax: LONG INTEGER; Swath: ARRAY [MinLayer..MaxLayer] OF ARRAY SwathType OF Node; END. (635)\159b9B236b13B142b8B252b10B136b9B61b11B280b9B206b9B124b9B527b9B