// SpruceError.Bcpl -- Error Management Routines // Not in SpruceUtilsRes because of cross reference/cond. comp. conflicts get "Spruce.D" get "SpruceFiles.D" compileif newname SpruceSw then [ manifest [ SpruceSw = true ] ] manifest SprintSw = not SpruceSw // defined here external [ GetTime Scream SpruceCondition SpruceError ] // incoming procedures external [ // OS GotoFrame MoveBlock MyFrame StartIO // SpruceUtils Comment DoBreakPage FindErrorMessage FSGetRelease // SpruceUtilsRes IsOverlayPresent Min SwapSystem Umax // SpruceUser Post // SpruceMl Usc ] // Incoming statics external [ BandFile DebugSystem errorPending outMsg numComments numMustPrint numPrinted printDoc printing reasonVec spooling Verbose ] let SpruceCondition(code, condition, p1, p2, p3, p4) be [ compiletest SprintSw ifso [ // Sprint let serious = condition > ECContinue if errorPending then [ unless serious return // ignore if worse error already pending // ~~ caution: if printer status is also bad, that will not be recorded this time!! GotoFrame(errorPending, 0) ] // Avoid recursive errors! let tests = conditionĬ let sF = p1>>SS.spruceFile switchon tests into [ default: endcase case ECTestRead: case ECTestBoth: if sF>>SPruceFile.fileCode ge FILEPress docase -1 if tests eq ECTestRead endcase case ECTestWrite: unless sF eq BandFile endcase case -1: condition = ECFileTerminate // not as fatal code = code+1 // switch to more specific wording ] condition = conditionM // throw out demotion requests if (condition eq ECWarning) & (not Verbose) return errorPending = MyFrame() // context to return to outMsg>>TOSpoolerMsg.inProgressCode = // ~~ note use of printDoc static here printDoc>>DocG.PressFile>>SPruceFile.fileCode MoveBlock(lv outMsg>>TOSpoolerMsg.completionCode, lv code, 6) let cond = condition; condition = code if (DebugSystemϨ) eq 0 & (cond eq ECFatal % (DebugSystem&4) ne 0) then (table [ #77403; #1401 ])("Spruce.Errors", lv condition) let str = vec 50 if cond le ECFileTerminate & IsOverlayPresent(OVInterpret) then [ FSGetRelease(0) // be sure there's enough space if (serious % numComments < maxComments) & FindErrorMessage(lv condition, str, 50, serious) then Comment(str, serious) // DoBreakPage returns on completion or error if cond eq ECFileTerminate then [ numMustPrint = Umax(numMustPrint, numPrinted+1); DoBreakPage() ] ] errorPending = false if serious then SwapSystem(cond eq ECEngineTerminate) // if param true, can continue on return ] ifnot [ // Spruce if condition eq ECSpoolTerminate then // post, shut down activities, return [ let str = vec lenErrStr condition = code; FindErrorMessage(lv condition, str, lenErrStr) Post(0, ECSpoolTerminate, str) if spooling then MoveBlock(reasonVec, str, str>>STR.length/2+1) spooling, printing = false, false unless (DebugSystemྠ) ne 0 return ] condition = code; (table [ #77403; #1401 ])("Spruce.Errors", lv condition) ] ] and SpruceError(code, p1, p2, p3, p4) be SpruceCondition(code, ECFatal, p1, p2, p3, p4) and Scream(str) be SpruceError(102) and GetTime(ptr, ref; numargs n) = valof [ compileif false then [ let time=@#430; if n eq 1 then [ @ptr=time-@ptr ]; if n eq 2 then [ @ptr=@ptr+(time-ref) ] resultis time ] ] // DCS, January 21, 1978 12:09 AM, from SpruceUtils, // March 11, 1978 2:15 PM, reduce possibility of memory crash // May 15, 1978 8:08 PM, don't let warning prevent break page creation on serious error // May 15, 1978 9:57 PM, improve break page comment treatments. // September 1, 1978 10:17 AM, add special error handling of ECSpoolTerminate conditions // September 1, 1978 10:33 AM, remove Scream, SpruceTrap // September 1, 1978 1:30 PM, return Scream -- called from Scan // September 22, 1978 2:27 PM, include error code in message only if serious // August 6, 1979 4:51 PM, pass bin info back and forth //