DIRECTORY Basics USING [DoubleAnd, DoubleNot, DoubleOr], Rope USING [ROPE], Rosary USING [ROSARY]; TextLooks: CEDAR DEFINITIONS IMPORTS Basics = BEGIN Runs: TYPE = Rosary.ROSARY--OF REF Looks--; Looks: TYPE = PACKED ARRAY Look OF Bit; Look: TYPE = CHAR ['a..'a+31]; -- 32 bits; indexed from "a" Bit: TYPE = BOOL _ FALSE; noLooks: Looks = ALL[FALSE]; allLooks: Looks = ALL[TRUE]; MaxOffset: INT = LAST[INT]; CreateRun: PROC [len: INT, looks: Looks _ noLooks] RETURNS [Runs]; Size: PROC [runs: Runs] RETURNS [size: INT]; FetchLooks: PROC [runs: Runs, index: INT] RETURNS [Looks]; CountRuns: PROC [runs: Runs, start: INT _ 0, len: INT _ MaxOffset] RETURNS [INT]; RunAction: TYPE ~ PROC [looks: Looks, len: INT] RETURNS [quit: BOOL _ FALSE]; MapRuns: PROC [runs: Runs, action: RunAction, start: INT _ 0, len: INT _ MaxOffset] RETURNS [quit: BOOL]; LooksAnd: PROC [looks1, looks2: Looks] RETURNS [Looks] ~ INLINE { RETURN[LOOPHOLE[Basics.DoubleAnd[LOOPHOLE[looks1], LOOPHOLE[looks2]]]]; }; LooksOr: PROC [looks1, looks2: Looks] RETURNS [Looks] ~ INLINE { RETURN[LOOPHOLE[Basics.DoubleOr[LOOPHOLE[looks1], LOOPHOLE[looks2]]]]; }; LooksNot: PROC [looks: Looks] RETURNS [Looks] ~ INLINE { RETURN[LOOPHOLE[Basics.DoubleNot[LOOPHOLE[looks]]]]; }; ModifyLooks: PROC [old, remove, add: Looks] RETURNS [Looks]; ChangeLooks: PROC [runs: Runs, size: INT, remove, add: Looks, start: INT _ 0, len: INT _ MaxOffset] RETURNS [Runs]; Substr: PROC [base: Runs, start: INT, len: INT] RETURNS [Runs]; Concat: PROC [base, rest: Runs, baseLen, restLen: INT] RETURNS [Runs]; Replace: PROC [base: Runs, start, len: INT, replace: Runs, baseSize, repSize: INT ] RETURNS [Runs]; ReplaceByRun: PROC [dest: Runs, start, len, runLen, destSize: INT, inherit: BOOL, looks: Looks] RETURNS [Runs]; OutOfBounds: ERROR; LooksToRope: PROC [looks: Looks] RETURNS [rope: Rope.ROPE]; RopeToLooks: PROC [rope: Rope.ROPE] RETURNS [looks: Looks]; LooksBytes: TYPE = MACHINE DEPENDENT RECORD [ byte0(0:0..7), byte1(0:8..15), byte2(1:0..7), byte3(1:8..15): [0..255] _ 0 ]; END. fTextLooks.mesa Copyright Σ 1985, 1986, 1988 by Xerox Corporation. All rights reserved. written by Bill Paxton, February 1981 last edit by Bill Paxton, December 13, 1982 1:17 pm Last Edited by: Maxwell, January 5, 1983 12:35 pm Michael Plass, March 14, 1985 10:00:03 am PST Doug Wyatt, February 17, 1988 5:16:21 pm PST This package provides Looks for text in Tioga it allows a client to associate looks with characters in a rope looks are represented as a vector of 32 bits The implementation expects that long sequences will have the same looks and thus uses a run encoding to save space. The runs of looks are immutable just like the text in a rope. i.e., you don't change runs; instead you build new ones out of parts of old ones Also like ropes, we use piece tables in the implementation thus making the cost of setting looks independent of the size of the rope. General operations on runs returns the looks for the character at the given location counts the number of runs calls action for each run Operations to change looks first remove then add in the given range Editing Operations returns a substring of the runs 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 Miscellaneous Internal declarations Κ\˜codešœ™KšœH™HKšœ%™%Kšœ3™3K™1K™-K™,—K˜šœ-™-Kšœ?™?Kšœ,™,K˜—šœG™GKšœ+™+K˜—šœ=™=šœ™Kšœ4™4K˜——šœ;™;KšœK™K—K˜šΟk ˜ Kšœœ"˜.Kšœœœ˜Kšœœœ˜—K˜KšΡbln œœ œœ˜+šœ˜K˜Kš œœ ΟcœœŸœ˜+Kš œœœœœ˜'KšœœœŸ˜