-- 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.