RopePrivate.mesa
Russ Atkinson, August 30, 1982 1:45 pm
Paul Rovner, August 8, 1983 11:38 am
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: INTEGERLOOPHOLE[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]}};
the unsafe procs follow
QStore: UNSAFE PROC [c: CHAR, base: Text, index: CARDINAL] = UNCHECKED MACHINE CODE {
quick store into string for hack purposes, no NIL or bounds check
zWSTRL, 4};
END.