TextBuf.mod 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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 InsertStr (i : CARDINAL ; VAR s : ARRAY OF CHAR ; n : CARDINAL) : BOOLEAN ;
  37. VAR j : CARDINAL ;
  38. BEGIN
  39. IF used + n > TextLimit THEN
  40. RETURN FALSE
  41. END ;
  42. IF i > used THEN
  43. i := used
  44. END ;
  45. (* move the tail right by n, from the back so nothing is overwritten *)
  46. j := used ;
  47. WHILE j > i DO
  48. buf [j - 1 + n] := buf [j - 1] ;
  49. DEC (j)
  50. END ;
  51. j := 0 ;
  52. WHILE j < n DO
  53. buf [i + j] := s [j] ;
  54. INC (j)
  55. END ;
  56. INC (used, n) ;
  57. RETURN TRUE
  58. END InsertStr ;
  59. PROCEDURE OverwriteCh (i : CARDINAL ; ch : CHAR) ;
  60. BEGIN
  61. IF i < used THEN
  62. buf [i] := ch
  63. ELSE
  64. InsertCh (i, ch)
  65. END
  66. END OverwriteCh ;
  67. PROCEDURE DeleteAt (i : CARDINAL) ;
  68. VAR j : CARDINAL ;
  69. BEGIN
  70. IF i >= used THEN
  71. RETURN
  72. END ;
  73. j := i ;
  74. WHILE j < used - 1 DO
  75. buf [j] := buf [j + 1] ;
  76. INC (j)
  77. END ;
  78. DEC (used)
  79. END DeleteAt ;
  80. PROCEDURE DeleteFromTo (i, n : CARDINAL) ;
  81. VAR j : CARDINAL ;
  82. BEGIN
  83. IF i >= used THEN
  84. RETURN
  85. END ;
  86. IF i + n > used THEN
  87. n := used - i
  88. END ;
  89. j := i ;
  90. WHILE j + n < used DO
  91. buf [j] := buf [j + n] ;
  92. INC (j)
  93. END ;
  94. DEC (used, n)
  95. END DeleteFromTo ;
  96. BEGIN
  97. used := 0
  98. END TextBuf.