-- BcdSymbols.Mesa
-- last edited by Satterthwaite on September 14, 1982 3:00 pm

DIRECTORY
  BcdDefs: TYPE USING [CTIndex, EXPIndex, FTIndex, IMPIndex, MTIndex],
  Table: TYPE USING [Base, Index, Limit];

Symbols: DEFINITIONS = {

  Base: TYPE ~ Table.Base;
  Limit: CARDINAL ~ Table.Limit;
    
  -- Hash Table

  HVLength: NAT ~ 71;
  HVIndex: TYPE ~ NAT [0..HVLength);

  HTRecord: TYPE ~ RECORD [link: HTIndex, offset: CARDINAL];

  HTNull: HTIndex ~ HTIndex.FIRST;
  HTIndex: TYPE ~ NAT [0..Limit/2);

  -- Semantic Table

  STRecord: TYPE ~ RECORD [
    filename, assigned: BOOL,
    hti: HTIndex,
    imported, exported: BOOL,
    link: STIndex,
    impi: BcdDefs.IMPIndex,
    impgfi: CARDINAL,
    body: SELECT type: * FROM
      unknown => [],
      local => [
	map: STMap,
	info: Table.Index, -- Tree.Index,
	context: CXIndex],
      external => [
	map: STMap,
	pointer: SELECT ptype: * FROM
	  instance => [sti: STIndex],
	  file => [fti: BcdDefs.FTIndex],
	  ENDCASE]
      ENDCASE];

  STNull: STIndex ~ STIndex.LAST;
  STIndex: TYPE ~ Base RELATIVE POINTER [0..Limit) TO STRecord;

  -- to share source modules with compiler

  ISEIndex, SEIndex: TYPE ~ STIndex;

  STMap: TYPE ~ RECORD [
    SELECT type: * FROM
      unknown => [],
      config => [cti: BcdDefs.CTIndex],
      module => [mti: BcdDefs.MTIndex],
      interface => [expi: BcdDefs.EXPIndex]
      ENDCASE];

  -- Context Table

  CXRecord: TYPE ~ RECORD [link: STIndex];

  CXNull: CXIndex ~ CXIndex.LAST;
  CXIndex: TYPE ~ Base RELATIVE POINTER [0..Limit) TO CXRecord;

  }.