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