DIRECTORY Rope USING [ROPE, RopeRep, StringBound, Text, TextBound, UncheckedFlat]; RopePrivate: CEDAR DEFINITIONS SHARES Rope = BEGIN OPEN Rope; Tsubstr: TYPE = substr node RopeRep; Tconcat: TYPE = concat node RopeRep; Treplace: TYPE = replace node RopeRep; Tobject: TYPE = object node RopeRep; MaxDepth: CARDINAL = 32; NonNeg: PROC [x: INT] RETURNS [NAT] = INLINE {RETURN [x]}; Short: PROC [x: INT] RETURNS [TextBound] = INLINE {RETURN [x]}; CheckLongAdd: PROC [x,y: INT] RETURNS [NAT] = INLINE {RETURN [x+y]}; NodeSize: PROC [base: REF RopeRep.node] RETURNS [INT] = INLINE { TRUSTED { RETURN [LOOPHOLE[base, REF Tobject].size]; }; }; SingleSize: PROC [base: ROPE] RETURNS [INT, Text] = INLINE { WITH base SELECT FROM text: Text => RETURN [text.length, text]; node: REF RopeRep.node => RETURN [NodeSize[node], NIL]; ENDCASE => RETURN [0, NIL]; }; DoubleSize: PROC [r1, r2: ROPE] RETURNS [s1: INT, s2: INT, both: BOOL] = INLINE { t1,t2: Text; [s1,t1] ¬ SingleSize[r1]; [s2,t2] ¬ SingleSize[r2]; both ¬ t1 # NIL AND t2 # NIL; }; InlineDepth: PROC [r: ROPE] RETURNS [INTEGER] = INLINE { IF r = NIL THEN RETURN [0]; WITH r SELECT FROM node: REF RopeRep.node => RETURN [node.depth]; ENDCASE => RETURN [1]; }; QStore: UNSAFE PROC [c: CHAR, base: Text, index: StringBound] = TRUSTED INLINE { LOOPHOLE[base, UncheckedFlat][index] ¬ c; }; QFetch: UNSAFE PROC [base: Text, index: StringBound] RETURNS [CHAR] = TRUSTED INLINE { RETURN [LOOPHOLE[base, UncheckedFlat][index]]; }; END.  RopePrivate.mesa Copyright Σ 1984, 1985, 1986, 1987, 1988, 1991 by Xerox Corporation. All rights reserved. Doug Wyatt, November 13, 1986 7:01:24 pm PST Russ Atkinson (RRA) July 13, 1987 9:56:32 pm PDT Christian Jacobi, January 12, 1988 5:42:54 pm PST Willie-s, August 2, 1991 11:41 am PDT Michael Plass, September 22, 1991 1:53 am PDT This routine is used to check that the argument is not negative. This version depends on the compiler for the bounds checking. This routine is used to narrow from an INT to a TextBound. This version depends on the compiler for the bounds checking. This routine is used to add two numbers and fail if the sum is not positive. This version depends on the compiler for the bounds checking. Relys on size field being in the same place in all node variants: quick store into string for hack purposes, no checking quick fetch from string for hack purposes, no checking ΚN–(cedarcode) style•NewlineDelimiter ™codešœ™Kšœ ΟeœO™ZK™,K™0Kšœ1™1K™%K™-—˜šΟk ˜ Kšœžœžœ8˜H——headšΟn œžœž ˜Kšžœ˜ Kšœžœžœ˜—˜Kšœ žœ˜$Kšœ žœ˜$Kšœ žœ˜&Kšœ žœ˜$K˜Kšœ žœ˜K˜šŸœžœžœžœžœžœžœ˜:K™K˜—š Ÿœžœžœžœžœžœ˜?Kšœy™yK˜—šŸ œžœžœžœžœžœžœ˜DK™‹—K˜š Ÿœžœžœžœžœžœ˜@šžœ˜ K™AKšžœžœžœ˜*Kšœ˜—Kšœ˜K˜—š Ÿ œžœžœžœžœ žœ˜<šžœžœž˜Kšœžœ˜)Kšœžœžœžœ˜7Kšžœžœžœ˜—K˜K˜—šŸ œžœ žœžœžœžœžœžœ˜QK˜ K˜K˜Kšœ žœžœžœ˜K˜K™—š Ÿ œžœžœžœžœžœ˜8Kšžœžœžœžœ˜šžœžœž˜Kšœžœžœ˜.Kšžœžœ˜—Kšœ˜K˜—K˜š Ÿœžœžœžœ$žœžœ˜PKšœ6™6Kšžœ!˜)K˜K™—šŸœžœžœ"žœžœžœžœ˜VKšœ6™6Kšžœžœ˜.K˜K™——Kšžœ˜—…—Μ ͺ