strings.mod 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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 Copy(VAR src, dst : ARRAY OF CHAR);
  24. BEGIN
  25. Assign(src, dst)
  26. END Copy;
  27. PROCEDURE Concat(VAR s1, s2 : ARRAY OF CHAR; VAR dst : ARRAY OF CHAR);
  28. VAR i, n1, n2, cap : INTEGER;
  29. BEGIN
  30. n1 := LEN(s1);
  31. n2 := LEN(s2);
  32. cap := LEN(dst);
  33. IF n1 + n2 > cap THEN
  34. n1 := cap - n2;
  35. IF n1 < 0 THEN n1 := 0 END
  36. END;
  37. i := 0;
  38. WHILE i < n1 DO
  39. dst[i] := s1[i];
  40. i := i + 1
  41. END;
  42. i := 0;
  43. WHILE i < n2 DO
  44. dst[n1 + i] := s2[i];
  45. i := i + 1
  46. END;
  47. m2setlen(dst, n1 + n2)
  48. END Concat;
  49. PROCEDURE Compare(VAR s1, s2 : ARRAY OF CHAR) : INTEGER;
  50. VAR i, n1, n2, n : INTEGER;
  51. BEGIN
  52. n1 := LEN(s1);
  53. n2 := LEN(s2);
  54. n := n1;
  55. IF n2 < n THEN n := n2 END;
  56. i := 0;
  57. WHILE i < n DO
  58. IF s1[i] < s2[i] THEN RETURN -1
  59. ELSIF s1[i] > s2[i] THEN RETURN 1
  60. END;
  61. i := i + 1
  62. END;
  63. IF n1 < n2 THEN RETURN -1
  64. ELSIF n1 > n2 THEN RETURN 1
  65. END;
  66. RETURN 0
  67. END Compare;
  68. END Strings.