(* Copyright (C) 1989, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* Last modified on Fri Apr 6 10:18:34 1990 by muller *) MODULE TextRd; IMPORT Rd, RdClass, Text; FROM Thread IMPORT Alerted; FROM Rd IMPORT Failure, Error; REVEAL T = Rd.T BRANDED "TextRd.T version 0.0" OBJECT text: Text.T; len: INTEGER; END; CONST BuffSize = 500; PROCEDURE New (t: Text.T): T = BEGIN RETURN (NEW (T, st := 0, lo := 0, cur := 0, hi := 0, buff := NEW (REF ARRAY OF CHAR , BuffSize), closed := FALSE, seekable := FALSE, intermittent := TRUE, seek := Seek, length := Length, close := Close, text := t, len := Text.Length (t))); END New; PROCEDURE Seek (rd: T; <*UNUSED*> dontBlock: BOOLEAN): RdClass.SeekResult RAISES {Failure, Alerted, Error} = VAR thisTime: INTEGER; BEGIN IF rd.cur # rd.hi THEN RAISE Failure ("Impossible! A bug in Rd or TextRd"); END; IF rd.len <= rd.cur THEN RETURN RdClass.SeekResult.Eof; END; thisTime := MIN (NUMBER (rd.buff^), rd.len); Text.SetChars (rd.buff^, Text.Sub (rd.text, rd.cur, thisTime)); rd.lo := rd.cur; rd.hi := rd.lo + thisTime; RETURN RdClass.SeekResult.Ready; END Seek; PROCEDURE Length (rd: T): CARDINAL RAISES {Failure, Alerted, Error} = BEGIN RETURN Text.Length (rd.text); END Length; PROCEDURE Close (rd: T) RAISES {Failure, Alerted, Error} = BEGIN rd.buff := NIL; rd.text := NIL; END Close; BEGIN END TextRd.