<> <> <> <<>> DIRECTORY BasicTime USING [GMT, MonthOfYear, Now, Unpack, Unpacked], Convert USING [AppendCard], IO, PrintingP4V3 USING [RequestID], RefText USING [AppendChar, AppendRope, ObtainScratch, ReleaseScratch], Rope USING [FromRefText, ROPE], XNSPSMessages; XNSPSMessagesImpl: CEDAR MONITOR IMPORTS BasicTime, Convert, IO, RefText, Rope EXPORTS XNSPSMessages ~ BEGIN OPEN PrintingP4V3; ROPE: TYPE = Rope.ROPE; STREAM: TYPE ~ IO.STREAM; LogMessage: PUBLIC ENTRY PROC [message: ROPE, request: RequestID _ ALL[0]] = { InternalLogMessage[message, request]; }; MsgList: TYPE ~ REF MsgListRep; MsgListRep: TYPE ~ RECORD [ next: MsgList _ NIL, msg: ROPE _ NIL]; msgHead: MsgList _ NIL; msgTail: MsgList _ NIL; msgCnt: CARDINAL _ 0; serverStream: IO.STREAM _ NIL; RegisterTTY: PUBLIC ENTRY PROC [stream: IO.STREAM] = {serverStream _ stream}; InternalLogMessage: INTERNAL PROC [message: ROPE, request: RequestID _ ALL[0]] = { md: MACHINE DEPENDENT RECORD [lo, hi: CARDINAL]; scratch: REF TEXT ~ RefText.ObtainScratch[100]; text: REF TEXT _ scratch; msg: ROPE _ NIL; IF msgHead = NIL THEN msgHead _ msgTail _ NEW[MsgListRep] ELSE {msgTail.next _ NEW[MsgListRep]; msgTail _ msgTail.next}; text _ TimeToRefText[BasicTime.Now[], text]; text _ RefText.AppendChar[text, ' ]; IF request # ALL[0] THEN { md.lo _ request[4]; md.hi _ request[3]; text _ RefText.AppendChar[text, 'R]; text _ RefText.AppendChar[text, '#]; text _ Convert.AppendCard[to: text, from: LOOPHOLE[md]]; text _ RefText.AppendChar[text, ' ]; }; text _ RefText.AppendChar[text, '\t]; text _ RefText.AppendRope[text, message]; text _ RefText.AppendChar[text, '\n]; msg _ Rope.FromRefText[text]; msgTail.msg _ msg; msgCnt _ msgCnt + 1; IF serverStream # NIL THEN {IO.PutRope[serverStream, msg]; IO.Flush[serverStream]}; IF msgCnt > 150 THEN BEGIN IF msgHead.next = NIL THEN {msgCnt _ 1; RETURN}; msgCnt _ msgCnt - 1; msgHead _ msgHead.next; END; RefText.ReleaseScratch[scratch]; }; monthName: ARRAY BasicTime.MonthOfYear OF Rope.ROPE ~ ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "???"]; TimeToRefText: PROC [time: BasicTime.GMT, text: REF TEXT] RETURNS [t: REF TEXT] = BEGIN unpacked: BasicTime.Unpacked _ BasicTime.Unpack[time]; stream: IO.STREAM _ IO.TOS[text]; IO.PutF[stream, "%2g-%g-%02g ", IO.int[unpacked.day], IO.rope[monthName[unpacked.month]], IO.int[unpacked.year MOD 100]]; IO.PutF[stream, "%2g:%02g:%02g", IO.int[unpacked.hour], IO.int[unpacked.minute], IO.int[unpacked.second]]; t _ IO.TextFromTOS[stream]; END; EnumerateMessages: PUBLIC PROC [action: PROC[message: ROPE] RETURNS [continue: BOOLEAN]] = BEGIN myTail: MsgList _ msgHead; DO IF myTail = NIL THEN RETURN; IF NOT action[myTail.msg] THEN RETURN; myTail _ myTail.next; ENDLOOP; END; END.