IMPLEMENTATION MODULE DynamicStrings; (* String is completed as ADDRESS (a heap C string). All operations bind to the shim's m2ds_* helpers. *) FROM SYSTEM IMPORT ADDRESS; TYPE String = ADDRESS; PROCEDURE m2dsinit (a : ARRAY OF CHAR) : ADDRESS; EXTERNAL; PROCEDURE m2dskill (s : ADDRESS); EXTERNAL; PROCEDURE m2dslength (s : ADDRESS) : CARDINAL; EXTERNAL; PROCEDURE m2dsdupstr (s : ADDRESS) : ADDRESS; EXTERNAL; PROCEDURE m2dsconcat (a : ADDRESS; b : ADDRESS) : ADDRESS; EXTERNAL; PROCEDURE m2dsconcatchar (a : ADDRESS; ch : CHAR) : ADDRESS; EXTERNAL; PROCEDURE m2dsassign (a : ADDRESS; b : ADDRESS) : ADDRESS; EXTERNAL; PROCEDURE m2dseq (a : ADDRESS; b : ADDRESS) : BOOLEAN; EXTERNAL; PROCEDURE m2dseqarr (s : ADDRESS; a : ARRAY OF CHAR) : BOOLEAN; EXTERNAL; PROCEDURE m2dschar (s : ADDRESS; i : INTEGER) : CHAR; EXTERNAL; PROCEDURE m2dscopyout (VAR dst : ARRAY OF CHAR; s : ADDRESS); EXTERNAL; PROCEDURE m2dsslice (s : ADDRESS; low, high : INTEGER) : ADDRESS; EXTERNAL; PROCEDURE m2dsindex (s : ADDRESS; ch : CHAR; o : CARDINAL) : INTEGER; EXTERNAL; PROCEDURE m2dsrindex (s : ADDRESS; ch : CHAR; o : CARDINAL) : INTEGER; EXTERNAL; PROCEDURE m2dsmult (s : ADDRESS; n : CARDINAL) : ADDRESS; EXTERNAL; PROCEDURE m2dsreplacechar (s : ADDRESS; from, to : CHAR) : ADDRESS; EXTERNAL; PROCEDURE m2dsupper (s : ADDRESS) : ADDRESS; EXTERNAL; PROCEDURE m2dslower (s : ADDRESS) : ADDRESS; EXTERNAL; PROCEDURE m2dstrimprefix (s : ADDRESS) : ADDRESS; EXTERNAL; PROCEDURE m2dstrimpostfix (s : ADDRESS) : ADDRESS; EXTERNAL; PROCEDURE InitString (a : ARRAY OF CHAR) : String; BEGIN RETURN m2dsinit(a) END InitString; PROCEDURE KillString (s : String) : String; BEGIN m2dskill(s); RETURN NIL END KillString; PROCEDURE Fin (s : String); BEGIN m2dskill(s) END Fin; PROCEDURE InitStringChar (ch : CHAR) : String; VAR buf : ARRAY [0 .. 1] OF CHAR; BEGIN buf[0] := ch; buf[1] := CHR(0); RETURN m2dsinit(buf) END InitStringChar; PROCEDURE Length (s : String) : CARDINAL; BEGIN RETURN m2dslength(s) END Length; PROCEDURE ConCat (a, b : String) : String; BEGIN RETURN m2dsconcat(a, b) END ConCat; PROCEDURE ConCatChar (a : String; ch : CHAR) : String; BEGIN RETURN m2dsconcatchar(a, ch) END ConCatChar; PROCEDURE Assign (a, b : String) : String; BEGIN RETURN m2dsassign(a, b) END Assign; PROCEDURE Dup (s : String) : String; BEGIN RETURN m2dsdupstr(s) END Dup; PROCEDURE Add (a, b : String) : String; BEGIN RETURN m2dsconcat(m2dsdupstr(a), b) END Add; PROCEDURE Equal (a, b : String) : BOOLEAN; BEGIN RETURN m2dseq(a, b) END Equal; PROCEDURE EqualArray (s : String; a : ARRAY OF CHAR) : BOOLEAN; BEGIN RETURN m2dseqarr(s, a) END EqualArray; PROCEDURE CopyOut (VAR a : ARRAY OF CHAR; s : String); BEGIN m2dscopyout(a, s) END CopyOut; PROCEDURE char (s : String; i : INTEGER) : CHAR; BEGIN RETURN m2dschar(s, i) END char; PROCEDURE string (s : String) : ADDRESS; BEGIN RETURN s END string; PROCEDURE Mult (s : String; n : CARDINAL) : String; BEGIN RETURN m2dsmult(s, n) END Mult; PROCEDURE Slice (s : String; low, high : INTEGER) : String; BEGIN RETURN m2dsslice(s, low, high) END Slice; PROCEDURE Index (s : String; ch : CHAR; o : CARDINAL) : INTEGER; BEGIN RETURN m2dsindex(s, ch, o) END Index; PROCEDURE RIndex (s : String; ch : CHAR; o : CARDINAL) : INTEGER; BEGIN RETURN m2dsrindex(s, ch, o) END RIndex; PROCEDURE ReplaceChar (s : String; from, to : CHAR) : String; BEGIN RETURN m2dsreplacechar(s, from, to) END ReplaceChar; PROCEDURE ToUpper (s : String) : String; BEGIN RETURN m2dsupper(s) END ToUpper; PROCEDURE ToLower (s : String) : String; BEGIN RETURN m2dslower(s) END ToLower; PROCEDURE RemoveWhitePrefix (s : String) : String; BEGIN RETURN m2dstrimprefix(s) END RemoveWhitePrefix; PROCEDURE RemoveWhitePostfix (s : String) : String; BEGIN RETURN m2dstrimpostfix(s) END RemoveWhitePostfix; END DynamicStrings.