-- file CompilerUtil.Mesa
-- last modified by Sandman, August 26, 1980  2:30 PM

DIRECTORY
  Segments USING [FHandle, SHandle],
  Tree USING [Link, Map, Scan];
  
CompilerUtil: DEFINITIONS =
  BEGIN
  
-- binary table management

  TableId: TYPE = [0..3);
    parse: TableId = 0;
    error: TableId = 1;
    debug: TableId = 2;
    
  TableSegment: PROC [TableId] RETURNS [Segments.SHandle];
  LockTableSegment: PROC [TableId] RETURNS [LONG POINTER];
  UnlockTableSegment: PROC [TableId];
  
-- compiler passes

  PassIndex: TYPE =
    {utilities, pass1, pass2, pass3, pass3p, pass4, pass5, debug};
    
  PrefillSymbols: PROC;
  
  P1Unit: PROC RETURNS [BOOLEAN];
  P2Unit: Tree.Map;
  P3Unit: Tree.Map;
  P3Postlude: PROC [expand: BOOLEAN];
  P4Unit: Tree.Scan;
  P5module: PROC;
  
-- object output

  SetObjectStamp: PROC;
  StartObjectFile: PROC [Segments.FHandle] RETURNS [POINTER];
  EndObjectFile: PROC [success: BOOLEAN];
  TableOut: PROC [sourceFile: STRING];
  
  NextFilePage: PROC RETURNS [CARDINAL];
  StartBCD: PROC;
  ReadBCDOffset: PROC RETURNS [CARDINAL];
  ReadBCDIndex: PROC RETURNS [LONG UNSPECIFIED];
  AppendBCDWord: PROC [word: UNSPECIFIED];
  AppendBCDWords: PROC [addr: POINTER, n: CARDINAL];
  AppendBCDString: PROC [s: STRING];
  UpdateBCDWords: PROC [offset: CARDINAL, addr: POINTER, n: CARDINAL];
  EndBCD: PROC;
  
-- debugging

  PrintTree: PROC [Tree.Link];
  PrintBodies: PROC;
  PrintSymbols: PROC;
  
-- swapping control

  MakeSwappable: PROC [module: PROGRAM, pass: PassIndex];
  
  Pass1, Pass2, Pass3, Pass3P, Pass4, Code: PROGRAM;
  
  END.