(* Copyright (C) 1989, 1990, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* Last Modified On Fri Apr 27 21:49:57 1990 By muller *) (* Modified On Thu Jan 25 09:43:40 1990 By kalsow *) UNSAFE MODULE Text EXPORTS Text, TextF; IMPORT Cstring; PROCEDURE New (n: CARDINAL): T RAISES {} = BEGIN WITH t = NEW (T, n + 1) DO t[n] := '\000'; RETURN t; END; END New; PROCEDURE Cat (t, u: T): T = BEGIN IF (t = NIL) THEN RETURN u END; IF (u = NIL) THEN RETURN t END; WITH nt = NUMBER (t^), nu = NUMBER (u^), res = NEW (T, nt + nu - 1) DO EVAL Cstring.memcpy (ADR (res[0]), ADR (t[0]), nt - 1); EVAL Cstring.memcpy (ADR (res[nt - 1]), ADR (u[0]), nu); RETURN res; END; END Cat; PROCEDURE Equal (t, u: T): BOOLEAN = BEGIN IF (t = NIL) OR (NUMBER (t^) <= 1) THEN RETURN (u = NIL) OR (NUMBER (u^) <= 1); ELSIF (u = NIL) OR (NUMBER (u^) <= 1) THEN RETURN (FALSE); ELSE RETURN (t^ = u^); END; END Equal; PROCEDURE GetChar (t: T; i: CARDINAL): CHAR = BEGIN RETURN t[i]; END GetChar; PROCEDURE Length (t: T): CARDINAL = BEGIN IF (t = NIL) THEN RETURN 0; ELSE RETURN MAX (0, NUMBER (t^) - 1); END; END Length; PROCEDURE Empty (t: T): BOOLEAN = BEGIN RETURN (t = NIL) OR (NUMBER (t^) <= 1); END Empty; PROCEDURE Sub (t: T; start, length: CARDINAL): T = BEGIN IF (t = NIL) THEN RETURN NIL END; WITH n = NUMBER (t^)-1 DO IF (start >= n) THEN RETURN NIL END; WITH len = MIN (n - start, length), res = NEW (T, len + 1) DO EVAL Cstring.memcpy (ADR (res[0]), ADR (t [start]), len); res [len] := '\000'; RETURN res; END; END; END Sub; PROCEDURE SetChars (VAR a: ARRAY OF CHAR; t: T) = BEGIN IF (t = NIL) THEN RETURN END; WITH n = MIN (NUMBER (a), NUMBER (t^)-1) DO EVAL Cstring.memcpy (ADR (a[0]), ADR (t[0]), n); END; END SetChars; PROCEDURE FromChar (c: CHAR): T = VAR res := NEW (T, 2); BEGIN res[0] := c; res[1] := '\000'; RETURN res; END FromChar; PROCEDURE FromChars (READONLY a: ARRAY OF CHAR): T = BEGIN WITH n = NUMBER (a) DO IF (n = 0) THEN RETURN NIL END; WITH res = NEW (T, n + 1) DO EVAL Cstring.memcpy (ADR (res [0]), ADR (a[0]), n); res [n] := '\000'; RETURN res; END; END; END FromChars; PROCEDURE FindChar (t: T; c: CHAR; start := 0): INTEGER = BEGIN IF (t = NIL) OR (start < 0) THEN RETURN -1 END; WITH len = NUMBER (t^) - 1 DO LOOP IF (start >= len) THEN RETURN -1 END; IF (t[start] = c) THEN RETURN start END; INC (start); END; END; END FindChar; PROCEDURE FindCharR (t: T; c: CHAR; start := LAST (INTEGER)): INTEGER = VAR i: INTEGER; BEGIN IF (t = NIL) THEN RETURN -1 END; i := MIN (NUMBER (t^) - 2, start); LOOP IF (i < 0) THEN RETURN -1 END; IF (t[i] = c) THEN RETURN i END; DEC (i); END; END FindCharR; PROCEDURE Compare (t, u: T): [-1..1] = BEGIN WITH tEmpty = ((t = NIL) OR (NUMBER (t^) <= 1)), uEmpty = ((u = NIL) OR (NUMBER (u^) <= 1)) DO IF (tEmpty) THEN IF (uEmpty) THEN RETURN 0 ELSE RETURN -1 END; ELSIF (uEmpty) THEN RETURN 1; ELSE WITH tn = NUMBER (t^) - 1, tu = NUMBER (u^) - 1 DO FOR i := 0 TO MIN (tn, tu) DO IF ORD (t[i]) < ORD (u[i]) THEN RETURN -1; ELSIF ORD (t[i]) > ORD (u[i]) THEN RETURN +1; END; END; IF (tn = tu) THEN RETURN 0; ELSIF (tn < tu) THEN RETURN -1; ELSE RETURN +1; END; END; END; END; END Compare; (* OBSOLETE *) PROCEDURE PutStr (VAR a: ARRAY OF CHAR; t: T) = BEGIN SetChars (a, t); END PutStr; (* OBSOLETE *) PROCEDURE FromStr (READONLY a: ARRAY OF CHAR): T = BEGIN RETURN FromChars (a); END FromStr; (* OBSOLETE *) PROCEDURE IsEmpty (t: T): BOOLEAN = BEGIN RETURN (t = NIL) OR (NUMBER (t^) <= 1); END IsEmpty; BEGIN END Text.