-- ThreeC4PrimImplDefs.mesa: October 18, 1985 10:24:58 am PDT
-- Sturgis, November 4, 1985 5:24:35 pm PST
-- Shoup, June 23, 1986 10:07:04 am PDT
DIRECTORY
ThreeC4BaseDecl1Def USING[FileSeqNode, IdentifierNode, IntegerNode, MesaCodeNode, NameNode, NameListNode, TypeNode, TypeListNode],
ThreeC4BaseDecl2Def USING[ContextNode, FcnDefGraphNode],
ThreeC4BasicAbTypesDef USING[WholeFileNode],
IO USING[STREAM],
Rope USING[ROPE];
ThreeC4PrimImplDefs: CEDAR DEFINITIONS =
BEGIN OPEN ThreeC4BaseDecl1Def, ThreeC4BaseDecl2Def, ThreeC4BasicAbTypesDef;
-- these first items are for non functional users, e.g. the driver
-- the following items are for intercommunication between the different prim impl files
-- first some from ThreeC4PrimImpl1
GetIntegerData: PUBLIC PROC[IntegerNode] RETURNS[INT];
GetNameCodeText: PROC[NameNode] RETURNS[Rope.ROPE];
GenNames: PROC[NameListNode, PROC[NameNode]];
GenTypeList: PROC[TypeListNode, PROC[TypeNode]];
GenNameTypePairs: PROC[NameListNode, TypeListNode, PROC[NameNode, TypeNode]];
GetNameIds: PROC[NameNode] RETURNS[id1, id2: IdentifierNode];
BuildType: PROC[REF ANY] RETURNS[TypeNode];
GetTypeInfo: PROC[TypeNode] RETURNS[REF ANY];
CopyTypeList: PROC[TypeListNode] RETURNS[TypeListNode];
EqualNames: PROC[NameNode, NameNode] RETURNS[BOOLEAN];
GetNameInfo: PROC[NameNode] RETURNS[text: Rope.ROPE, key: INT];
ShowName: PROC[name: NameNode, on: IO.STREAM];
ShowNameList: PROC[nameList: NameListNode, on: IO.STREAM];
ShowNamePosition: PROC[name: NameNode, on: IO.STREAM];
PutNameR: PROC[name: NameNode] RETURNS[Rope.ROPE];
PrintError: PROC[m1, m2, m3, m4, m5: Rope.ROPE ← NIL];
PrintBadName: PUBLIC PROC[name: NameNode, m1, m2, m3, m4, m5: Rope.ROPE ← NIL];
UnrecoveredError: ERROR;
BuildErrorName: PROC RETURNS [NameNode];
IsErrorName: PROC [NameNode] RETURNS [BOOLEAN];
BuildErrorNameList: PROC RETURNS [NameListNode];
IsErrorNameList: PROC [NameListNode] RETURNS [BOOLEAN];
BuildErrorTypeList: PROC RETURNS [TypeListNode];
IsErrorTypeList: PROC [TypeListNode] RETURNS [BOOLEAN];
GetGlobalEnv: PROC RETURNS [GlobalEnvHandle];
-- then some from ThreeC4PrimImpl2
RopeFromCode: PROC[MesaCodeNode] RETURNS[Rope.ROPE];
ShowCode: PROC[code: MesaCodeNode, on: IO.STREAM];
WriteFiles: PROC[FileSeqNode, Rope.ROPE, IO.STREAM];
-- then some from ThreeC4PrimImpl3
GetTypeCodeName: PROC[TypeNode] RETURNS[MesaCodeNode];
RecordParseTree: PROC[ContextNode, NameNode, WholeFileNode] RETURNS[ContextNode];
BuildErrorInfo: PROC RETURNS [REF ANY];
BuildErrorType: PROC RETURNS [TypeNode];
IsErrorType: PROC [TypeNode] RETURNS [BOOLEAN];
EqualTypes: PROC[TypeNode, TypeNode] RETURNS[BOOLEAN];
-- then some from ThreeC4PrimImpl4
HashTable: TYPE = REF HashTableBody;
HashTableBody: TYPE;
CreateHashTable: PROC[CARDINAL] RETURNS[HashTable];
MakeEntry: PROC[HashTable, NameNode, REF ANY];
FindExistingEntry: PROC[table: HashTable, name: NameNode] RETURNS[REF ANY];
FindEntry: PROC[table: HashTable, name: NameNode] RETURNS[REF ANY];
EnumerateHashTable: PROC[table: HashTable, for: PROC[info: REF ANY, name: NameNode]];
-- finally from ThreeC4PrimImpl5
SetMode: PROC[targetFilesNamePrefix: Rope.ROPE, sourceFilesNameSuffix: Rope.ROPE];
ReadModeInfo: PROC RETURNS[
      targetFilesNamePrefix: Rope.ROPE,
      sourceFilesNameSuffix: Rope.ROPE];
ClearMode: PROC;
ReportError: PROC[msg: Rope.ROPE];
-- from ThreeC4FlowAnalImpl
TearDownFcnDefGraphNode: PROC [FcnDefGraphNode] RETURNS [FcnDefGraphNode];
-- we use a global state for error recovery
GlobalEnvHandle: TYPE = REF GlobalEnvRec;
GlobalEnvRec: TYPE = RECORD[
errorCount: INTEGER ← 0,
errorMark: INTEGER ← 0];
END..