(*----------------------------------------------------------------------*) IMPLEMENTATION MODULE Memory; (* This module performs the allocation and maintenance of all the memory used by the editor. This falls into several categories : *) (*----------------------------------------------------------------------*) FROM SYSTEM IMPORT ADDRESS; FROM Universe IMPORT BYTE; IMPORT Errors; IMPORT Deletions; IMPORT StringData; IMPORT Buffers; IMPORT Store; (* Straight out of the depths of Panos *) IMPORT Debug; (*----------------------------------------------------------------------*) PROCEDURE Allocate( VAR p : ADDRESS; size : CARDINAL; typeOfMemory : MemoryType ): BOOLEAN; VAR res: INTEGER; BEGIN res := Store.Allocate (p, size); RETURN (res >= 0) END Allocate; (*----------------------------------------------------------------------*) PROCEDURE DeAllocate( VAR p : ADDRESS; size : CARDINAL; typeOfMemory : MemoryType); VAR res: INTEGER; BEGIN IF p # NIL THEN res := Store.Deallocate (p); IF res < 0 THEN Errors.Panic ("Memory: unable to deallocate block") END; p := NIL END (* if *) END DeAllocate; (*----------------------------------------------------------------------*) PROCEDURE ALLOCATE (VAR P: ADDRESS; Size: CARDINAL); BEGIN IF NOT Allocate (P, Size, HeapMemory) THEN P := NIL END END ALLOCATE; (*----------------------------------------------------------------------*) PROCEDURE DEALLOCATE (VAR P: ADDRESS; Size: CARDINAL); BEGIN DeAllocate (P, Size, HeapMemory) END DEALLOCATE; (*----------------------------------------------------------------------*) PROCEDURE NewDynamicArray (VAR P : DynamicArray; Size : CARDINAL; TypeOfMemory : MemoryType ): BOOLEAN; (* Builds a dynamic array on the given descriptor *) BEGIN IF Size = 0 THEN P.Data := NIL ELSE IF NOT Allocate (P.Data, Size, TypeOfMemory) THEN RETURN FALSE END END (* if *); P.Size := Size; RETURN TRUE; END NewDynamicArray; (*----------------------------------------------------------------------*) PROCEDURE DisposeDynamicArray (VAR P : DynamicArray; Size : CARDINAL; TypeOfMemory : MemoryType); (* Reclaims the dynamic array on the gven descriptor *) BEGIN IF P.Data # NIL THEN DeAllocate (P.Data, P.Size, TypeOfMemory) END; P.Size := 0 ; END DisposeDynamicArray ; (*----------------------------------------------------------------------*) PROCEDURE Initialise; BEGIN END Initialise; (*----------------------------------------------------------------------*) PROCEDURE Terminate; BEGIN END Terminate; (*----------------------------------------------------------------------*) BEGIN END Memory. (*----------------------------------------------------------------------*)