strings.mod 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. IMPLEMENTATION MODULE Strings;
  2. (* The descriptor's header holds the logical length; Assign/Concat
  3. update it (m2setlen), so Length reflects content, not capacity. *)
  4. PROCEDURE m2setlen(VAR s : ARRAY OF CHAR; n : INTEGER);
  5. EXTERNAL;
  6. PROCEDURE Length(VAR s : ARRAY OF CHAR) : INTEGER;
  7. BEGIN
  8. RETURN LEN(s)
  9. END Length;
  10. PROCEDURE Assign(VAR src, dst : ARRAY OF CHAR);
  11. VAR i, n, cap : INTEGER;
  12. BEGIN
  13. n := LEN(src);
  14. cap := LEN(dst);
  15. IF n > cap THEN n := cap END;
  16. i := 0;
  17. WHILE i < n DO
  18. dst[i] := src[i];
  19. i := i + 1
  20. END;
  21. m2setlen(dst, n)
  22. END Assign;
  23. PROCEDURE Delete(VAR s : ARRAY OF CHAR; start, count : INTEGER);
  24. VAR n, i : INTEGER;
  25. BEGIN
  26. n := LEN(s);
  27. IF start < 0 THEN start := 0 END;
  28. IF start > n THEN start := n END;
  29. IF count < 0 THEN count := 0 END;
  30. IF start + count > n THEN count := n - start END;
  31. i := start;
  32. WHILE i + count < n DO
  33. s[i] := s[i + count];
  34. i := i + 1
  35. END;
  36. m2setlen(s, n - count)
  37. END Delete;
  38. PROCEDURE Append(VAR src, dst : ARRAY OF CHAR);
  39. VAR n, m, i : INTEGER;
  40. BEGIN
  41. n := LEN(dst);
  42. m := LEN(src);
  43. i := 0;
  44. WHILE i < m DO
  45. dst[n + i] := src[i];
  46. i := i + 1
  47. END;
  48. m2setlen(dst, n + m)
  49. END Append;
  50. PROCEDURE Copy(VAR src, dst : ARRAY OF CHAR);
  51. BEGIN
  52. Assign(src, dst)
  53. END Copy;
  54. PROCEDURE Concat(VAR s1, s2 : ARRAY OF CHAR; VAR dst : ARRAY OF CHAR);
  55. VAR i, n1, n2, cap : INTEGER;
  56. BEGIN
  57. n1 := LEN(s1);
  58. n2 := LEN(s2);
  59. cap := LEN(dst);
  60. IF n1 + n2 > cap THEN
  61. n1 := cap - n2;
  62. IF n1 < 0 THEN n1 := 0 END
  63. END;
  64. i := 0;
  65. WHILE i < n1 DO
  66. dst[i] := s1[i];
  67. i := i + 1
  68. END;
  69. i := 0;
  70. WHILE i < n2 DO
  71. dst[n1 + i] := s2[i];
  72. i := i + 1
  73. END;
  74. m2setlen(dst, n1 + n2)
  75. END Concat;
  76. PROCEDURE Compare(VAR s1, s2 : ARRAY OF CHAR) : INTEGER;
  77. VAR i, n1, n2, n : INTEGER;
  78. BEGIN
  79. n1 := LEN(s1);
  80. n2 := LEN(s2);
  81. n := n1;
  82. IF n2 < n THEN n := n2 END;
  83. i := 0;
  84. WHILE i < n DO
  85. IF s1[i] < s2[i] THEN RETURN -1
  86. ELSIF s1[i] > s2[i] THEN RETURN 1
  87. END;
  88. i := i + 1
  89. END;
  90. IF n1 < n2 THEN RETURN -1
  91. ELSIF n1 > n2 THEN RETURN 1
  92. END;
  93. RETURN 0
  94. END Compare;
  95. END Strings.