DIRECTORY Ascii USING [Lower], ConvertUnsafe USING [LS, SubString], PrincOpsUtils USING [LongCOPY], RefText USING [New], Rope USING [Fetch, Size, ROPE, Text, NewText]; ConvertUnsafeImpl: PROGRAM IMPORTS Ascii, PrincOpsUtils, RefText, Rope EXPORTS ConvertUnsafe SHARES Rope = BEGIN OPEN ConvertUnsafe, Rope; AppendRefText: PUBLIC PROC [to: LS, from: REF READONLY TEXT] = { len: CARDINAL _ to.length; FOR i: CARDINAL IN [0..from.length) DO to[len] _ from[i]; len _ len + 1; ENDLOOP; to.length _ len; }; AppendRope: PUBLIC PROC [to: LS, from: ROPE] = { len: CARDINAL _ to.length; FOR i: INT IN [0..Size[from]) DO to[len] _ Fetch[from,i]; len _ len + 1; ENDLOOP; to.length _ len; }; AppendSubString: PUBLIC PROC [to: LS, from: SubString] = { len: CARDINAL _ to.length; FOR i: INT IN [0..from.length) DO to[len] _ from.base[from.offset + i]; len _ len + 1; ENDLOOP; to.length _ len; }; AppendSubStringToRefText: PUBLIC PROC [to: REF TEXT, from: SubString] = { len: CARDINAL _ to.length; FOR i: INT IN [0..from.length) DO to[len] _ from.base[from.offset + i]; len _ len + 1; ENDLOOP; to.length _ len; }; ToRefText: PUBLIC PROC [from: LS] RETURNS [REF TEXT] = { len: CARDINAL _ IF from = NIL THEN 0 ELSE from.length; nw: CARDINAL _ (len+1)/2; rt: REF TEXT _ RefText.New[len]; rt.length _ len; IF nw > 0 THEN PrincOpsUtils.LongCOPY[from: from+2, nwords: nw, to: LOOPHOLE[rt, LONG POINTER]+2]; RETURN [rt]}; EqualSubStrings: PUBLIC PROC [s1, s2: SubString, case: BOOL _ TRUE] RETURNS [ans: BOOL _ TRUE] = { i1, i2, n: CARDINAL; b1, b2: LS; IF s1.length # s2.length THEN RETURN[FALSE]; b1 _ s1.base; i1 _ s1.offset; b2 _ s2.base; i2 _ s2.offset; FOR n _ s1.length, n - 1 WHILE n > 0 DO IF case THEN {IF b1[i1] # b2[i2] THEN RETURN[FALSE]} ELSE IF Ascii.Lower[b1[i1]] # Ascii.Lower[b2[i2]] THEN RETURN[FALSE]; i1 _ i1 + 1; i2 _ i2 + 1; ENDLOOP; }; SubStringToRope: PUBLIC PROC [from: SubString] RETURNS [rt: Text] = { len: CARDINAL = IF from.base = NIL THEN 0 ELSE from.length; rt _ NewText[len]; rt.length _ len; FOR i: CARDINAL IN [0..len) DO rt[i] _ from.base[from.offset + i]; ENDLOOP; }; ToRope: PUBLIC PROC [from: LS] RETURNS [Text] = { len: CARDINAL _ IF from = NIL THEN 0 ELSE from.length; nw: CARDINAL _ (len+1)/2; rt: Text _ NewText[len]; IF nw > 0 THEN PrincOpsUtils.LongCOPY[from: from+2, nwords: nw, to: LOOPHOLE[rt, LONG POINTER]+2]; RETURN [rt]}; END. ΔConvertUnsafeImpl.mesa, unsafe conversions to/from STRING Russ Atkinson, October 5, 1982 11:21 am Paul Rovner, September 19, 1983 9:20 pm Last Edited by: Levin, September 22, 1983 10:42 am Κ†˜Jšœ9™9Jšœ'™'Jšœ'™'J™2J˜šΟk ˜ Jšœœ ˜Jšœœœ ˜$Jšœœ ˜Jšœœ˜Jšœœœ˜.—J˜šœ˜Jšœ$˜+Jšœ˜Jšœ˜ —šœœœ˜!J˜šΟn œœœœœœœ˜@Jšœœ ˜šœœœ˜&Jšœ˜Jšœ˜Jšœ˜—Jšœ˜Jšœ˜—J˜š ž œœœœœ˜0Jšœœ ˜šœœœ˜ Jšœ˜Jšœ˜Jšœ˜—Jšœ˜Jšœ˜—J˜šžœœœœ˜:Jšœœ ˜šœœœ˜!Jšœ%˜%Jšœ˜Jšœ˜—Jšœ˜Jšœ˜J˜—šžœœœœ˜IJšœœ ˜šœœœ˜!Jšœ%˜%Jšœ˜Jšœ˜—Jšœ˜Jšœ˜J˜—šž œœœœœœœ˜8Jš œœœœœœ ˜6Jšœœ ˜Jšœœœ˜ Jšœ˜šœ˜Jšœ5œœœ˜S—Jšœ˜ —J˜procš Πbnœœœœœ˜CKšœœœ˜Jšœ œ˜Jšœœ˜ Jšœœœœ˜,Jšœ ˜ Jšœ˜Jšœ ˜ Jšœ˜šœœ˜'š œœœœœœ˜4Jš œœ+œœœ˜E—Jšœ ˜ Jšœ ˜ Jšœ˜—Jšœ˜J˜—šžœœœœ˜EJš œœœ œœœ ˜;Jšœ˜Jšœ˜Jš œœœ œ%œ˜KJšœ˜J˜—š žœœœœœ ˜1Jš œœœœœœ ˜6Jšœœ ˜Jšœ˜šœ˜Jšœ5œœœ˜S—Jšœ˜ ——J˜Jšœ˜J˜—…— BŒ