-- ConvertUnsafeImpl.mesa, unsafe conversions to/from STRING -- Russ Atkinson, October 5, 1982 11:21 am DIRECTORY ConvertUnsafe, Inline USING [LongCOPY], RefText USING [New], Rope USING [Fetch, Size, ROPE, Text], RopeInline USING [NewText]; ConvertUnsafeImpl: PROGRAM IMPORTS Inline, RefText, Rope, RopeInline EXPORTS ConvertUnsafe SHARES Rope = BEGIN OPEN ConvertUnsafe, Rope; AppendRefText: PUBLIC PROC [to: LS, from: REF READONLY TEXT] = { len: NAT _ to.length; FOR i: NAT IN [0..from.length) DO to[len] _ from[i]; len _ len + 1; ENDLOOP; to.length _ len; }; AppendRope: PUBLIC PROC [to: LS, from: ROPE] = { len: NAT _ to.length; FOR i: INT IN [0..Rope.Size[from]) DO to[len] _ Rope.Fetch[from,i]; len _ len + 1; ENDLOOP; to.length _ len; }; ToRefText: PUBLIC PROC [from: LS] RETURNS [REF TEXT] = { len: NAT _ IF from = NIL THEN 0 ELSE from.length; nw: NAT _ (len+1)/2; rt: REF TEXT _ RefText.New[len]; rt.length _ len; IF nw > 0 THEN Inline.LongCOPY [from: from+2, nwords: nw, to: LOOPHOLE[rt, LONG POINTER]+2]; RETURN [rt]}; ToRope: PUBLIC PROC [from: LS] RETURNS [Rope.Text] = { len: NAT _ IF from = NIL THEN 0 ELSE from.length; nw: NAT _ (len+1)/2; rt: Rope.Text _ RopeInline.NewText[len]; IF nw > 0 THEN Inline.LongCOPY [from: from+2, nwords: nw, to: LOOPHOLE[rt, LONG POINTER]+2]; RETURN [rt]}; END. ΚS˜Jš˜ΟchœΟk œžœžœžœžœžœ žœžœ'žœžœ žœžœΟn œžœžœžœžœžœžœžœžœžœžœžœ5žœ!Ÿ œžœžœžœžœžœžœžœžœžœ@žœ!Ÿ œžœžœžœžœžœžœžœžœžœžœžœžœžœžœ.žœžœ@žœžœžœ žœ Ÿœžœžœžœžœžœžœžœžœžœžœ?žœžœ@žœžœžœ žœ žœ˜Ω —…—ά5