| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- IMPLEMENTATION MODULE M2Strings;
- (*
- * REPERTOIRE
- * Release 1.6
- * By Charles Bradford and Cole Brecheen
- * (c) Copyright 1985-1992 PMI
- * Green Bay, Wisconsin
- * All rights reserved
- * (414) 468-6040
- *
- * $Header: D:/logfiles/mods/m2string.mov 1.5 10 Mar 1991 15:29:14 coleb $
- *
- *)
- IMPORT LowLevel;
- IMPORT SYSTEM;
- IMPORT PosUtils;
- VAR
- Initialized : BOOLEAN;
- PROCEDURE Init();
- BEGIN
- IF Initialized THEN
- RETURN;
- ELSE
- Initialized := TRUE;
- END;
- LowLevel.Init();
- PosUtils.Init();
- END Init;
- PROCEDURE Assign(VAR source : ARRAY OF CHAR; VAR dest : ARRAY OF CHAR);
- VAR
- size1, size2 : CARDINAL;
- BEGIN
- size1 := HIGH(source)+1;
- size2 := HIGH(dest)+1;
- IF size1>=size2 THEN
- LowLevel.Move(SYSTEM.ADR(source), SYSTEM.ADR(dest), size2);
- ELSE
- LowLevel.Move(SYSTEM.ADR(source), SYSTEM.ADR(dest), size1);
- dest[size1] := 0C;
- END;
- END Assign;
- PROCEDURE Insert(substr : ARRAY OF CHAR; VAR str : ARRAY OF CHAR;
- inx : CARDINAL);
- VAR
- room, lngth1, size2 : CARDINAL;
- BEGIN
- lngth1 := Length(substr);
- IF (lngth1=0) OR (inx>HIGH(str)) THEN
- RETURN;
- END;
- size2 := HIGH(str)+1;
- room := size2-inx;
- LowLevel.ShiftArrayRight(SYSTEM.ADR(str[inx]), room, lngth1);
- IF lngth1>room THEN
- LowLevel.Move(SYSTEM.ADR(substr), SYSTEM.ADR(str[inx]), room);
- ELSE
- LowLevel.Move(SYSTEM.ADR(substr), SYSTEM.ADR(str[inx]), lngth1);
- END;
- END Insert;
- PROCEDURE Delete(VAR str : ARRAY OF CHAR; inx : CARDINAL; len :
- CARDINAL);
- VAR
- room, lngth : CARDINAL;
- BEGIN
- lngth := Length(str);
- IF (len=0) OR (inx>=lngth) THEN
- RETURN;
- END;
- room := lngth-inx;
- IF len>room THEN
- len := room;
- END;
- IF room>1 THEN
- LowLevel.ShiftArrayLeft(SYSTEM.ADR(str[inx]), room, len);
- END;
- str[lngth-len] := 0C;
- END Delete;
- PROCEDURE Pos(substr, str : ARRAY OF CHAR) : CARDINAL;
- BEGIN
- RETURN PosUtils.Pos(substr,str);
- END Pos;
- PROCEDURE Copy(str : ARRAY OF CHAR; inx : CARDINAL; len : CARDINAL;
- VAR result : ARRAY OF CHAR);
- VAR
- lngth1, size2, room : CARDINAL;
- BEGIN
- lngth1 := Length(str);
- size2 := HIGH(result)+1;
- result[0] := 0C;
- (*This sets result to null in case we return from the
- procedure in the next statement.*)
- IF (len=0) OR (inx>=lngth1) THEN
- RETURN;
- END;
- room := lngth1-inx;
- IF len>room THEN
- len := room;
- END;
- IF len>=size2 THEN
- LowLevel.Move(SYSTEM.ADR(str[inx]), SYSTEM.ADR(result), size2);
- ELSE
- LowLevel.Move(SYSTEM.ADR(str[inx]), SYSTEM.ADR(result), len);
- result[len] := 0C;
- END;
- END Copy;
- PROCEDURE Concat(s1, s2 : ARRAY OF CHAR; VAR result : ARRAY OF CHAR);
- BEGIN
- Assign(s2, result);
- Insert(s1, result, 0);
- END Concat;
- PROCEDURE Length(VAR str : ARRAY OF CHAR) : CARDINAL;
- VAR
- StrSize, skipped : INTEGER;
- BEGIN
- StrSize := INTEGER(HIGH(str)+1);
- skipped := LowLevel.ScanEQ(StrSize,0C,SYSTEM.ADR(str));
- RETURN CARDINAL(skipped);
- END Length;
- PROCEDURE CompareStr(s1, s2 : ARRAY OF CHAR) : INTEGER;
- VAR
- TmpAdr1, TmpAdr2 : LowLevel.Address8086;
- len1, len2, CompLen, cnt : CARDINAL;
- result: INTEGER;
- BEGIN
- result := 0;
- TmpAdr1.a := SYSTEM.ADR(s1);
- TmpAdr2.a := SYSTEM.ADR(s2);
- len1 := Length(s1);
- len2 := Length(s2);
- IF (HIGH(s1)+1) < len1 THEN len1 := HIGH(s1)+1 END;
- IF (HIGH(s2)+1) < len2 THEN len2 := HIGH(s2)+1 END;
- CompLen := len1;
- IF CompLen > len2 THEN
- CompLen := len2;
- END;
- cnt := 0;
- WHILE (cnt < CompLen) AND (result = 0) DO
- IF TmpAdr1.b^ # TmpAdr2.b^ THEN
- IF TmpAdr1.b^ > TmpAdr2.b^ THEN
- result := 1;
- RETURN result;
- ELSE
- result := -1;
- RETURN result;
- END;
- ELSE
- INC(cnt);
- INC(TmpAdr1.off);
- INC(TmpAdr2.off);
- END;
- END;
- IF len1 = len2 THEN
- result := 0;
- ELSIF len1 > len2 THEN
- result := 1;
- ELSE
- result := -1;
- END;
- RETURN result;
- END CompareStr;
- BEGIN
- Initialized := FALSE;
- Init();
- END M2Strings.
|