IMPLEMENTATION MODULE TextBuf ; VAR buf : ARRAY [0..TextLimit] OF CHAR ; (* we use Indx as the stored length, no CR terminator needed *) used : CARDINAL ; (* The characters live in buf[0 .. used-1]. Lines end with CR. *) PROCEDURE Clear ; BEGIN used := 0 END Clear ; PROCEDURE Length () : CARDINAL ; BEGIN RETURN used END Length ; PROCEDURE CharAt (i : CARDINAL) : CHAR ; BEGIN RETURN buf [i] END CharAt ; PROCEDURE InsertCh (i : CARDINAL ; ch : CHAR) ; VAR j : CARDINAL ; BEGIN IF used >= TextLimit THEN RETURN END ; IF i > used THEN i := used END ; j := used ; WHILE j > i DO buf [j] := buf [j - 1] ; DEC (j) END ; buf [i] := ch ; INC (used) END InsertCh ; PROCEDURE OverwriteCh (i : CARDINAL ; ch : CHAR) ; BEGIN IF i < used THEN buf [i] := ch ELSE InsertCh (i, ch) END END OverwriteCh ; PROCEDURE DeleteAt (i : CARDINAL) ; VAR j : CARDINAL ; BEGIN IF i >= used THEN RETURN END ; j := i ; WHILE j < used - 1 DO buf [j] := buf [j + 1] ; INC (j) END ; DEC (used) END DeleteAt ; PROCEDURE DeleteFromTo (i, n : CARDINAL) ; VAR j : CARDINAL ; BEGIN IF i >= used THEN RETURN END ; IF i + n > used THEN n := used - i END ; j := i ; WHILE j + n < used DO buf [j] := buf [j + n] ; INC (j) END ; DEC (used, n) END DeleteFromTo ; BEGIN used := 0 END TextBuf.