-- ErrorImpl.mesa -- Last edited by Lewis on 4-Jan-82 17:58:04 -- last edited by Satterthwaite, December 29, 1982 11:52 am DIRECTORY BcdDefs USING [FTIndex, FTNull, MTIndex, NameRecord, VersionStamp], CharIO USING [NumberFormat, PutChar, PutNumber, PutString], Error, FileStream: TYPE USING [SetIndex], HashOps USING [HTIndex, htNull, SubStringForHash], PackagerDefs USING [globalData, nullSourceIndex], SourceBcd: TYPE USING [bcdBases, ComponentKind, CTreeIndex, nullCTreeIndex, Father, Name], Stream: TYPE USING [GetChar, EndOfStream], String USING [SubString, SubStringDescriptor], Table USING [Base], Time USING [Append, Packed, Unpack]; ErrorImpl: PROGRAM IMPORTS CharIO, FileStream, HashOps, PackagerDefs, SourceBcd, Stream, Time EXPORTS Error = BEGIN OPEN PackagerDefs, Error; SubStringDescriptor: TYPE = String.SubStringDescriptor; SubString: TYPE = String.SubString; -- Utility Prints WriteString: PROC [s: STRING] = INLINE { CharIO.PutString[globalData.errorStream, s]}; WriteChar: PROC [c: CHARACTER] = INLINE { CharIO.PutChar[globalData.errorStream, c]}; WriteEOL: PROC = INLINE {CharIO.PutChar[globalData.errorStream, '\n]}; Space: PROC = INLINE {CharIO.PutChar[globalData.errorStream, ' ]}; Prefix: PROC [class: ErrorClass] = BEGIN WriteEOL[]; IF class = warning THEN WriteString["Warning: "L]; END; ErrorLog: PROC [class: ErrorClass] = BEGIN IF globalData.textIndex # PackagerDefs.nullSourceIndex THEN BEGIN WriteString[", at ["L]; CharIO.PutNumber[ globalData.errorStream, globalData.textIndex, [base:10, columns:1, unsigned:TRUE, zerofill: FALSE]]; WriteChar[']]; WriteEOL[]; PrintTextLine[globalData.textIndex]; END ELSE WriteEOL[]; SELECT class FROM error => {globalData.errors ← TRUE; globalData.nErrors ← globalData.nErrors+1}; warning => {globalData.warnings ← TRUE; globalData.nWarnings ← globalData.nWarnings+1}; ENDCASE; END; PrintTextLine: PROC [origin: LONG CARDINAL] = BEGIN start, lineIndex: LONG CARDINAL ← origin; char: CHARACTER; THROUGH [1..100] UNTIL lineIndex = 0 DO lineIndex ← lineIndex - 1; FileStream.SetIndex[globalData.packStream, lineIndex]; IF (globalData.packStream).GetChar[] = '\n THEN EXIT; start ← lineIndex; ENDLOOP; FileStream.SetIndex[globalData.packStream, start]; THROUGH [1..100] DO char ← (globalData.packStream).GetChar[ ! Stream.EndOfStream => GOTO out]; SELECT char FROM '\n, '\032 => EXIT; -- ↑Z for Bravo trailers ENDCASE => WriteChar[char]; REPEAT out => NULL; ENDLOOP; WriteChar['\n]; END; WriteHti: PROC [hti: HashOps.HTIndex] = BEGIN ss: SubStringDescriptor; IF hti = HashOps.htNull THEN RETURN; HashOps.SubStringForHash[@ss, hti]; FOR i: CARDINAL IN [ss.offset..ss.offset+ss.length) DO WriteChar[ss.base[i]]; ENDLOOP; END; WriteName: PROC [name: BcdDefs.NameRecord] = BEGIN nameSubStr: SubString ← @nameDesc; nameDesc: SubStringDescriptor ← [ base: @SourceBcd.bcdBases.ssb.string, offset: name, length: SourceBcd.bcdBases.ssb.size[name]]; WriteSubString[nameSubStr]; END; WriteSubString: PROC [ss: SubString] = BEGIN FOR i: CARDINAL IN [ss.offset..ss.offset+ss.length) DO WriteChar[ss.base[i]] ENDLOOP; END; WriteVersion: PROC [v: BcdDefs.VersionStamp, paren: BOOL←FALSE] = { IF paren THEN WriteString["(version "L]; IF v.time = 0 THEN WriteString["<null version>"L] ELSE { StampWords: CARDINAL~BcdDefs.VersionStamp.SIZE; str: PACKED ARRAY [0..4*StampWords) OF [0..16) ~ LOOPHOLE[v]; digit: STRING~"0123456789abcdef"L; WriteChar['"]; FOR i: NAT IN [0..4*StampWords) DO WriteChar[digit[str[i]]] ENDLOOP; WriteChar['"]}; IF paren THEN WriteChar[')]}; WriteTime: PROC [t: Time.Packed] = BEGIN s: STRING ← [20]; Time.Append[s, Time.Unpack[t]]; WriteString[s]; END; -- Error Reporting Procedures Error: PUBLIC PROC [class: ErrorClass, s: STRING] = BEGIN Prefix[class]; WriteString[s]; ErrorLog[class]; END; ErrorFile: PUBLIC PROC [class: ErrorClass, s: STRING, fti: BcdDefs.FTIndex] = BEGIN Prefix[class]; IF fti = BcdDefs.FTNull THEN WriteString["(null)"L] ELSE WriteName[SourceBcd.bcdBases.ftb[fti].name]; Space[]; WriteString[s]; ErrorLog[class]; END; ErrorHti: PUBLIC PROC [class: ErrorClass, s: STRING, hti: HashOps.HTIndex] = BEGIN Prefix[class]; WriteHti[hti]; Space[]; WriteString[s]; ErrorLog[class]; END; ErrorName: PUBLIC PROC [ class: ErrorClass, s: STRING, name: BcdDefs.NameRecord] = BEGIN Prefix[class]; WriteName[name]; Space[]; WriteString[s]; ErrorLog[class]; END; WrongSymbolsVersion: PUBLIC PROC [ class: ErrorClass, module: BcdDefs.MTIndex, requiredVersion, actualVersion: BcdDefs.VersionStamp] = BEGIN Prefix[class]; WriteString["Symbols for module "L]; WriteName[SourceBcd.bcdBases.mtb[module].name]; WriteString[" were required in version "L]; WriteVersion[requiredVersion]; WriteString[", but were found in version "L]; WriteVersion[actualVersion]; ErrorLog[class]; END; WrongFileVersion: PUBLIC PROC [ class: ErrorClass, fti: BcdDefs.FTIndex, requiredVersion, actualVersion: BcdDefs.VersionStamp] = BEGIN Prefix[class]; WriteString["File "L]; WriteName[SourceBcd.bcdBases.ftb[fti].name]; WriteString[" was required in version "L]; WriteVersion[requiredVersion]; WriteString[", but was found in version "L]; WriteVersion[actualVersion]; ErrorLog[class]; END; UnknownComponent: PUBLIC PROC [ class: ErrorClass, kind: SourceBcd.ComponentKind, mainPartOfCompId: HashOps.HTIndex] = BEGIN Prefix[class]; WriteString["Component "L]; WriteHti[mainPartOfCompId]; WriteString[" is not a module or configuration "L]; IF kind = instance THEN WriteString["instance "L]; WriteString["in the source Bcd"L]; ErrorLog[class]; END; AmbiguousComponent: PUBLIC PROC [ class: ErrorClass, kind: SourceBcd.ComponentKind, compNode1, compNode2: SourceBcd.CTreeIndex] = BEGIN WriteQualifiedName: PROC [cNode: SourceBcd.CTreeIndex] = BEGIN IF cNode.Father # SourceBcd.nullCTreeIndex THEN {WriteQualifiedName[cNode.Father]; WriteChar['.]}; WriteName[cNode.Name[kind]]; END; Prefix[class]; WriteString["Ambiguous component reference: "L]; WriteString["two interpretations are\n"L]; IF compNode1 # SourceBcd.nullCTreeIndex THEN {WriteString[" "L]; WriteQualifiedName[compNode1]; WriteEOL[]}; IF compNode2 # SourceBcd.nullCTreeIndex THEN {WriteString[" "L]; WriteQualifiedName[compNode2]; WriteEOL[]}; ErrorLog[class]; END; -- One of the code packs excepted by an implicit component description has -- itself an implicit c.d. including a module of the original c.d. ImplicitCDIncludesModule: PUBLIC PROC [ class: ErrorClass, componentId, codePackId: HashOps.HTIndex, module: BcdDefs.MTIndex] = BEGIN Prefix[class]; WriteString["A component's procedures may only be abbreviated once: \n"L]; WriteString["The component "L]; WriteHti[componentId]; WriteString[" in code pack "L]; WriteHti[codePackId]; WriteString[" also contains "L]; WriteName[SourceBcd.bcdBases.mtb[module].name]; ErrorLog[class]; END; ModuleInTwoSegments: PUBLIC PROC [ class: ErrorClass, module: BcdDefs.MTIndex, segId1, segId2: HashOps.HTIndex] = BEGIN Prefix[class]; WriteString["The module "L]; WriteName[SourceBcd.bcdBases.mtb[module].name]; WriteString[" is contained in two code segments: "L]; WriteHti[segId1]; WriteString[" and "L]; WriteHti[segId2]; ErrorLog[class]; END; ModuleAlreadyPacked: PUBLIC PROC [ class: ErrorClass, module: BcdDefs.MTIndex] = BEGIN Prefix[class]; WriteString["The module "L]; WriteName[SourceBcd.bcdBases.mtb[module].name]; WriteString[" has already been packed"L]; ErrorLog[class]; END; TableCompModuleNotIncAsUnit: PUBLIC PROC [ class: ErrorClass, module: BcdDefs.MTIndex] = BEGIN Prefix[class]; WriteString["The module "L]; WriteName[SourceBcd.bcdBases.mtb[module].name]; WriteString[" is tablecompiled and must be included as a unit"L]; ErrorLog[class]; END; NotProcInModule: PUBLIC PROC [ class: ErrorClass, procName: HashOps.HTIndex, module: BcdDefs.MTIndex] = BEGIN Prefix[class]; WriteHti[procName]; WriteString[" is not an outermost procedure in module "L]; WriteName[SourceBcd.bcdBases.mtb[module].name]; ErrorLog[class]; END; ProcPlacedTwice: PUBLIC PROC [ class: ErrorClass, procId: SubString, module: BcdDefs.MTIndex, cpId1, cpId2: HashOps.HTIndex] = BEGIN Prefix[class]; WriteString["The procedure "L]; WriteSubString[procId]; WriteString[" from module "L]; WriteName[SourceBcd.bcdBases.mtb[module].name]; WriteString[" appears in two code packs: "L]; WriteHti[cpId1]; WriteString[" and "L]; WriteHti[cpId2]; ErrorLog[class]; END; ProcNotPlaced: PUBLIC PROC [ class: ErrorClass, procId: SubString, module: BcdDefs.MTIndex] = BEGIN Prefix[class]; WriteString["The procedure "L]; WriteSubString[procId]; WriteString[" from module "L]; WriteName[SourceBcd.bcdBases.mtb[module].name]; WriteString[" was never placed in a code pack"L]; ErrorLog[class]; END; NoProcFromModuleInCP: PUBLIC PROC [ class: ErrorClass, module: BcdDefs.MTIndex, cpId: HashOps.HTIndex] = BEGIN Prefix[class]; WriteString["No procedure from module "L]; WriteName[SourceBcd.bcdBases.mtb[module].name]; WriteString[" was placed in code pack "L]; WriteHti[cpId]; ErrorLog[class]; END; EmptyCodePack: PUBLIC PROC [ class: ErrorClass, cpId: HashOps.HTIndex] = BEGIN Prefix[class]; WriteString["The code pack "L]; WriteHti[cpId]; WriteString[" is empty"L]; ErrorLog[class]; END; FrameInTwoFramePacks: PUBLIC PROC [ class: ErrorClass, module: BcdDefs.MTIndex, fpId1, fpId2: HashOps.HTIndex] = BEGIN Prefix[class]; WriteString["The global frame of module "L]; WriteName[SourceBcd.bcdBases.mtb[module].name]; WriteString[" is contained in two frame packs: "L]; WriteHti[fpId1]; WriteString[" and "L]; WriteHti[fpId2]; ErrorLog[class]; END; FrameNotPlaced: PUBLIC PROC [ class: ErrorClass, module: BcdDefs.MTIndex] = BEGIN Prefix[class]; WriteString["The global frame of module "L]; WriteName[SourceBcd.bcdBases.mtb[module].name]; WriteString[" was never placed in a frame pack"L]; ErrorLog[class]; END; EVNotFirst: PUBLIC PROC [ class: ErrorClass, module: BcdDefs.MTIndex] = BEGIN Prefix[class]; WriteString["A procedure or the catch code of module "L]; WriteName[SourceBcd.bcdBases.mtb[module].name]; WriteString[" appears before its entry vector"L]; ErrorLog[class]; END; EVInDiscardCodePack: PUBLIC PROC [ class: ErrorClass, module: BcdDefs.MTIndex] = BEGIN Prefix[class]; WriteString["The entry vector of module "L]; WriteName[SourceBcd.bcdBases.mtb[module].name]; WriteString[" appears in a discard code pack"L]; ErrorLog[class]; END; SegmentTooLarge: PUBLIC PROC [ class: ErrorClass, segId: String.SubString] = BEGIN Prefix[class]; WriteString["The code segment "L]; WriteSubString[segId]; WriteString[" is larger than 32K words"L]; ErrorLog[class]; END; END.