DIRECTORY Rope, TiogaLooks; TiogaLooksOps: CEDAR DEFINITIONS = BEGIN OPEN TiogaLooks; OutOfBounds: ERROR; 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] }; 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] ] }; 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]; LooksStats: PROC [base: Runs, start: Offset _ 0, len: Offset _ MaxOffset] RETURNS [size, pieces, depth: Offset]; 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. ˜TiogaLooksOps.mesa; written by Bill Paxton, February 1981 last edit by Bill Paxton, May 27, 1983 1:51 pm last edit by McGregor, March 31, 1983 11:47 am **** General operations on runs **** returns the looks for the character at the given location counts the number of runs in the given range stops counting if reaches limit if merge is true, then doesn't count first run if its looks=firstLooks **** Operations to change looks **** first remove then add in the given range **** Editing Operations **** returns a substring of the runs returns a flattened version of base runs returns a flattened version of base runs new has at most 5 pieces; reuses biggest pieces of base returns the concatenation of two Runs returns new Runs with the given range replaced equivalent to, but faster than, Replace[dest,start,len,CreateRun[runLen,xlooks],destSize,runLen] where xlooks determined in the following manner: if inherit is false, looks specifed in arg list if inherit is true, looks found in following manner: if destSize is 0, then take looks from argument list, else if start > 0, then looks of previous char, else looks following replacement ***** Internal declarations Κ˜Jšœ9™9Jšœ.™.Jšœ.™.J˜šΟk ˜ Jšœ˜J˜—Jšœœ˜"Jšœœ ˜J˜Jšœ œ˜Iproc˜Jšœ$™$J˜JšΟn œœ'œ˜EJ˜šž œœœ ˜=Jšœ9™9J˜—šž œœ<˜KJšœœœ˜4Jšœœ˜=Jšœ,™,Jšœ™JšœF™FJ˜—š žœœœœœ˜Ašœœœœœœœ˜9Jšœœ œœ˜6Jšœœœ˜)Jšœœ˜J˜J˜——Jšœ$™$J˜šž œœ˜J˜-J˜+Jšœ˜Jšœ(™(J˜—šžœœ˜J˜%J˜+Jšœ œ˜Jšœ9˜?J˜—šž œœ˜J˜3J˜+Jšœ œ˜Jšœ<˜BJ˜—šžœœ˜J˜%J˜+Jšœ œ˜Jšœ:˜@J˜—šž œœ˜J˜EJšœ œ˜Jšœ>˜DJ˜J˜—Jšœ™J˜šžœœ)˜5Jšœ˜Jšœ™J˜—šžœœœ ˜/Jšœ(™(J˜Jšœ(™(Jšœ7™7J˜—šžœœ.œ˜IJšœ%™%J˜—šžœœ˜J˜.Jšœ$œœ˜3Jšœ˜Jšœ.™.J˜—šžœœ,œ ˜OJšœœœ˜6J˜—šžœœ8˜Dšœ œœ˜"J˜3J˜——šžœœJ˜TJšœ˜J˜—šž œœ˜J˜1Jšœ œ˜Jšœ˜Jšœ™Jšœ@™@šœ0™0Jšœ1™1šœ4™4Jšœ:™:Jšœ*™*Jšœ ™ J˜———šž œœ9˜IJšœ˜&J˜—J˜Jšœ™J˜š œ œœ œœ˜-J˜J˜-J˜—JšœΟc&˜