-- StmtMapXD.Mesa
-- Edited by:
-- Sandman on July 21, 1980 4:00 PM
-- Bruce on Oct 10, 1980 8:22 PM
-- Sweet on May 19, 1980 4:32 PM
DIRECTORY
Ascii USING [ControlZ, CR],
DOutput USING [Char, EOL, Text],
Inline USING [HighHalf, LowHalf],
SegmentDefs USING [GetFileTimes],
Source USING [Handle],
StreamDefs USING [GetPosition, SetPosition, StreamHandle, StreamPosition];
StmtMapXD: PROGRAM
IMPORTS DOutput, Inline, SegmentDefs, StreamDefs
EXPORTS Source =
BEGIN
BadSource: SIGNAL [sh: Source.Handle] = CODE;
TooLong: ERROR = CODE;
GetCreateDate: PUBLIC PROC [sh: Source.Handle] RETURNS [LONG CARDINAL] =
BEGIN
WITH LOOPHOLE[sh, StreamDefs.StreamHandle] SELECT FROM
Disk => RETURN[SegmentDefs.GetFileTimes[file].create];
ENDCASE => ERROR BadSource[sh];
END;
PrintTextLine: PUBLIC PROC [sh: Source.Handle, i: CARDINAL]
RETURNS [index: CARDINAL] =
BEGIN OPEN StreamDefs;
current, start, lineIndex: StreamPosition;
char: CHARACTER;
n: [1..100];
WITH LOOPHOLE[sh, StreamDefs.StreamHandle] SELECT FROM
Disk => NULL;
ENDCASE => RETURN;
DOutput.EOL[];
current ← start ← lineIndex ← i;
FOR n IN [1..100] UNTIL lineIndex = 0
DO
lineIndex ← lineIndex - 1;
SetPosition[sh, lineIndex];
IF sh.get[sh] = Ascii.CR THEN {start ← lineIndex + 1; EXIT};
ENDLOOP;
FOR n IN [1..100] WHILE ~sh.endof[sh]
DO
SELECT (char ← sh.get[sh]) FROM
Ascii.CR, Ascii.ControlZ => EXIT;
ENDCASE =>
BEGIN
DOutput.Char[char];
IF GetPosition[sh] = current THEN DOutput.Text["<>"L];
END;
ENDLOOP;
DOutput.EOL[];
RETURN[Half[start]];
END;
Half: PROC [lc: LONG CARDINAL] RETURNS [CARDINAL] = INLINE
BEGIN
IF Inline.HighHalf[lc] # 0 THEN ERROR TooLong;
RETURN[Inline.LowHalf[lc]]
END;
END.