DIRECTORY RopeEditingAlloc, Rope, RopeReader, RopeFrom; RopeEditingAllocImpl: CEDAR MONITOR IMPORTS RopeReader EXPORTS RopeEditingAlloc = BEGIN OPEN RopeEditingAlloc; charsPerArray: NAT = RopeReader.charsPerArray; wordsPerArray: NAT = charsPerArray/2; charsArray: Chars _ NIL; -- current shared array of chars charsRemaining: NAT _ 0; -- amount of room remaining in current chars array charsRope: ROPE; -- rope pointing to current chars array AllocChars: PUBLIC ENTRY PROC [len: NAT] RETURNS [chars: Chars, start: NAT, base: ROPE] = { IF len > charsRemaining THEN { IF len > charsPerArray THEN ERROR; IF charsPerArray-len < charsRemaining THEN { -- keep the current one chars _ NEW[CharsArray]; start _ 0; base _ RopeReader.CharsRope[chars]; RETURN }; charsArray _ NEW[CharsArray]; charsRemaining _ charsPerArray; charsRope _ RopeReader.CharsRope[charsArray] }; chars _ charsArray; start _ charsPerArray-charsRemaining; charsRemaining _ charsRemaining-len; base _ charsRope }; AllocWords: PUBLIC ENTRY PROC [nwords: NAT] RETURNS [chars: Chars, start: NAT, base: ROPE] = { wordsRemaining: NAT; IF nwords > (wordsRemaining _ charsRemaining/2) THEN { IF nwords > wordsPerArray THEN ERROR; IF wordsPerArray-nwords < wordsRemaining THEN { chars _ NEW[CharsArray]; start _ 0; base _ RopeReader.CharsRope[chars]; RETURN }; charsArray _ NEW[CharsArray]; wordsRemaining _ wordsPerArray; charsRope _ RopeReader.CharsRope[charsArray] }; chars _ charsArray; start _ (wordsPerArray-wordsRemaining)*2; charsRemaining _ (wordsRemaining-nwords)*2; base _ charsRope }; TryAllocAdjacent: PUBLIC ENTRY PROC [base: ROPE, start: NAT, len: NAT] RETURNS [ok: BOOLEAN, chars: Chars] = { IF base=charsRope AND start=charsPerArray-charsRemaining AND charsRemaining >= len THEN { charsRemaining _ charsRemaining-len; RETURN [TRUE, charsArray]}; RETURN [FALSE, charsArray]}; blockSize: NAT = 512; blk1, blk2: REF TEXT; -- shared buffers GetBlock: PUBLIC ENTRY PROC RETURNS [blk: REF TEXT] = { IF blk2 # NIL THEN { blk _ blk2; blk2 _ NIL } ELSE IF blk1 # NIL THEN { blk _ blk1; blk1 _ NIL } ELSE blk _ NEW[TEXT[blockSize]]; blk.length _ 0 }; FreeBlock: PUBLIC ENTRY PROC [blk: REF TEXT] = { IF blk2 = NIL THEN blk2 _ blk ELSE IF blk1 = NIL THEN blk1 _ blk }; END. |-- RopeEditingAllocImpl.Mesa; written by Bill Paxton, March 1981 -- edited by Bill Paxton, July 11, 1983 10:58 am -- edited by McGregor, February 8, 1983 11:07 am -- returns chars array & starting index to fill with characters -- and a rope that points to that substring of the chars array -- ensures that start is even, i.e., start on word boundary -- ***** buffer cache ÊA˜JšÏcA™AJš0™0Jš0™0J˜šÏk ˜ J˜J˜J˜ J˜ —J˜šœž ˜#Jšžœ ˜Jšžœ˜—Jšžœžœ˜J˜Jšœžœ˜.Jšœžœ˜%Jšœžœ ˜9Jšœžœ2˜KJšœ žœ'˜8J˜š Ïn œžœžœžœžœ˜(Jšžœžœžœ˜2Jš?™?Jš>™>šžœžœ˜Jšžœžœžœ˜"šžœ$žœ˜DJšœžœ˜#J˜#Jšžœ˜ —Jšœ žœ-˜=J˜/—J˜J˜%J˜$J˜J˜—š Ÿ œžœžœžœ žœ˜+Jšžœžœžœ˜2Jš;™;Jšœžœ˜šžœ.žœ˜6Jšžœžœžœ˜%šžœ'žœ˜/Jšœžœ˜#J˜#Jšžœ˜ —Jšœ žœ ˜J˜J˜/—J˜J˜)J˜+J˜J˜—šŸœžœžœžœžœ žœžœ˜FJšžœžœ˜'šžœž˜šœ#ž˜&Jšœžœ˜—Jšœ%žœžœ˜@—Jšžœžœ˜J˜—Jš™J˜Jšœ žœ˜Jšœ žœžœ˜'J˜šŸœžœžœžœžœžœžœ˜7Jšžœžœžœžœ˜-Jš žœžœžœžœžœ˜2Jšžœžœžœ ˜ J˜J˜—š Ÿ œžœžœžœžœžœ˜0Jšžœžœžœ žœžœžœžœ˜CJ˜—Jšžœ˜J˜—…—È …