-- UnsafeSTPRubiconImpl.Mesa, last edit February 8, 1983 4:25 pm DIRECTORY LongString: TYPE USING[AppendChar, AppendString], UnsafeSTPRubicon: TYPE USING[]; UnsafeSTPRubiconImpl: PROGRAM IMPORTS LongString EXPORTS UnsafeSTPRubicon = { AppendCharAndGrow: PUBLIC PROC [ to: LONG POINTER TO LONG STRING, c: CHARACTER, z: UNCOUNTED ZONE] = { IF to↑ = NIL OR to↑.length >= to↑.maxlength THEN { old: LONG STRING ← to↑; len: CARDINAL ← IF to↑ = NIL THEN 0 ELSE to.length; to↑ ← z.NEW[StringBody[len + 8] ← [length: 0, maxlength: len + 8, text: ]]; IF old ~= NIL THEN { LongString.AppendString[to↑, old]; z.FREE[@old]; }; }; LongString.AppendChar[to↑, c]; }; AppendStringAndGrow: PUBLIC PROC [to: LONG POINTER TO LONG STRING, from: LONG STRING, z: UNCOUNTED ZONE] = { IF to↑ = NIL OR to↑.length + from.length >= to↑.maxlength THEN { old: LONG STRING ← to↑; len: CARDINAL ← IF to↑ = NIL THEN 0 ELSE to.length; to↑ ← z.NEW[StringBody[len + from.length] ← [length: 0, maxlength: len + from.length, text: ]]; IF old ~= NIL THEN { LongString.AppendString[to↑, old]; z.FREE[@old]; }; }; LongString.AppendString[to↑, from]; }; CopyToNewString: PUBLIC PROC [s: LONG STRING, z: UNCOUNTED ZONE] RETURNS [newS: LONG STRING] = { newS ← z.NEW[StringBody[s.length] ← [length: 0, maxlength: s.length, text: ]]; LongString.AppendString[newS, s]; }; Replace: PUBLIC PROC [to: LONG POINTER TO LONG STRING, from: LONG STRING, z: UNCOUNTED ZONE] = { IF to = NIL THEN RETURN; IF to↑ ~= NIL THEN z.FREE[to]; IF from # NIL THEN to↑ ← CopyToNewString[from, z]; }; }.