TextBuf.mod 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. IMPLEMENTATION MODULE TextBuf ;
  2. VAR
  3. buf : ARRAY [0..TextLimit] OF CHAR ; (* we use Indx as the stored length,
  4. no CR terminator needed *)
  5. used : CARDINAL ;
  6. (* The characters live in buf[0 .. used-1]. Lines end with CR. *)
  7. PROCEDURE Clear ;
  8. BEGIN
  9. used := 0
  10. END Clear ;
  11. PROCEDURE Length () : CARDINAL ;
  12. BEGIN
  13. RETURN used
  14. END Length ;
  15. PROCEDURE CharAt (i : CARDINAL) : CHAR ;
  16. BEGIN
  17. RETURN buf [i]
  18. END CharAt ;
  19. PROCEDURE InsertCh (i : CARDINAL ; ch : CHAR) ;
  20. VAR j : CARDINAL ;
  21. BEGIN
  22. IF used >= TextLimit THEN
  23. RETURN
  24. END ;
  25. IF i > used THEN
  26. i := used
  27. END ;
  28. j := used ;
  29. WHILE j > i DO
  30. buf [j] := buf [j - 1] ;
  31. DEC (j)
  32. END ;
  33. buf [i] := ch ;
  34. INC (used)
  35. END InsertCh ;
  36. PROCEDURE OverwriteCh (i : CARDINAL ; ch : CHAR) ;
  37. BEGIN
  38. IF i < used THEN
  39. buf [i] := ch
  40. ELSE
  41. InsertCh (i, ch)
  42. END
  43. END OverwriteCh ;
  44. PROCEDURE DeleteAt (i : CARDINAL) ;
  45. VAR j : CARDINAL ;
  46. BEGIN
  47. IF i >= used THEN
  48. RETURN
  49. END ;
  50. j := i ;
  51. WHILE j < used - 1 DO
  52. buf [j] := buf [j + 1] ;
  53. INC (j)
  54. END ;
  55. DEC (used)
  56. END DeleteAt ;
  57. PROCEDURE DeleteFromTo (i, n : CARDINAL) ;
  58. VAR j : CARDINAL ;
  59. BEGIN
  60. IF i >= used THEN
  61. RETURN
  62. END ;
  63. IF i + n > used THEN
  64. n := used - i
  65. END ;
  66. j := i ;
  67. WHILE j + n < used DO
  68. buf [j] := buf [j + n] ;
  69. INC (j)
  70. END ;
  71. DEC (used, n)
  72. END DeleteFromTo ;
  73. BEGIN
  74. used := 0
  75. END TextBuf.