DIRECTORY FS USING [Error, StreamOpen], IO USING [CR, EndOf, GetChar, GetIndex, int, PutF, PutFR, rope, SetIndex, SP, STREAM, TAB], RefText USING [AppendChar, Fetch, Length, New], Rope USING [Concat, Fetch, FromRefText, Length, ROPE, Substr], ThymeGlobals USING [branchPtr, EchoInput, GetLineAndCptr, Handle, MakeStringNB, MsgTextsWithLook, namePtr, Next, nodePtr, PutMsgLine, WorkingDirectory]; ThymeErrors: CEDAR PROGRAM IMPORTS FS, IO, RefText, Rope, ThymeGlobals EXPORTS ThymeGlobals = BEGIN Handle: TYPE = ThymeGlobals.Handle; ErrorSignal: PUBLIC SIGNAL[error: NAT, s: Rope.ROPE]= CODE; ErrWarnSummary: PUBLIC PROC[handle: Handle]= { IF handle.vars.errCount + handle.vars.warnCount > 0 THEN { handle.msgStream.PutF["\n\t"]; IF handle.vars.errCount > 0 THEN { ThymeGlobals.MsgTextsWithLook[handle, "Total errors: ", 'b]; handle.msgStream.PutF["%d", IO.int[handle.vars.errCount]]; IF handle.vars.warnCount > 0 THEN handle.msgStream.PutF["; "] ELSE ThymeGlobals.PutMsgLine[handle, ".\n"]; }; IF handle.vars.warnCount > 0 THEN { ThymeGlobals.MsgTextsWithLook[handle, IF handle.vars.errCount > 0 THEN "total warnings: " ELSE "Total Warnings: ", 'b]; handle.msgStream.PutF["%d.\n", IO.int[handle.vars.warnCount]]; }; }; }; -- ErrWarnSummary PrintError: PROC[handle: Handle, err: NAT, warning: BOOL_ FALSE]= { OPEN handle.vars; errMsg: REF TEXT_ RefText.New[256]; tChar: CHAR; number: NAT_ 0; nonBlank: BOOL; IF thymeDotErrors=NIL AND ~triedOnce THEN { OPEN ThymeGlobals; thymeDotErrors _ FS.StreamOpen[Rope.Concat[WorkingDirectory[handle], "Thyme.errors"] !FS.Error => { thymeDotErrors _ FS.StreamOpen["/DATools/DATools7.0/Thyme/Thyme.errors" !FS.Error => { handle.msgStream.PutF[ "-- Thyme can't find the file \"Thyme.errors\" on your working directory or the Thyme release directory. You need the file to find out what the Error is.\n"]; thymeDotErrors_ NIL; triedOnce_ TRUE; CONTINUE; }; ]; CONTINUE; }; ]; IF thymeDotErrors # NIL THEN topOfMsgStream_ thymeDotErrors.GetIndex[]; }; handle.msgStream.PutF["\t\t"]; ThymeGlobals.MsgTextsWithLook[handle, "g", 'm]; ThymeGlobals.MsgTextsWithLook[handle, IF warning THEN " Warning " ELSE " Error ", 'b]; IF warning THEN warnCount_ warnCount + 1 ELSE errCount _ errCount + 1; IF thymeDotErrors # NIL THEN { thymeDotErrors.SetIndex[topOfMsgStream]; UNTIL number=err OR thymeDotErrors.EndOf[] DO errMsg.length _ 0; tChar _ IO.SP; nonBlank _ FALSE; UNTIL thymeDotErrors.EndOf[] DO tChar _ thymeDotErrors.GetChar[]; IF ~nonBlank THEN { IF tChar=IO.SP OR tChar=IO.TAB THEN LOOP ELSE nonBlank _ TRUE; }; IF tChar=IO.CR THEN EXIT; errMsg _ RefText.AppendChar[errMsg, tChar]; ENDLOOP; number _ 0; FOR index: INT IN [0..RefText.Length[errMsg]) DO tChar _ RefText.Fetch[errMsg, index]; IF tChar IN ['0..'9] THEN number _ number*10 + (tChar - '0) ELSE EXIT; ENDLOOP; ENDLOOP; }; IF thymeDotErrors=NIL OR number # err THEN handle.msgStream.PutF["%d.\n", IO.int[err]] ELSE handle.msgStream.PutF["%g.\n", IO.rope[Rope.FromRefText[errMsg]]]; }; -- PrintError ErrorAtNB: PUBLIC PROC[handle: Handle, err: NAT, n: ThymeGlobals.nodePtr, b: ThymeGlobals.branchPtr]= { handle.msgStream.PutF["%g", IO.rope[ ThymeGlobals.MakeStringNB[handle, n, b, FALSE]]]; PrintError[handle, err]; }; -- ErrorAtNB ErrorStrings: PUBLIC PROC[handle: Handle, err: NAT, s1, s2: Rope.ROPE]= { errLine: Rope.ROPE_ IF s2= NIL THEN IO.PutFR["%g", IO.rope[s1]] ELSE IO.PutFR["%g at %g", IO.rope[s1], IO.rope[s2]]; handle.msgStream.PutF["%g", IO.rope[errLine]]; PrintError[handle, err]; }; -- ErrorStrings Error: PUBLIC PROC[handle: Handle, err: NAT, skip, warning: BOOL_ FALSE]= { cptr, lastPos: INT; line: Rope.ROPE; noEcho: BOOL _ NOT ThymeGlobals.EchoInput[handle]; [line, cptr]_ ThymeGlobals.GetLineAndCptr[handle]; cptr_ MAX[0, cptr - 1]; lastPos_ MAX[0, line.Length[]-1]; IF line.Fetch[lastPos]=IO.CR AND lastPos > 0 THEN lastPos_ lastPos-1; handle.msgStream.PutF[IF noEcho THEN "\n%g" ELSE "%g", IO.rope[line.Substr[0, cptr]]]; ThymeGlobals.MsgTextsWithLook[handle, "8", 'm]; handle.msgStream.PutF["%g\n", IO.rope[line.Substr[cptr, lastPos-cptr+1]]]; PrintError[handle, err, warning]; IF NOT ThymeGlobals.EchoInput[handle] THEN handle.msgStream.PutF["\t\tat [%g] in %g.\n", IO.int[handle.vars.inStream.GetIndex[] - line.Length[] + cptr - 1], IO.rope[handle.vars.fileNameStack[handle.vars.fileStackTop]] ]; IF skip THEN DO SELECT handle.vars.item FROM semi, eof, rightC, leftC => EXIT; ENDCASE; ThymeGlobals.Next[handle]; ENDLOOP; }; -- Error Error2: PUBLIC PROC[handle: Handle, err: NAT, n: ThymeGlobals.namePtr]= { errLine: Rope.ROPE _ IO.PutFR["%g", IO.rope[n.name]]; handle.msgStream.PutF["%g", IO.rope[errLine]]; PrintError[handle, err]; }; -- Error2 END. CHANGE LOG Wilhelm, March 30, 1982 8:36 AM Barth, 7-May-82 10:50:38 PDT Chen, June 11, 1984 7:13:37 pm PDT, cedarized. Chen, July 22, 1985 8:03:18 pm PDT, => Cedar6.0. ThymeErrors.mesa Copyright (C) 1985 by Xerox Corporation. All rights reserved. Last Edited by: Barth, July 8, 1988 1:20:06 pm PDT Christian LeCocq January 23, 1987 4:21:28 pm PST Pradeep Sindhu March 19, 1986 9:49:32 pm PST Sweetsun Chen, September 18, 1985 9:17:35 pm PDT try to open Thyme.errors once set leading word (Warning or Error) and increment errCount if it's an Error. (Current Cedar PutF doesn't seem to support %l.) handle.msgStream.PutF["\t%l8%l ", IO.rope["m"], IO.rope["M"]]; handle.msgStream.PutF[IF warning THEN "%lWarning%l " ELSE "%lError%l ", IO.rope["b"], IO.rope["B"]]; search for the right line in the whole file. get a line of Error message from thyme.errors, skipping leading blanks. parse the number, if any loop if number # err and not eof proc name not right. will be makeRopeNB or something better ... handle.msgStream.PutF["%g%l38%l%g\n", IO.rope[line.Substr[0, cptr]], IO.rope["m"], IO.rope["M"], IO.rope[line.Substr[cptr, lastPos-cptr]], ]; (Cedar5.2 doesn't seem to support PutF to change looks.) Κ>–"mycedar" style˜Icode–"mycedar" stylešœ™Kšœ>™>–"mycedar" style™K–"mycedar" style™"K–"mycedar" style™0K–"mycedar" stylešœ)Οk™,K–"mycedar" stylešœ-™0—K–"mycedar" style˜–"mycedar" styleš ˜ K–"mycedar" stylešœœ˜K–"mycedar" styleš œœœ>œœœ˜[K–"mycedar" stylešœœ"˜/K–"mycedar" stylešœœ&œ ˜>K–"mycedar" stylešœ œ†˜˜—K–"mycedar" style˜–"mycedar" stylešΟn œœ˜–"mycedar" styleš˜K–"mycedar" stylešœ˜K–"mycedar" stylešœ˜K–"mycedar" stylešœ˜K–"mycedar" stylešœ˜K–"mycedar" stylešœ ˜ —–"mycedar" styleš˜K–"mycedar" stylešœ ˜ —K–"mycedar" style˜—K–"mycedar" stylešœ˜K–"mycedar" style˜K–"mycedar" stylešœœ˜#–"mycedar" styleš ž œœœœ œœ˜;K–"mycedar" style˜—šžœœœ˜.šœ2œ˜:K˜šœœ˜"Kšœ<˜K˜—Kšœ˜—KšœΟc˜K˜—–"mycedar" styleš ž œœœ œœ˜CK–"mycedar" stylešœ ˜K–"mycedar" stylešœœœ˜#K–"mycedar" stylešœœ˜ K–"mycedar" stylešœœ˜K–"mycedar" stylešœ œ˜K–"mycedar" stylešœ™–"mycedar" stylešœœœ œ˜+K–"mycedar" stylešœ˜–"mycedar" stylešœœA˜T–"mycedar" stylešœœ ˜–"mycedar" stylešœœ4˜G–"mycedar" stylešœœ ˜K–"mycedar" stylešœ˜K–"mycedar" stylešΟfœ˜ œ˜žK–"mycedar" stylešœœ˜K–"mycedar" stylešœ œ˜K–"mycedar" stylešœ˜ K–"mycedar" stylešœ˜—K–"mycedar" stylešœ˜—K–"mycedar" stylešœ˜ K–"mycedar" stylešœ˜—K–"mycedar" stylešœ˜—K–"mycedar" stylešœœœ+˜GK–"mycedar" stylešœ˜—–"mycedar" stylešœL™LK–"mycedar" stylešœ0™0K–"mycedar" stylešœ"œ œ ™>–"mycedar" stylešœœ œœ™GK–"mycedar" stylešœ œ ™——K–"mycedar" stylešœ˜K–"mycedar" stylešœ/˜/K–"mycedar" stylešœ&œ œ œ˜VK–"mycedar" stylešœ œœ˜FK–"mycedar" stylešœ,™,–"mycedar" stylešœœœ˜K–"mycedar" stylešœ(˜(–"mycedar" stylešœ œ˜-K–"mycedar" stylešœ˜K–"mycedar" stylešœœœ˜K–"mycedar" stylešœ œ˜K–"mycedar" stylešœG™G–"mycedar" stylešœ˜K–"mycedar" stylešœ!˜!–"mycedar" stylešœ œ˜K–"mycedar" stylešœœœœœœœ˜(K–"mycedar" stylešœ œ˜K–"mycedar" stylešœ˜—K–"mycedar" styleš œœœœœ˜K–"mycedar" stylešœ+˜+K–"mycedar" stylešœ˜—K–"mycedar" stylešœ™K–"mycedar" stylešœ ˜ –"mycedar" stylešœœœ˜0K–"mycedar" stylešœ%˜%K–"mycedar" stylešœœ œ"˜;K–"mycedar" stylešœœ˜ K–"mycedar" stylešœ˜—K–"mycedar" stylešœ ™ K–"mycedar" stylešœ˜—K–"mycedar" stylešœ˜—K–"mycedar" styleš œœœœ œ ˜VK–"mycedar" stylešœ œ"˜HK–"mycedar" stylešœŸ ˜—K–"mycedar" style˜–"mycedar" stylešž œœœœ˜0K–"mycedar" stylešœ6˜6–"mycedar" stylešœœ/œ˜VK–"mycedar" stylešœ?™?—K–"mycedar" stylešœ˜K–"mycedar" stylešœŸ ˜—K–"mycedar" style˜–"mycedar" styleš ž œœœœœ˜IK–"mycedar" styleš œœœœœœ œ ˜?K–"mycedar" stylešœœœ œ ˜4K–"mycedar" stylešœœ˜.K–"mycedar" stylešœ˜K–"mycedar" stylešœŸ˜—K–"mycedar" style˜–"mycedar" styleš žœœœœœœ˜KK–"mycedar" stylešœœ˜K–"mycedar" stylešœ œ˜K–"mycedar" stylešœœœ ˜2K–"mycedar" stylešœ2˜2K–"mycedar" stylešœœ˜K–"mycedar" stylešœ œ˜!K–"mycedar" styleš œœœœ œ˜E–"mycedar" stylešœ%™%K–"mycedar" stylešœ™K–"mycedar" stylešœ ™ K–"mycedar" stylešœ ™ K–"mycedar" stylešœ'™)K–"mycedar" stylešœ™—K–"mycedar" stylešœ8™8K–"mycedar" styleš œœœœœ˜VKšœ/˜/K–"mycedar" stylešœœ+˜KK–"mycedar" stylešœ!˜!–"mycedar" stylešœœ œ/˜YK–"mycedar" stylešœA˜CK–"mycedar" stylešœ:˜