-- File: [Cherry]System>C03>spErrors.mesa -- Last editted: -- Wilhelm March 30, 1982 8:36 AM, reformated by Barth and stored under -- [Cherry]Thyme>1.97> . DIRECTORY spGlobals, CWF, IODefs, StreamDefs, StringDefs; spErrors: PROGRAM IMPORTS spGlobals, CWF, StreamDefs, StringDefs EXPORTS spGlobals = BEGIN OPEN spGlobals; ErrorSignal: PUBLIC SIGNAL[error: CARDINAL, s: LONG STRING] = CODE; errCount: CARDINAL _ 0; errMsgFile: StreamDefs.StreamHandle _ NIL; triedOnce: BOOLEAN _ FALSE; AnyErrors: PUBLIC PROCEDURE RETURNS[BOOLEAN] = BEGIN RETURN[errCount > 0] END; printError: PROCEDURE[err: CARDINAL, warning: BOOLEAN _ FALSE] = BEGIN errMsg: STRING = [256]; char: CHARACTER; number: CARDINAL _ 0; nonBlank: BOOLEAN; first: CARDINAL; IF errMsgFile = NIL AND ~triedOnce THEN BEGIN ENABLE StreamDefs.FileNameError => BEGIN printSysWindow["Can't open thyme.errors."]; errMsgFile _ NIL; triedOnce _ TRUE; GO TO out END; errMsgFile _ StreamDefs.NewByteStream["thyme.errors", StreamDefs.Read] EXITS out => NULL END; errMsg.length _ 0; IF warning THEN BEGIN first _ 8; StringDefs.AppendString[errMsg, "Warning "] END ELSE BEGIN errCount _ errCount + 1; first _ 6; StringDefs.AppendString[errMsg, "Error "] END; IF errMsgFile # NIL THEN BEGIN errMsgFile.reset[errMsgFile]; UNTIL number = err OR errMsgFile.endof[errMsgFile] DO errMsg.length _ first; char _ ' ; nonBlank _ FALSE; UNTIL char = IODefs.CR OR errMsgFile.endof[errMsgFile] DO char _ errMsgFile.get[errMsgFile]; IF (char = ' OR char = IODefs.TAB)AND ~nonBlank THEN LOOP ELSE nonBlank _ TRUE; errMsg[errMsg.length] _ char; errMsg.length _ errMsg.length + 1 ENDLOOP; number _ 0; FOR index: CARDINAL IN [first..errMsg.length) DO char _ errMsg[index]; IF char IN ['0..'9] THEN number _ number*10 + (char - '0) ELSE EXIT ENDLOOP ENDLOOP END; IF errMsgFile = NIL OR number # err THEN CWF.SWF1[errMsg, "Error %d.*n", @err]; printSysWindow[errMsg]; END; ErrorAtNB: PUBLIC PROCEDURE[err: CARDINAL, n: nodePtr, b: branchPtr]= BEGIN printSysWindow[makeStringNB[n, b, FALSE]]; printError[err] END; ErrorStrings: PUBLIC PROCEDURE[err: CARDINAL, s1, s2: LONG STRING] = BEGIN errLine: STRING = [256]; IF s2 = NIL THEN CWF.SWF1[errLine, "%s", s1] ELSE CWF.SWF2[errLine, "%s at %s", s1, s2]; printSysWindow[errLine]; printError[err] END; error: PUBLIC PROCEDURE[err: CARDINAL, skip, warning: BOOLEAN _ FALSE] = BEGIN i, cptr: CARDINAL; errLine: STRING = [256]; line: STRING; [line, cptr] _ GetLineAndCptr[]; IF cptr > 0 THEN cptr _ cptr - 1; FOR i IN [0..cptr) DO errLine[i] _ line[i] ENDLOOP; errLine[cptr] _ '<; errLine[cptr + 1] _ '>; FOR i IN [cptr..line.length) DO errLine[i + 2] _ line[i] ENDLOOP; errLine.length _ line.length + 2; IF errLine.length > 0 THEN IF errLine[errLine.length - 1] = IODefs.CR THEN errLine.length _ errLine.length - 1; printSysWindow[errLine]; printError[err, warning]; IF skip THEN UNTIL item = semi OR item = eof OR item = rightC OR item = leftC DO next[] ENDLOOP END; error2: PUBLIC PROCEDURE[err: CARDINAL, n: namePtr] = BEGIN errLine: STRING = [256]; CWF.SWF1[errLine, "%s", n^.name]; printSysWindow[errLine]; printError[err]; END; END.