<> <> <> <> <> <> DIRECTORY Ascii USING [Lower], ConvertUnsafe USING [LS, SubString], PrincOpsUtils USING [LongCopy], RefText USING [New], Rope USING [Fetch, Size, ROPE, Text, NewText]; ConvertUnsafeImpl: CEDAR PROGRAM IMPORTS Ascii, PrincOpsUtils, RefText, Rope EXPORTS ConvertUnsafe SHARES Rope = BEGIN OPEN ConvertUnsafe, Rope; AppendRefText: PUBLIC UNSAFE PROC [to: LS, from: REF READONLY TEXT] = UNCHECKED { 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 UNSAFE PROC [to: LS, from: ROPE] = UNCHECKED { 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 UNSAFE PROC [to: LS, from: SubString] = UNCHECKED { 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] = TRUSTED { 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] = TRUSTED { 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] = TRUSTED { 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] = TRUSTED { 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] = TRUSTED { 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.