
(*

  (*$L+ ab hier alles LINK ON!*)

VAR buffer: ARRAY [0..257] OF CHAR;
    start, end: CARDINAL;

PROCEDURE readBuffer;
  VAR p: CARDINAL;
  BEGIN
    ASSEMBLER
        MOVE.L  #buffer,(A3)+
        MOVE    IOConfig.LengthOfBufferedLine,D0
        CMPI    #255,D0
        BLS     lok
        MOVE    #255,D0
      lok:
        MOVE    D0,(A3)+
        JSR     ReadLine
    END;
    IF Done THEN
      p:= Strings.Length(buffer);
      buffer[p]:= CHR(13);
      INC(p);
      buffer[p]:= CHR(0);
    ELSE
      p:= 0
    END;
    end:= p; start:= 0;
  END readBuffer;

PROCEDURE skipSep;
  BEGIN
    WHILE (start < end) AND (buffer[start] IN IOConfig.Separators) DO INC(start) END
  END skipSep;

PROCEDURE ReadLn;
  BEGIN
    start:= end;
    Done:= TRUE
  END ReadLn;

PROCEDURE ReadToken (VAR s: ARRAY OF CHAR);
  VAR i: CARDINAL;
  BEGIN
    REPEAT
      (*!!! hier keinen Puffer sondern direkte Eingabe!*)
      IF start >= end THEN readBuffer END;
      IF NOT Done THEN RETURN END;
      skipSep;
      i:= 0;
      WHILE (start<end)
      AND (i<=HIGH (s))
      AND NOT (buffer[start] IN IOConfig.Separators) DO
        s[i]:= buffer[start];
        INC(start);
        INC(i);
      END;
      IF i <= HIGH (s) THEN s[i]:= CHR(0); END;
    UNTIL s[0] # CHR(0);
  END ReadToken;

PROCEDURE ReadBufChar (VAR ch: CHAR);
  BEGIN
    IF start >= end THEN readBuffer END;
    IF Done THEN
      ch:= buffer [start];
      INC (start);
    ELSE
      ch:= 0C
    END;
  END ReadBufChar;


PROCEDURE EndOfRead(skip: BOOLEAN): BOOLEAN;
  BEGIN
    IF IOConfig.ReadStringByLine THEN
      RETURN TRUE
    ELSE
      IF skip THEN
        skipSep;
      END;
      RETURN start = end
    END
  END EndOfRead;

PROCEDURE ReadAgain (VAR ch: CHAR);
  BEGIN
    IF IOConfig.ReadStringByLine THEN
      HALT; (*!!!readLast:= TRUE;*)
      Done:= TRUE
    ELSE
      Done:= start > 0;
      IF Done THEN
        DEC (start)
      END
    END
  END ReadAgain;
*)
