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