-- File ParserTypes.mesa -- March 5, 1980 5:04 PM -- Converte to Mesa 6 October 20, 1980 4:20 PM -- October 20, 1980 4:20 PM by MN DIRECTORY SystemDefs: FROM "SystemDefs" USING [AllocateHeapNode, FreeHeapNode], ParserTypeDefs: FROM "ParserTypeDefs"; ParserTypes: PROGRAM IMPORTS SystemDefs EXPORTS ParserTypeDefs = BEGIN OPEN ParserTypeDefs; free: POINTER TO LinkedPoint; tFree: POINTER TO LinkedTEntry; -- for debugging space leaks: PathNodes: INTEGER _ 0; PointNodes: INTEGER _ 0; UserNodes: INTEGER _ 0; TListNodes: INTEGER _ 0; TNodes: INTEGER _ 0; InitTypes: PUBLIC PROCEDURE RETURNS [BOOLEAN] = BEGIN free _ NIL; tFree _ NIL; PathNodes _ PointNodes _ UserNodes _ TListNodes _ TNodes _ 0; RETURN[TRUE]; END; FinishTypes: PUBLIC PROCEDURE RETURNS [BOOLEAN] = BEGIN RETURN[TRUE]; END; PathLength: PUBLIC PROCEDURE [a: Path] RETURNS [CARDINAL] = BEGIN RETURN[a.length]; END; AllocatePath: PUBLIC PROCEDURE RETURNS [Path] = BEGIN A: Path; A _ SystemDefs.AllocateHeapNode[SIZE[PathRecord]]; A^ _ PathRecord[first: NIL,last: NIL, length: 0]; PathNodes _ PathNodes + 1; RETURN[A]; END; FreePath: PUBLIC PROCEDURE [a: Path] = BEGIN node: POINTER TO LinkedPoint _ a.first; saved: POINTER TO LinkedPoint; UNTIL node = NIL DO saved _ node.next; FreeNode[node]; node _ saved; ENDLOOP; PathNodes _ PathNodes - 1; SystemDefs.FreeHeapNode[a]; END; AppendPoint: PUBLIC PROCEDURE [a: Path, p: Point] = BEGIN temp: POINTER TO LinkedPoint _ a.last; a.last _ GetNode[]; IF temp # NIL THEN temp.next _ a.last; a.last.value _ p; a.last.next _ NIL; IF a.first = NIL THEN a.first _ a.last; a.length _ a.length + 1; END; CopyPath: PUBLIC PROCEDURE [from,to: Path] = BEGIN temp: POINTER TO LinkedPoint; IF from = to THEN RETURN; FOR temp _ from.first, temp.next UNTIL temp = NIL DO AppendPoint[to,temp.value]; ENDLOOP; END; RemovePoint: PUBLIC PROCEDURE [a: Path] RETURNS [BOOLEAN, Point] = BEGIN ans: Point; IF a.first = NIL THEN RETURN [FALSE, ans] ELSE BEGIN Temp: POINTER TO LinkedPoint _ a.first.next; ans _ a.first.value; FreeNode[a.first]; a.first _ Temp; IF a.first = NIL THEN a.last _ NIL; a.length _ a.length - 1; RETURN [TRUE, ans]; END; END; AllocateUserNode: PUBLIC PROCEDURE[nwords: CARDINAL] RETURNS [POINTER] = BEGIN UserNodes _ UserNodes + 1; RETURN[SystemDefs.AllocateHeapNode[nwords]]; END; FreeUserNode: PUBLIC PROCEDURE [address: POINTER] = BEGIN UserNodes _ UserNodes - 1; SystemDefs.FreeHeapNode[address]; END; -- Private Procedures FreeNode: PROCEDURE [node: POINTER TO LinkedPoint] = INLINE BEGIN node.next _ free; free _ node; END; GetNode: PROCEDURE RETURNS [POINTER TO LinkedPoint] = INLINE BEGIN ans: POINTER TO LinkedPoint; IF free = NIL THEN BEGIN PointNodes _ PointNodes + 1; RETURN[SystemDefs.AllocateHeapNode[SIZE[LinkedPoint]]]; END; ans _ free; free _ free.next; RETURN[ans]; END; AllocateTList: PUBLIC PROCEDURE RETURNS [TList] = BEGIN A: TList; A _ SystemDefs.AllocateHeapNode[SIZE[TRecord]]; A^ _ TRecord[first: NIL,last: NIL, length: 0]; TListNodes _ TListNodes + 1; RETURN[A]; END; FreeTList: PUBLIC PROCEDURE [a: TList] = BEGIN node: POINTER TO LinkedTEntry _ a.first; saved: POINTER TO LinkedTEntry; UNTIL node = NIL DO saved _ node.next; FreeTNode[node]; node _ saved; ENDLOOP; TListNodes _ TListNodes - 1; SystemDefs.FreeHeapNode[a]; END; AppendTList: PUBLIC PROCEDURE [a: TList, p: TEntry] = BEGIN temp: POINTER TO LinkedTEntry _ a.last; a.last _ GetTNode[]; IF temp # NIL THEN temp.next _ a.last; a.last.value _ p; a.last.next _ NIL; IF a.first = NIL THEN a.first _ a.last; a.length _ a.length + 1; END; RemoveTList: PUBLIC PROCEDURE [a: TList] RETURNS [BOOLEAN, TEntry] = BEGIN ans: TEntry; IF a.first = NIL THEN RETURN [FALSE, ans] ELSE BEGIN temp: POINTER TO LinkedTEntry _ a.first.next; ans _ a.first.value; FreeTNode[a.first]; a.first _ temp; IF a.first = NIL THEN a.last _ NIL; a.length _ a.length - 1; RETURN [TRUE, ans]; END; END; TListLength: PUBLIC PROCEDURE [a: TList] RETURNS [CARDINAL] = BEGIN RETURN[a.length]; END; -- More Private Procedures FreeTNode: PROCEDURE [node: POINTER TO LinkedTEntry] = INLINE BEGIN node.next _ tFree; tFree _ node; END; GetTNode: PROCEDURE RETURNS [POINTER TO LinkedTEntry] = INLINE BEGIN ans: POINTER TO LinkedTEntry; IF tFree = NIL THEN BEGIN TNodes _ TNodes + 1; RETURN[SystemDefs.AllocateHeapNode[SIZE[LinkedTEntry]]]; END; ans _ tFree; tFree _ tFree.next; RETURN[ans]; END; END. (670)\102b31B2b11B110b12B305b9B165b11B72b10B87b12B211b8B274b11B272b8B212b11B358b16B150b12B145b8B104b7B281b13B209b9B280b11B277b11B363b11B118b9B107b8B