-- Storage.mesa  Last Edited by
-- Sandman on June 30, 1980  5:05 PM
-- Karlton on July 16, 1980  6:02 PM
-- Copyright  Xerox Corporation 1979, 1980

DIRECTORY Environment USING [wordsPerPage];

Storage: DEFINITIONS =
  BEGIN
  
  ZoneTooSmall: ERROR [POINTER];
  InvalidNode: ERROR [POINTER];
  
  Node: PROCEDURE [nwords: CARDINAL] RETURNS [p: POINTER];
  String: PROCEDURE [nchars: CARDINAL] RETURNS [s: STRING];
  Pages: PROCEDURE [npages: CARDINAL] RETURNS [base: POINTER];
  Words: PROCEDURE [nwords: CARDINAL] RETURNS [base: POINTER];
  
  Free: PROCEDURE [p: POINTER];
  FreeString: PROCEDURE [s: STRING];
  FreePages, FreeWords: PROCEDURE [base: POINTER];
  
  FreeNodeNil: PROCEDURE [p: POINTER] RETURNS [nil: POINTER] = INLINE
    BEGIN Free[p]; RETURN[NIL] END;
    
  FreeStringNil: PROCEDURE [s: STRING] RETURNS [nil: STRING] = INLINE
    BEGIN Free[s]; RETURN[NIL] END;
    
  FreePagesNil: PROCEDURE [base: POINTER] RETURNS [nil: POINTER] = INLINE
    BEGIN FreePages[base]; RETURN[NIL] END;
    
  Expand: PROCEDURE [pages: CARDINAL];
  Prune: PROCEDURE RETURNS [BOOLEAN];
  
  CopyString: PROCEDURE [s: LONG STRING, longer: CARDINAL ← 0] RETURNS [newS: STRING];
  ExpandString: PROCEDURE [s: POINTER TO STRING, longer: CARDINAL];
  
  EmptyString: PROCEDURE [s: LONG STRING] RETURNS [BOOLEAN] = INLINE
    BEGIN RETURN[s = NIL OR s.length = 0] END;
    
  PagesForWords: PROCEDURE [nWords: CARDINAL] RETURNS [CARDINAL] = INLINE
    BEGIN RETURN[(nWords + Environment.wordsPerPage - 1)/Environment.wordsPerPage] END;
    
  StringLength: PROCEDURE [s: LONG STRING] RETURNS [CARDINAL] = INLINE
    BEGIN RETURN[IF s = NIL THEN 0 ELSE s.length] END;
    
  HeapZone: PROCEDURE RETURNS [POINTER];
  
  END.