--MiscProcs.mesa --Frank 6-Jun-84 18:20:59 --Lu 19-Dec-84 15:39:07 DIRECTORY Heap, String; MiscProcs: PROGRAM IMPORTS Heap, String = BEGIN ArraySize: CARDINAL = 12; A: ARRAY [0..ArraySize] OF CARDINAL ← ALL[0]; Node: TYPE = RECORD [str: LONG STRING ← NIL, next: NodePtr ← NIL]; NodePtr: TYPE = LONG POINTER TO Node; headNode: NodePtr ← NIL; z: UNCOUNTED ZONE = Heap.Create[initial: 1]; Interchange: PROC [thisOne, thatOne: CARDINAL] = BEGIN --interchange the two elements whose address in array are "thisOne" & "thatOne" temp: CARDINAL ← A[thisOne]; A[thisOne] ← A[thatOne]; A[thatOne] ← temp; END; Factorial: PROC [number: CARDINAL] RETURNS [j: CARDINAL] = BEGIN factorialOfZero: CARDINAL = 1; inputTooBig: CARDINAL = 0; SELECT number FROM 0 => RETURN[factorialOfZero]; IN [1..12] => RETURN[number * Factorial[number - 1]]; ENDCASE => RETURN[inputTooBig]; END; MakeLinkedList: PROC [howManyNodes: CARDINAL] = BEGIN ptr1, ptr2: NodePtr; char: CHAR ← 'A; FreeOldNodes[@headNode]; --destroy old linked list FOR i: CARDINAL IN [0..howManyNodes) DO ptr1 ← z.NEW[Node ← [str: String.MakeString[z: z, maxlength: 1]]]; String.AppendChar[ptr1.str, char]; --Store char in record (ptr1↑) char ← SUCC[char]; --If char = 'A THEN char ← 'B, etc. ptr2 ← headNode; headNode ← ptr1; headNode.next ← ptr2; ptr1 ← NIL; ENDLOOP; END; FreeOldNodes: PROC [node: LONG POINTER TO NodePtr] = BEGIN IF node↑ = NIL THEN RETURN; IF node.next = NIL THEN z.FREE[node] ELSE FreeOldNodes[@node.next]; END; END.