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