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]}};
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.