<> <> <> <> <> <> <> <<>> <> <> <> <> <> <> <> <> <> <> <> <<[runs, index] _ LooksReader.Position[reader];>> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> <> DIRECTORY RunReader USING [Ref], TextLooks USING [Looks, noLooks, Runs]; LooksReader: CEDAR DEFINITIONS = BEGIN Looks: TYPE = TextLooks.Looks; noLooks: Looks = TextLooks.noLooks; Runs: TYPE = TextLooks.Runs; Ref: TYPE = REF Body; Body: TYPE = PRIVATE RECORD [ rem: INTEGER, -- remainder of current run len: NAT, -- length of current run looks: Looks, -- looks for current run runreader: RunReader.Ref -- reader for runs ]; Create: PROC [] RETURNS [Ref]; <> SetPosition: PROC [reader: Ref, runs: Runs, index: INT _ 0]; <> SetIndex: PROC [reader: Ref, index: INT _ 0]; BackupIndex: PROC [reader: Ref, amount: INT]; BumpIndex: PROC [reader: Ref, amount: INT]; Position: PROC [reader: Ref] RETURNS [runs: Runs, index: INT]; <> GetRuns: PROC [reader: Ref] RETURNS [Runs]; GetIndex: PROC [reader: Ref] RETURNS [index: INT]; Get: PROC [reader: Ref] RETURNS [Looks]; InlineGet: PROC [reader: Ref] RETURNS [Looks] ~ INLINE { IF (reader.rem_reader.rem-1) >= 0 THEN RETURN[reader.looks]; reader.rem_reader.rem+1; RETURN[Get[reader]]; }; Backwards: PROC [reader: Ref] RETURNS [Looks]; Peek: PROC [reader: Ref] RETURNS [Looks]; PeekBackwards: PROC [reader: Ref] RETURNS [Looks]; <<>> <> <> <> <> <> GetLooksReader: PROC RETURNS [Ref]; FreeLooksReader: PROC[Ref]; END.