-- Heap.mesa (last edited by: McJones on: May 28, 1980  1:07 PM)
-- Alto version, HGM, January 30, 1981  4:40 PM


Heap: DEFINITIONS =
  BEGIN

  NWords: TYPE = [0..32766); -- Limit on node size

  systemZone: READONLY UNCOUNTED ZONE;
  systemMDSZone: READONLY MDSZone;

  MakeNode: PROCEDURE [z: UNCOUNTED ZONE ← systemZone, n: NWords]
    RETURNS [LONG POINTER];

  FreeNode: PROCEDURE [z: UNCOUNTED ZONE ← systemZone, p: LONG POINTER];

  MakeMDSNode: PROCEDURE [z: MDSZone ← systemMDSZone, n: NWords]
    RETURNS [POINTER];

  FreeMDSNode: PROCEDURE [z: MDSZone ← systemMDSZone, p: POINTER];

  MakeString: PROCEDURE [z: UNCOUNTED ZONE ← systemZone, maxlength: CARDINAL]
    RETURNS [LONG STRING] = INLINE {RETURN[z.NEW[StringBody [maxlength]]]};

  FreeString: PROCEDURE [z: UNCOUNTED ZONE ← systemZone, s: LONG STRING] = INLINE
    {z.FREE[@s]}; -- note this sets local s to NIL

  MakeMDSString: PROCEDURE [z: MDSZone ← systemMDSZone, maxlength: CARDINAL]
    RETURNS [STRING] = INLINE {RETURN[z.NEW[StringBody [maxlength]]]};

  FreeMDSString: PROCEDURE [z: MDSZone ← systemMDSZone, s: STRING] = INLINE {
    z.FREE[@s]}; -- note this sets local s to NIL

  END.