DEFINITION MODULE Storage;
(*
  Module:	Dynamic storage allocation
  From:		"Programming in Modula-2", 3rd, corrected edition, by N. Wirth
  Version:	$Header$
*)

(*
  Wirth's 3rd edition certainly is confusing: mostly it uses Allocate, but
  the module at the end of the book defines ALLOCATE. To avoid problems,
  I included them both.
*)

	FROM SYSTEM IMPORT ADDRESS;

	PROCEDURE ALLOCATE(VAR a : ADDRESS; size : CARDINAL);
	(* Allocate an area of the given size and return the address
	   in "a". If no space is available, the calling program is
	   killed.
	*)

	PROCEDURE Allocate(VAR a : ADDRESS; size : CARDINAL);
	(* Identical to ALLOCATE *)

	PROCEDURE DEALLOCATE(VAR a : ADDRESS; size : CARDINAL);
	(* Free the area at address "a" with the given size. The area
	   must have been allocated by "ALLOCATE", with the same size.
	*)

	PROCEDURE Deallocate(VAR a : ADDRESS; size : CARDINAL);
	(* Identical to DEALLOCATE *)

	PROCEDURE Available(size : CARDINAL) : BOOLEAN;
	(* Return TRUE if a contiguous area with the given size could be
	   allocated.
	   Notice that this only indicates if an ALLOCATE of this size
	   would succeed, and that it gives no indication of the total
	   available memory.
	*)

END Storage.