-- Pupwatch: writing log file
-- [Indigo]<Grapevine>PupWatch>DiskLog.mesa
-- Andrew Birrell 23-Nov-81 14:42:03
DIRECTORY
Ascii USING[ CR, SP, TAB ],
LookerDefs USING[],
StreamDefs USING[ Append, DiskHandle, NewByteStream, WriteAppend ],
Time USING[ AppendCurrent ];
DiskLog: PROGRAM
IMPORTS StreamDefs, Time
EXPORTS LookerDefs =
BEGIN
lineLength: CARDINAL ← 0;
lineMaxlength: CARDINAL = 100;
firstChar: BOOLEAN ← TRUE;
DiskChar: PUBLIC PROC[c: CHARACTER] =
BEGIN
IF firstChar
THEN BEGIN
firstChar ← FALSE;
LogTime[];
END;
IF c = Ascii.CR
THEN { file.put[file,c]; lineLength ← 0 }
ELSE IF lineLength < lineMaxlength
THEN { file.put[file,c]; lineLength ← lineLength+1 };
END;
LogTime: PROC =
BEGIN
head: STRING = "Log written at "L;
s: STRING = [30];
Time.AppendCurrent[s];
DiskMultiple[DESCRIPTOR[@(head.text), head.length]];
DiskMultiple[DESCRIPTOR[@(s.text), s.length]]; DiskChar[Ascii.CR];
END;
DiskMultiple: PUBLIC PROC[desc: DESCRIPTOR FOR PACKED ARRAY OF CHARACTER] =
BEGIN
FOR i: CARDINAL IN [0..MIN[LENGTH[desc],lineMaxlength-lineLength])
DO c: CHARACTER ← desc[i];
IF c IN [40C..176C]
THEN DiskChar[c]
ELSE BEGIN
DiskChar['<];
IF c > 77C
THEN DiskChar['0+LOOPHOLE[c,CARDINAL]/100B];
IF c > 7C
THEN DiskChar['0+(LOOPHOLE[c,CARDINAL] MOD 100B)/10B];
DiskChar['0+LOOPHOLE[c,CARDINAL] MOD 10B];
DiskChar['>];
END;
ENDLOOP;
END;
DiskPos: PUBLIC PROC[pos: CARDINAL] =
BEGIN
IF lineLength = 0
THEN BEGIN
THROUGH [0..pos/8) DO file.put[file,Ascii.TAB] ENDLOOP;
THROUGH [0..pos MOD 8) DO file.put[file,Ascii.SP] ENDLOOP;
END
ELSE THROUGH [lineLength..pos) DO file.put[file,Ascii.SP] ENDLOOP;
lineLength ← MAX[lineLength, pos];
END;
DiskCommit: PUBLIC PROC =
BEGIN
DiskChar[Ascii.CR]; DiskChar[Ascii.CR];
file.destroy[file];
file ← StreamDefs.NewByteStream[
"PupWatch.log"L, StreamDefs.Append];
firstChar ← TRUE;
END;
file: StreamDefs.DiskHandle ← StreamDefs.NewByteStream[
"PupWatch.log"L, StreamDefs.WriteAppend];
END.