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.