perm filename ALLOC.2[EAL,HE]1 blob sn#674800 filedate 1982-09-27 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00005 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	{$NOMAIN	Routines to allocate & release the various data blocks used by AL}
C00006 00003	(* initAlloc *)
C00010 00004	(* Internal routines to fool the compiler *)
C00014 00005	(* External routines to allocate & free up nodes *)
C00020 ENDMK
C⊗;
{$NOMAIN	Routines to allocate & release the various data blocks used by AL}
{$OWN		Make it so these global variables are NOT shared }

program alloc;

type 
    (* the following get used for misc record types - i.e. we fake out Pascal's 
	type checking mechanism *)

     u = (used,free);

     s3p = ↑s3;
     s3 = record next: s3p; filler: array [1..2] of integer; end;
     s4p = ↑s4;
     s4 = record next: s4p; filler: array [1..3] of integer; end;
     s6p = ↑s6;
     s6 = record next: s6p; filler: array [1..5] of integer; end;

     s7p = ↑s7;
     vectorp = s7p;
     s7 = record case u of
	    used: (refcnt: integer; val: array [1..3] of real);
	    free: (next: vectorp);
	  end;

     s8p = ↑s8;
     s8 = record next: s8p; filler: array [1..7] of integer; end;

     s11p = ↑s11;
     statementp = s11p;
     s11 = packed record
	     next, last, stlab, exprs: statementp;
	     nlines: integer;
	     bpt: boolean;
	     filler: array [1..5] of integer;
	   end;

     s14p = ↑s14;
     s14 = record next: s14p; filler: array [1..13] of integer; end;

     s25p = ↑s25;
     transp = s25p;
     s25 = record case u of
	     used: (refcnt: integer; val: array [1..3,1..4] of real);
	     free: (next: transp);
	   end;

var {Used to keep lists of the various sizes of nodes we use}
    free3: s3p;		{Used for event, enventry}
    free4: s4p;		{ident, token}
    free6: s6p;		{strng, node, cmoncb}
    free7: s7p;		{vector, varidef}
    free8: s8p;		{frame, envheader}
    free11: s11p;	{statement, environment}
    free14: s14p;	{pdb}
    free25: s25p;	{trans}

(* initAlloc *)

procedure initAlloc; external;
procedure initAlloc;
begin
 free3 := nil;
 free4 := nil;
 free6 := nil;
 free7 := nil;
 free8 := nil;
 free11 := nil;
 free14 := nil;
 free25 := nil;
end;

(* Internal routines to fool the compiler *)

function new3: s3p; 
 var n: s3p;
 begin
 n := free3;
 if n = nil then
   begin
   new(n);
   end
  else free3 := n↑.next;
 new3 := n;
 end;

procedure rel3(n: s3p);
 begin
 n↑.next := free3;
 free3 := n;
 end;

function new4: s4p; 
 var n: s4p;
 begin
 n := free4;
 if n = nil then
   begin
   new(n);
   end
  else free4 := n↑.next;
 new4 := n;
 end;

procedure rel4(n: s4p);
 begin
 n↑.next := free4;
 free4 := n;
 end;

function new6: s6p;
 var n: s6p;
 begin
 n := free6;
 if n = nil then
   begin
   new(n);
   end
  else free6 := n↑.next;
 new6 := n;
 end;

procedure rel6(n: s6p);
 begin
 n↑.next := free6;
 free6 := n;
 end;

function new7: s7p;
 var n: s7p;
 begin
 n := free7;
 if n = nil then
   begin
   new(n);
   end
  else free7 := n↑.next;
 new7 := n;
 end;

procedure rel7(n: s7p);
 begin
 n↑.next := free7;
 free7 := n;
 end;

function new8: s8p;
 var n: s8p;
 begin
 n := free8;
 if n = nil then
   begin
   new(n);
   end
  else free8 := n↑.next;
 new8 := n;
 end;

procedure rel8(n: s8p);
 begin
 n↑.next := free8;
 free8 := n;
 end;

function new11: s11p;
 var n: s11p;
 begin
 n := free11;
 if n = nil then
   begin
   new(n);
   end
  else free11 := n↑.next;
 new11 := n;
 end;

