-- TextRope.mesa -- written by Bill Paxton, February 1981 -- last edit by Bill Paxton, March 19, 1981 4:54 PM DIRECTORY Rope; TextRope: DEFINITIONS IMPORTS Rope = BEGIN OPEN r:Rope; Rope: TYPE = r.Ref; Card: TYPE = LONG CARDINAL; Char: TYPE = CHARACTER; FlatMax: Card = 30; -- if shorter, copy to flat rope -- **** Editing Operations **** Substr: PROC [rope: Rope, start, len: Card] RETURNS [Rope]; -- returns a subrope of the base Concat: PROC [base, rest: Rope, baseLen, restLen: Card] RETURNS [Rope]; -- returns the concatenation of two ropes Replace: PROC [base, replace: Rope, start, len, size, baseSize, repSize: Card] RETURNS [Rope]; -- returns a new rope with the given range replaced -- size = baseSize+repSize-len Delete: PROC [base: Rope, start, len, baseSize: Card] RETURNS [Rope] = INLINE { RETURN [ Replace[base, NIL, start, len, baseSize-len, baseSize, 0] ] }; Copy: PROC [dest, source: Rope, destSize, destLoc, start, len: Card] RETURNS [Rope] = INLINE { RETURN [ Replace[dest,Substr[source,start,len], destLoc,0,destSize+len,destSize,len]] }; Move: PROC [base: Rope, baseSize, dest, start, len: Card] RETURNS [Rope]; -- dest must not be in [start..start+len) Transpose: PROC [base: Rope, baseSize, astart, alen, bstart, blen: Card] RETURNS [Rope]; -- [astart..astart+alen) must not intersect [bstart..bstart+blen) ReplaceByChar: PROC [base: Rope, char: Char, start, len, baseSize: Card] RETURNS [new: Rope]; InsertChar: PROC [base: Rope, char: Char, baseSize, loc: Card] RETURNS [Rope] = -- char is inserted at loc INLINE { RETURN [ReplaceByChar[base, char, loc, 0, baseSize]] }; ReplaceByString: PROC [base: Rope, string: REF READONLY TEXT, stringStart, stringNum: NAT, start, len, baseSize: Card] RETURNS [new: Rope]; InsertString: PROC [ base: Rope, baseSize, loc: Card, string: REF READONLY TEXT, stringStart, stringNum: NAT] RETURNS [Rope] = INLINE { RETURN [ -- string is inserted at loc -- inserts stringNum chars starting with stringStart ReplaceByString[base, string, stringStart, stringNum, loc, 0, baseSize]] }; InsertRope: PROC [base, insert: Rope, dest, baseSize, insertSize: Card] RETURNS [Rope] = INLINE { RETURN [ Replace[base,insert,dest,0,baseSize+insertSize,baseSize,insertSize] ] }; -- **** Miscellaneous Operations Size: PROC [rope: Rope] RETURNS [Card] = INLINE { RETURN [r.Size[rope]] }; Fetch: PROC [rope: Rope, index: Card] RETURNS [Char] = INLINE { RETURN [r.Fetch[rope,index]] }; END.