<> <> <> DIRECTORY Rope, TiogaLooks; TiogaLooksOps: CEDAR DEFINITIONS = BEGIN OPEN TiogaLooks; OutOfBounds: ERROR; <<**** General operations on runs ****>> CreateRun: PROC [len: Offset, looks: Looks _ noLooks] RETURNS [Runs]; FetchLooks: PROC [runs: Runs, index: Offset] RETURNS [Looks]; <> CountRuns: PROC [runs: Runs, start, len: Offset, limit: Offset _ MaxOffset, merge: BOOLEAN _ FALSE, firstLooks: Looks _ noLooks] RETURNS [count: Offset, nonempty: BOOLEAN, lastLooks: Looks]; <> <> <> Size: PROC [base: Runs] RETURNS [size: Offset] = TRUSTED INLINE { RETURN [IF base = NIL THEN 0 ELSE WITH x:base SELECT FROM base => IF x.length=0 THEN 0 ELSE x[x.length-1].after, node => LOOPHOLE[base, REF Tconcat].size, ENDCASE => ERROR] }; <<**** Operations to change looks ****>> ChangeLooks: PROC [ runs: Runs, size: Offset, remove, add: Looks, start: Offset _ 0, len: Offset _ MaxOffset] RETURNS [Runs]; <> AddLooks: PROC [ runs: Runs, size: Offset, add: Looks, start: Offset _ 0, len: Offset _ MaxOffset] RETURNS [Runs] = INLINE { RETURN [ ChangeLooks[runs, size, noLooks, add, start, len] ] }; RemoveLooks: PROC [ runs: Runs, size: Offset, remove: Looks _ allLooks, start: Offset _ 0, len: Offset _ MaxOffset] RETURNS [Runs] = INLINE { RETURN [ ChangeLooks[runs, size, remove, noLooks, start, len] ] }; SetLooks: PROC [ runs: Runs, size: Offset, new: Looks, start: Offset _ 0, len: Offset _ MaxOffset] RETURNS [Runs] = INLINE { RETURN [ ChangeLooks[runs, size, allLooks, new, start, len] ] }; ClearLooks: PROC [ runs: Runs, size: Offset, start: Offset _ 0, len: Offset _ MaxOffset] RETURNS [Runs] = INLINE { RETURN [ ChangeLooks[runs, size, allLooks, noLooks, start, len] ] }; <<**** Editing Operations ****>> Substr: PROC [base: Runs, start: Offset, len: Offset] RETURNS [Runs]; <> Flatten: PROC [base: Runs] RETURNS [new: Runs]; <> <> <> Concat: PROC [base, rest: Runs, baseLen, restLen: Offset] RETURNS [Runs]; <> Replace: PROC [ base: Runs, start, len: Offset, replace: Runs, baseSize, repSize: Offset, tryFlat: BOOLEAN _ TRUE] RETURNS [Runs]; <> Delete: PROC [base: Runs, start, len, baseSize: Offset] RETURNS [Runs] = INLINE { RETURN [ Replace[base,start,len,NIL,baseSize,0] ] }; Insert: PROC [base, insert: Runs, loc, baseSize, insertSize: Offset] RETURNS [Runs] = INLINE { RETURN [ Replace[base,loc,0,insert,baseSize,insertSize] ] }; Copy: PROC [dest: Runs, destLoc: Offset, source: Runs, start, len, destSize: Offset] RETURNS [Runs]; ReplaceByRun: PROC [ dest: Runs, start, len, runLen, destSize: Offset, inherit: BOOLEAN, looks: Looks] RETURNS [Runs]; <> <> <> <> <> <> < 0, then looks of previous char,>> <> LooksStats: PROC [base: Runs, start: Offset _ 0, len: Offset _ MaxOffset] RETURNS [size, pieces, depth: Offset]; <<***** Internal declarations>> LooksBytes: TYPE = MACHINE DEPENDENT RECORD [ byte0(0:0..7), byte1(0:8..15), byte2(1:0..7), byte3(1:8..15): [0..255] _ 0]; FlatMax: Offset = 10; -- flatten if length of run <= FlatMax END.