DIRECTORY Rope, RopeFrom; RopeEdit: CEDAR DEFINITIONS IMPORTS Rope, RopeFrom SHARES Rope = BEGIN ROPE: TYPE = Rope.ROPE; Offset: TYPE = INT; MaxLen: Offset = LAST[Offset]; MaxNat: NAT = LAST[NAT]; Substr: PROC [base: ROPE, start: Offset _ 0, len: Offset _ MaxLen] RETURNS [ROPE]; Concat: PROC [base, rest: ROPE, baseLen, restLen: Offset _ MaxLen] RETURNS [ROPE]; Replace: PROC [base: ROPE, start: Offset _ 0, len: Offset _ MaxLen, replace: ROPE _ NIL, baseSize, repSize: Offset _ MaxLen] RETURNS [ROPE]; Delete: PROC [base: ROPE, start, len, baseSize: Offset] RETURNS [ROPE] = INLINE { RETURN [Replace[base,start,len,NIL,baseSize,0]]; }; Insert: PROC [dest: ROPE, destLoc: Offset _ 0, source: ROPE, destSize, sourceSize: Offset _ MaxLen] RETURNS [ROPE] = INLINE { RETURN [Replace[dest,destLoc,0,source,destSize,sourceSize]]; }; Copy: PROC [dest: ROPE, destLoc: Offset _ 0, source: ROPE, start: Offset _ 0, len: Offset _ MaxLen, destSize: Offset _ MaxLen] RETURNS [ROPE]; ReplaceByChar: PROC [base: ROPE, char: CHAR, start: Offset _ 0, len, baseSize: Offset _ MaxLen] RETURNS [ROPE]; InsertChar: PROC [base: ROPE, char: CHAR, loc: Offset _ 0, baseSize: Offset _ MaxLen] RETURNS [ROPE] = INLINE { RETURN [ReplaceByChar[base,char,loc,0,baseSize]]; }; AppendChar: PROC [base: ROPE, char: CHAR, baseSize: Offset _ MaxLen] RETURNS [ROPE] = INLINE { RETURN [ReplaceByChar[base,char,MaxLen,0,baseSize]]; }; AppendByte: PROC [base: ROPE, x: UNSPECIFIED, baseSize: Offset _ MaxLen] RETURNS [ROPE] = INLINE { RETURN [AppendChar[base,LOOPHOLE[x,CHAR],baseSize]]; }; String: TYPE = REF READONLY TEXT; ReplaceByString: PROC [base: ROPE, string: String, stringStart: NAT _ 0, stringNum: NAT _ MaxNat, start: Offset _ 0, len, baseSize: Offset _ MaxLen] RETURNS [new: ROPE]; InsertString: PROC [base: ROPE, string: String, stringStart: NAT _ 0, stringNum: NAT _ MaxNat, loc: Offset _ 0, baseSize: Offset _ MaxLen] RETURNS [ROPE] = INLINE { RETURN [ReplaceByString[base,string,stringStart,stringNum,loc,0,baseSize]]; }; AppendString: PROC [ base: ROPE, string: String, stringStart:NAT _ 0, stringNum: NAT _ MaxNat, baseSize: Offset _ MaxLen] RETURNS [ROPE] = INLINE { RETURN [ReplaceByString[base,string,stringStart,stringNum,MaxLen,0,baseSize]]; }; Size: PROC [base: ROPE] RETURNS [Offset] = INLINE { FirstPtr: TYPE = LONG POINTER TO CARDINAL; Tobject: TYPE = object node Rope.RopeRep; IF base = NIL THEN RETURN [0]; TRUSTED { first: CARDINAL = LOOPHOLE[base, FirstPtr]^; IF first < 100000B THEN RETURN [first]; RETURN [LOOPHOLE[base, REF Tobject].size]; }; }; Fetch: PROC [rope: ROPE, index: Offset] RETURNS [CHAR] = INLINE { RETURN [Rope.Fetch[rope,index]]; }; CountPieces: PROC [rope: ROPE] RETURNS [count: Offset] = INLINE { [,count,] _ RopeStats[rope]; }; RopeStats: PROC [base: ROPE, start: Offset _ 0, len: Offset _ MaxLen] RETURNS [size, pieces, depth: Offset]; Flatten: PROC [rope: ROPE] RETURNS [ROPE] = INLINE { RETURN [RopeFrom.FlatSubstr[rope,0,MaxLen]]; }; SemiFlatten: PROC [base: ROPE] RETURNS [ROPE]; Depth: PROC [rope: ROPE] RETURNS [depth: INTEGER]; CharProperty: TYPE = {white, alphaNumeric, punctuation, illegal}; CharPropertyTable: TYPE = PACKED ARRAY CHAR OF CharProperty; charPropertyTable: REF READONLY CharPropertyTable; WhiteChar, BlankChar: PROC [char: CHAR] RETURNS [BOOLEAN] = INLINE { RETURN [charPropertyTable[char] = white]; }; AlphaNumericChar: PROC [char: CHAR] RETURNS [BOOLEAN] = INLINE { RETURN [charPropertyTable[char] = alphaNumeric]; }; PunctuationChar: PROC [char: CHAR] RETURNS [BOOLEAN] = INLINE { RETURN [charPropertyTable[char] = punctuation]; }; IllegalChar: PROC [char: CHAR] RETURNS [BOOLEAN] = INLINE { RETURN [charPropertyTable[char] = illegal] }; TestCharProp: PROC [char: CHAR, property: CharProperty] RETURNS [BOOLEAN] = INLINE { RETURN [charPropertyTable[char] = property]; }; GetCharProp: PROC [char: CHAR] RETURNS[property: CharProperty] = INLINE { RETURN [charPropertyTable[char]]; }; CR: CHAR = 'M-100B; TAB: CHAR = 'I-100B; SP: CHAR = ' ; UpperCase: PROC [c: CHAR] RETURNS [CHAR] = INLINE { RETURN [IF c IN ['a..'z] THEN c-40B ELSE c]; }; LowerCase: PROC [c: CHAR] RETURNS [CHAR] = INLINE { RETURN [IF c IN ['A..'Z] THEN c+40B ELSE c]; }; Start: PROC; -- for initialization only END. ´RopeEdit.mesa written by Bill Paxton, February 1981 Paxton, August 24, 1982 9:53 am Maxwell, January 5, 1983 11:51 am Russ Atkinson, July 21, 1983 7:27 pm This module provides editing operations for ropes. The edit functions are Replace, Delete, Insert, Copy ReplaceByChar, InsertChar, AppendChar, ReplaceByString, InsertString, AppendString Finally, there are a few miscellaneous Rope operations Size, Fetch, Flatten **** Editing Operations **** ... returns a subrope of the base ... returns the concatenation of two ropes ... returns a new rope with the given range replaced -- string is inserted at loc -- inserts stringNum chars from string starting with stringStart **** Miscellaneous Operations copied from RopeInline.Mesa create a flat version of rope create a version with at most 5 pieces. avoids copying biggest existing pieces in base ***** Character property information Returns TRUE iff char has property=white. Returns TRUE iff char has property=alphaNumeric. Returns TRUE iff char has property=punctuation. Returns TRUE iff char has property=illegal. Returns TRUE iff char has property. Returns property {white, alphaNumeric, punctuation, illegal} for char. -- ***** Initialization Ê䘚œ ™ Jšœ%™%Jšœ™Jšœ!™!J™$—J˜Jšœ2™2J˜šœ™Jšœ™Jšœ&™&Jšœ+™+J˜—šœ6™6Jšœ™—J˜šÏk ˜ J˜J˜ —J˜šœ œ ˜Jšœ˜Jšœ˜ Jšœ˜—J˜Jšœœœ˜Jšœœœ˜Jšœœ ˜Jšœœœœ˜J˜Jšœ™J˜š Ïnœœœ+œœ˜RJšœ!™!J˜—š žœœœ%œœ˜RJšœ*™*J˜—šžœ˜ Jšœœ4œœ%˜nJšœœ˜Jšœ4™4J˜—š žœœœ œœœ˜QJšœœ˜0Jšœ˜J˜—šžœ˜ Jšœœœ(˜VJšœœœ˜Jšœ6˜