<> <> <> DIRECTORY PrincOps USING [zAND, zBNDCK, zDADD, zLI0, zLI1, zLINB, zLINI, zNEG, zPOP, zWSTRL], Rope; RopePrivate: CEDAR DEFINITIONS IMPORTS Rope SHARES Rope = BEGIN OPEN PrincOps, Rope; FirstPtr: TYPE = LONG POINTER TO INTEGER; Node: TYPE = REF Node; NodeRep: TYPE = node RopeRep; 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 = 40; BoundsFault: PROC = TRUSTED MACHINE CODE { zLI1; zLI0; zBNDCK}; RoundToFit: PROC [n: NAT] RETURNS [NAT] = TRUSTED MACHINE CODE { zNEG; zLINB, 370B; zAND; zNEG}; 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] = INLINE {TRUSTED { IF base = NIL THEN RETURN [0, NIL]; {first: INTEGER _ LOOPHOLE[base, FirstPtr]^; IF first >= 0 THEN RETURN [ExtendPositive[first], LOOPHOLE[base]]}; RETURN [LOOPHOLE[base, REF Tobject].size, NIL]; }}; DoubleSize: PROC [r1,r2: ROPE] RETURNS [s1: INT, s2: INT, both: BOOL] = INLINE {TRUSTED { t1,t2: Text; [s1,t1] _ SingleSize[r1]; [s2,t2] _ SingleSize[r2]; both _ t1 # NIL AND t2 # NIL; }}; InlineDepth: PROC [r: ROPE] RETURNS [INTEGER] = INLINE {TRUSTED { 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.