<> <> <> <> <> DIRECTORY PrincOps USING [zBNDCK, zDADD, zLI0, zLI1, zLINI, zPOP, zWSTRL], Rope USING [ExtendPositive, ROPE, RopeRep, Text]; <<>> RopePrivate: CEDAR DEFINITIONS IMPORTS Rope SHARES Rope = BEGIN OPEN PrincOps; ROPE: TYPE ~ Rope.ROPE; RopeRep: TYPE ~ Rope.RopeRep; Text: TYPE ~ Rope.Text; FirstPtr: TYPE = LONG POINTER TO INTEGER; Ttext: TYPE = text RopeRep; Tsubstr: TYPE = substr node RopeRep; Tconcat: TYPE = concat node RopeRep; Treplace: TYPE = replace node RopeRep; Tobject: TYPE = object node RopeRep; MaxDepth: CARDINAL = 32; BoundsFault: PROC = TRUSTED MACHINE CODE {zLI1; zLI0; zBNDCK;}; NonNeg: PROC [x: INT] RETURNS [INT] = TRUSTED MACHINE CODE {zLINI; zBNDCK;}; Short: PROC [x: INT] RETURNS [CARDINAL] = TRUSTED MACHINE CODE {zLI1; zBNDCK; zPOP; zLINI; zBNDCK;}; CheckLongAdd: PROC [x,y: INT] RETURNS [INT] = TRUSTED MACHINE CODE {zDADD; zLINI; zBNDCK;}; SingleSize: PROC [base: ROPE] RETURNS [INT,Text] = TRUSTED INLINE { IF base = NIL THEN RETURN [0, NIL]; { first: INTEGER _ LOOPHOLE[base, FirstPtr]^; IF first >= 0 THEN RETURN [Rope.ExtendPositive[first], LOOPHOLE[base]] }; RETURN [LOOPHOLE[base, REF Tobject].size, NIL]; }; DoubleSize: PROC [r1,r2: ROPE] RETURNS [s1: INT, s2: INT, both: BOOL] = TRUSTED INLINE { t1,t2: Text; [s1,t1] _ SingleSize[r1]; [s2,t2] _ SingleSize[r2]; both _ t1 # NIL AND t2 # NIL; }; InlineDepth: PROC [r: ROPE] RETURNS [INTEGER] = TRUSTED INLINE { IF r = NIL THEN RETURN[0]; WITH r: r SELECT FROM node => WITH x: r SELECT FROM substr => RETURN [x.depth]; concat => RETURN [x.depth]; replace => RETURN [x.depth]; ENDCASE; ENDCASE; RETURN[1]; }; QStore: UNSAFE PROC [c: CHAR, base: Text, index: CARDINAL] = UNCHECKED MACHINE CODE {zWSTRL, 4;}; <> END.