M2STRING.MOD 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. IMPLEMENTATION MODULE M2Strings;
  2. (*
  3. * REPERTOIRE
  4. * Release 1.6
  5. * By Charles Bradford and Cole Brecheen
  6. * (c) Copyright 1985-1992 PMI
  7. * Green Bay, Wisconsin
  8. * All rights reserved
  9. * (414) 468-6040
  10. *
  11. * $Header: D:/logfiles/mods/m2string.mov 1.5 10 Mar 1991 15:29:14 coleb $
  12. *
  13. *)
  14. IMPORT LowLevel;
  15. IMPORT SYSTEM;
  16. IMPORT PosUtils;
  17. VAR
  18. Initialized : BOOLEAN;
  19. PROCEDURE Init();
  20. BEGIN
  21. IF Initialized THEN
  22. RETURN;
  23. ELSE
  24. Initialized := TRUE;
  25. END;
  26. LowLevel.Init();
  27. PosUtils.Init();
  28. END Init;
  29. PROCEDURE Assign(VAR source : ARRAY OF CHAR; VAR dest : ARRAY OF CHAR);
  30. VAR
  31. size1, size2 : CARDINAL;
  32. BEGIN
  33. size1 := HIGH(source)+1;
  34. size2 := HIGH(dest)+1;
  35. IF size1>=size2 THEN
  36. LowLevel.Move(SYSTEM.ADR(source), SYSTEM.ADR(dest), size2);
  37. ELSE
  38. LowLevel.Move(SYSTEM.ADR(source), SYSTEM.ADR(dest), size1);
  39. dest[size1] := 0C;
  40. END;
  41. END Assign;
  42. PROCEDURE Insert(substr : ARRAY OF CHAR; VAR str : ARRAY OF CHAR;
  43. inx : CARDINAL);
  44. VAR
  45. room, lngth1, size2 : CARDINAL;
  46. BEGIN
  47. lngth1 := Length(substr);
  48. IF (lngth1=0) OR (inx>HIGH(str)) THEN
  49. RETURN;
  50. END;
  51. size2 := HIGH(str)+1;
  52. room := size2-inx;
  53. LowLevel.ShiftArrayRight(SYSTEM.ADR(str[inx]), room, lngth1);
  54. IF lngth1>room THEN
  55. LowLevel.Move(SYSTEM.ADR(substr), SYSTEM.ADR(str[inx]), room);
  56. ELSE
  57. LowLevel.Move(SYSTEM.ADR(substr), SYSTEM.ADR(str[inx]), lngth1);
  58. END;
  59. END Insert;
  60. PROCEDURE Delete(VAR str : ARRAY OF CHAR; inx : CARDINAL; len :
  61. CARDINAL);
  62. VAR
  63. room, lngth : CARDINAL;
  64. BEGIN
  65. lngth := Length(str);
  66. IF (len=0) OR (inx>=lngth) THEN
  67. RETURN;
  68. END;
  69. room := lngth-inx;
  70. IF len>room THEN
  71. len := room;
  72. END;
  73. IF room>1 THEN
  74. LowLevel.ShiftArrayLeft(SYSTEM.ADR(str[inx]), room, len);
  75. END;
  76. str[lngth-len] := 0C;
  77. END Delete;
  78. PROCEDURE Pos(substr, str : ARRAY OF CHAR) : CARDINAL;
  79. BEGIN
  80. RETURN PosUtils.Pos(substr,str);
  81. END Pos;
  82. PROCEDURE Copy(str : ARRAY OF CHAR; inx : CARDINAL; len : CARDINAL;
  83. VAR result : ARRAY OF CHAR);
  84. VAR
  85. lngth1, size2, room : CARDINAL;
  86. BEGIN
  87. lngth1 := Length(str);
  88. size2 := HIGH(result)+1;
  89. result[0] := 0C;
  90. (*This sets result to null in case we return from the
  91. procedure in the next statement.*)
  92. IF (len=0) OR (inx>=lngth1) THEN
  93. RETURN;
  94. END;
  95. room := lngth1-inx;
  96. IF len>room THEN
  97. len := room;
  98. END;
  99. IF len>=size2 THEN
  100. LowLevel.Move(SYSTEM.ADR(str[inx]), SYSTEM.ADR(result), size2);
  101. ELSE
  102. LowLevel.Move(SYSTEM.ADR(str[inx]), SYSTEM.ADR(result), len);
  103. result[len] := 0C;
  104. END;
  105. END Copy;
  106. PROCEDURE Concat(s1, s2 : ARRAY OF CHAR; VAR result : ARRAY OF CHAR);
  107. BEGIN
  108. Assign(s2, result);
  109. Insert(s1, result, 0);
  110. END Concat;
  111. PROCEDURE Length(VAR str : ARRAY OF CHAR) : CARDINAL;
  112. VAR
  113. StrSize, skipped : INTEGER;
  114. BEGIN
  115. StrSize := INTEGER(HIGH(str)+1);
  116. skipped := LowLevel.ScanEQ(StrSize,0C,SYSTEM.ADR(str));
  117. RETURN CARDINAL(skipped);
  118. END Length;
  119. PROCEDURE CompareStr(s1, s2 : ARRAY OF CHAR) : INTEGER;
  120. VAR
  121. TmpAdr1, TmpAdr2 : LowLevel.Address8086;
  122. len1, len2, CompLen, cnt : CARDINAL;
  123. result: INTEGER;
  124. BEGIN
  125. result := 0;
  126. TmpAdr1.a := SYSTEM.ADR(s1);
  127. TmpAdr2.a := SYSTEM.ADR(s2);
  128. len1 := Length(s1);
  129. len2 := Length(s2);
  130. IF (HIGH(s1)+1) < len1 THEN len1 := HIGH(s1)+1 END;
  131. IF (HIGH(s2)+1) < len2 THEN len2 := HIGH(s2)+1 END;
  132. CompLen := len1;
  133. IF CompLen > len2 THEN
  134. CompLen := len2;
  135. END;
  136. cnt := 0;
  137. WHILE (cnt < CompLen) AND (result = 0) DO
  138. IF TmpAdr1.b^ # TmpAdr2.b^ THEN
  139. IF TmpAdr1.b^ > TmpAdr2.b^ THEN
  140. result := 1;
  141. RETURN result;
  142. ELSE
  143. result := -1;
  144. RETURN result;
  145. END;
  146. ELSE
  147. INC(cnt);
  148. INC(TmpAdr1.off);
  149. INC(TmpAdr2.off);
  150. END;
  151. END;
  152. IF len1 = len2 THEN
  153. result := 0;
  154. ELSIF len1 > len2 THEN
  155. result := 1;
  156. ELSE
  157. result := -1;
  158. END;
  159. RETURN result;
  160. END CompareStr;
  161. BEGIN
  162. Initialized := FALSE;
  163. Init();
  164. END M2Strings.