procedure rel11(n: s11p);
 begin
 n↑.next := free11;
 free11 := n;
 end;


function new14: s14p;
 var n: s14p;
 begin
 n := free14;
 if n = nil then
   begin
   new(n);
   end
  else free14 := n↑.next;
 new14 := n;
 end;

procedure rel14(n: s14p);
 begin
 n↑.next := free14;
 free14 := n;
 end;


function new25: s25p;
 var n: s25p;
 begin
 n := free25;
 if n = nil then
   begin
   new(n);
   end
  else free25 := n↑.next;
 new25 := n;
 end;

procedure rel25(n: s25p);
 begin
 n↑.next := free25;
 free25 := n;
 end;

(* External routines to allocate & free up nodes *)

{ 3 word nodes }

function newEvent: s3p;  external;
function newEvent; 
 begin newEvent := new3 end;

procedure relEvent(n: s3p);  external;
procedure relEvent; 
 begin rel3(n); end;

function newEentry: s3p;  external;
function newEentry; 
 begin newEentry := new3; end;

procedure relEentry(n: s3p);  external;
procedure relEentry; 
 begin rel3(n); end;



{ 4 word nodes }

function newIdent: s4p;  external;
function newIdent; 
 begin newIdent := new4; end;

procedure relIdent(n: s4p);  external;
procedure relIdent; 
 begin rel4(n); end;

function newToken: s4p;  external;
function newToken; 
 begin newToken := new4; end;

procedure relToken(n: s4p);  external;
procedure relToken; 
 begin rel4(n); end;


{ 6 word nodes }

function newStrng: s6p;  external;
function newStrng; 
 begin newStrng := new6; end;

procedure relStrng(n: s6p); external;
procedure relStrng;
 begin rel6(n) end;

function newNode: s6p; external;
function newNode;
 begin newNode := new6 end;

procedure relNode(n: s6p); external;
procedure relNode;
 begin rel6(n) end;

function newCmoncb: s6p;  external;
function newCmoncb; 
 begin newCmoncb := new6 end;

procedure relCmoncb(n: s6p);  external;
procedure relCmoncb; 
 begin rel6(n) end;


{ 7 word nodes }

function newVector: vectorp; external;
function newVector;
 var v: vectorp;
 begin
 v := new7;
 v↑.refcnt := 0;	(* Need to reset reference count *)
 newVector := v;
 end;

procedure relVector(v: vectorp); external;
procedure relVector;
 begin rel7(v) end;

function newVaridef: s7p;  external;
function newVaridef; 
 begin newVaridef := new7; end;

procedure relVaridef(n: s7p);  external;
procedure relVaridef; 
 begin rel7(n); end;


{ 8 word nodes }

function newFrame: s8p;  external;
function newFrame; 
 begin newFrame := new8 end;

procedure relFrame(n: s8p);  external;
procedure relFrame; 
 begin rel8(n) end;

function newEheader: s8p;  external;
function newEheader; 
 begin newEheader := new8 end;

procedure relEheader(n: s8p);  external;
procedure relEheader; 
 begin rel8(n) end;


{ 11 word nodes }

function newStatement: statementp; external;
function newStatement;
 var s: statementp;
 begin
 s := new11;
 with s↑ do
  begin next := nil; last := nil; stlab := nil; exprs := nil; bpt := false;
	nlines := 1; end;
 newStatement := s;
 end;

procedure relStatement(n: statementp);  external;
procedure relStatement; 
 begin rel11(n) end;

function newEnvironment: s11p;  external;
function newEnvironment; 
 begin newEnvironment := new11 end;

procedure relEnvironment(n: s11p);  external;
procedure relEnvironment; 
 begin rel11(n) end;



{ 14 word nodes }

function newPdb: s14p;  external;
function newPdb; 
 begin newPdb := new14 end;

procedure relPdb(n: s14p);  external;
procedure relPdb; 
 begin rel14(n) end;



{ 25 word nodes }

function newTrans: transp; external;
function newTrans;
 var t: transp;
 begin
 t := new25;
 t↑.refcnt := 0;
 newTrans := t;
 end;

procedure relTrans(t: transp); external;
procedure relTrans;
 begin rel25(t) end;