DIRECTORY IO, FS, Rope; RopeFrom: CEDAR DEFINITIONS = BEGIN Offset: TYPE = INT; MaxLen: Offset = LAST[Offset]; MaxNat: NAT = LAST[NAT]; ROPE: TYPE = Rope.ROPE; File: PROC [ file: FS.OpenFile, start: Offset _ 0, length: Offset _ MaxLen, activate: BOOL _ FALSE, fileLen: Offset _ MaxLen] RETURNS [ROPE]; Stream: PROC [stream: IO.STREAM, length: Offset _ MaxLen] RETURNS [rope: ROPE]; String: PROC [string: REF READONLY TEXT, start: NAT _ 0, len: NAT _ LAST[NAT]] RETURNS [ROPE]; Character: PROC [char: CHAR] RETURNS [ROPE]; Byte: PROC [x: UNSPECIFIED] RETURNS [ROPE] = INLINE { RETURN [Character[LOOPHOLE[x,CHAR]]]; }; FlatSubstr: PROC [rope: ROPE, start: Offset _ 0, len: Offset _ MaxLen] RETURNS [ROPE]; FlatConcat: PROC [base, rest: ROPE, baseSize, restSize: Offset _ MaxLen, tryAppend: BOOL _ TRUE] RETURNS [ROPE]; TryAppendConcat: PROC [base, rest: ROPE, baseSize, restSize: Offset _ MaxLen] RETURNS [ROPE]; FlatReplace: PROC [ base: ROPE, start: Offset _ 0, len: Offset _ MaxLen, replace: ROPE _ NIL, size, baseSize, repSize: Offset _ MaxLen] RETURNS [ROPE]; FlatDelete: PROC [base: ROPE, start: Offset _ 0, len, baseSize: Offset _ MaxLen] RETURNS [ROPE] = INLINE { RETURN [FlatReplace[base, start, len, NIL, MaxLen, baseSize, 0]]; }; FlatInsert: PROC [dest: ROPE, destLoc: Offset _ 0, source: ROPE, destSize, sourceSize: Offset _ MaxLen] RETURNS [ROPE] = INLINE { RETURN [FlatReplace[dest, destLoc, 0, source, MaxLen, destSize, sourceSize]]; }; FlatCopy: PROC [dest: ROPE, destLoc: Offset _ 0, source: ROPE, start: Offset _ 0, len: Offset _ MaxLen, destSize: Offset _ MaxLen] RETURNS [ROPE]; FlatReplaceByChar: PROC [base: ROPE, char: CHAR, start: Offset _ 0, len, baseSize: Offset _ MaxLen, tryAppend: BOOL _ TRUE] RETURNS [new: ROPE]; TryAppendReplaceByChar: PROC [base: ROPE, char: CHAR, start: Offset _ 0, len, baseSize: Offset _ MaxLen] RETURNS [new: ROPE]; FlatInsertChar: PROC [base: ROPE, char: CHAR, loc: Offset _ 0, baseSize: Offset _ MaxLen, tryAppend: BOOL _ TRUE] RETURNS [ROPE] = INLINE { RETURN [FlatReplaceByChar[base,char,loc,0,baseSize,tryAppend]]; }; TryFlatInsertChar: PROC [base: ROPE, char: CHAR, loc: Offset _ 0, baseSize: Offset _ MaxLen] RETURNS [ROPE] = INLINE { RETURN [TryAppendReplaceByChar[base,char,loc,0,baseSize]]; }; FlatAppendChar: PROC [base: ROPE, char: CHAR, baseSize: Offset _ MaxLen, tryAppend: BOOL _ TRUE] RETURNS [ROPE] = INLINE { RETURN [FlatReplaceByChar[base,char,MaxLen,0,baseSize,tryAppend]]; }; TryFlatAppendChar: PROC [base: ROPE, char: CHAR, baseSize: Offset _ MaxLen] RETURNS [ROPE] = INLINE { RETURN [TryAppendReplaceByChar[base,char,MaxLen,0,baseSize]]; }; FlatAppendByte: PROC [base: ROPE, x: UNSPECIFIED, baseSize: Offset _ MaxLen, tryAppend: BOOL _ TRUE] RETURNS [ROPE] = INLINE { RETURN [FlatAppendChar[base,LOOPHOLE[x,CHAR],baseSize,tryAppend]]; }; TryFlatAppendByte: PROC [base: ROPE, x: UNSPECIFIED, baseSize: Offset _ MaxLen] RETURNS [ROPE] = INLINE { RETURN [TryFlatAppendChar[base,LOOPHOLE[x,CHAR],baseSize]]; }; FlatReplaceByString: PROC [base: ROPE, string: REF READONLY TEXT, stringStart: NAT _ 0, stringNum: NAT _ MaxNat, start: Offset _ 0, len, baseSize: Offset _ MaxLen, tryAppend: BOOL _ TRUE] RETURNS [new: ROPE]; TryAppendReplaceByString: PROC [base: ROPE, string: REF READONLY TEXT, stringStart: NAT _ 0, stringNum: NAT _ MaxNat, start: Offset _ 0, len, baseSize: Offset _ MaxLen] RETURNS [new: ROPE]; FlatInsertString: PROC [base: ROPE, string: REF READONLY TEXT, stringStart: NAT _ 0, stringNum: NAT _ MaxNat, loc: Offset _ 0, baseSize: Offset _ MaxLen, tryAppend: BOOL _ TRUE] RETURNS [ROPE] = INLINE { RETURN [FlatReplaceByString[base,string,stringStart,stringNum,loc,0,baseSize,tryAppend]]; }; TryFlatInsertString: PROC [base: ROPE, string: REF READONLY TEXT, stringStart: NAT _ 0, stringNum: NAT _ MaxNat, loc: Offset _ 0, baseSize: Offset _ MaxLen] RETURNS [ROPE] = INLINE { RETURN [TryAppendReplaceByString[base,string,stringStart,stringNum,loc,0,baseSize]]; }; FlatAppendString: PROC [base: ROPE, string: REF READONLY TEXT, stringStart: NAT _ 0, stringNum: NAT _ MaxNat, baseSize: Offset _ MaxLen, tryAppend: BOOL _ TRUE] RETURNS [ROPE] = INLINE { RETURN [FlatReplaceByString[base,string,stringStart,stringNum,MaxLen,0,baseSize,tryAppend]]; }; TryFlatAppendString: PROC [base: ROPE, string: REF READONLY TEXT, stringStart: NAT _ 0, stringNum: NAT _ MaxNat, baseSize: Offset _ MaxLen] RETURNS [ROPE] = INLINE { RETURN [TryAppendReplaceByString[base,string,stringStart,stringNum,MaxLen,0,baseSize]]; }; StartRopeFrom: PROC; -- for initialization only StartRopeFromEdit: PROC; -- for initialization only StartRopeFromFile: PROC; -- for initialization only qZone: ZONE; -- quantized zone for use within RopeEditing config pZone: ZONE; -- prefixed zone for use within RopeEditing config END. Changes due to Nuclear conversion RRA, July 21, 1983 7:02 pm, reformatted; change File.Capability to FS.OpenFile; removed okToMapFile argument from the File procedure (not relevant) êRopeFrom.mesa Bill Paxton, February 1981 McGregor, August 11, 1982 10:31 am Russ Atkinson, July 21, 1983 7:06 pm This file defines routines for creating ropes from files, strings, and characters; also for creating flat ropes from other ones. The characters go into CharsArrays to get fast access via RopeReader's (q.v.). A shared CharsArray is used to hold text for chars, strings, and ropes; also for short files. Long files use RopeFiles. byte address in file where rope will start 0 means first page after leader page defaults to rest of file beyond start ... if activate is true, the system will start swapping the characters into real memory ... fileLen is size of entire file in bytes, excluding leader page (let this be defaulted if you're not sure of it) ... reads length chars from stream and puts them in a rope. ... copies len characters from string starting at start. ... tries to append rest by copying to buffer directly after base; returns NIL if cannot ... returns a new rope with the given range replaced -- string is inserted at loc -- inserts stringNum chars from string starting with stringStart -- string is inserted at loc -- inserts stringNum chars from string starting with stringStart -- ***** miscellaneous internal stuff ʘšœ ™ JšÏc™Jš"™"J™$—J˜JšÊ™ÊJ˜šÏk ˜ Jšžœ˜Jšœ˜J˜J˜—šœ ž˜Jšœž˜—J˜Jšœžœžœ˜Jšœžœ ˜Jšœžœžœžœ˜Jšžœžœžœ˜J˜šÏnœžœ˜ Jšœ˜šœ˜Jšœ*™*Jš$™$—šœ˜Jšœ%™%—Jšœ žœžœ˜Jšœ˜Jšžœžœ˜JšW™WJšs™sJ˜—š Ÿœžœ žœžœžœžœ˜OJš;™;J˜—šŸœž˜ Jšœ žœžœžœ žœ žœžœžœžœžœ˜QJš8™8J˜—Jš Ÿ œžœžœžœžœ˜,J˜š Ÿœžœž œžœžœžœ˜5Jšžœ žœžœ˜%Jšœ˜J˜—š Ÿ œžœžœ*žœžœ˜VJ˜—šŸ œž˜Jšœ žœ2žœžœ˜OJšžœžœ˜J˜—šŸœž˜Jšœ žœ&žœžœ˜GJšX™XJ˜—šŸ œžœ˜Jšœžœ4žœžœ˜IJ˜)Jšžœžœ˜Jš4™4J˜—šŸ œž˜Jš œžœ4žœžœžœ˜YJšžœ žœ˜AJšœ˜J˜—šŸ œž˜Jšœžœžœ(˜VJšžœžœžœ˜JšžœG˜MJšœ˜J˜—šŸœž˜JšœžœžœE˜sJšžœžœ˜J˜—šŸœž˜Jš œžœžœ@žœžœ˜cJšžœžœ˜J˜—šŸœž˜Jšœžœžœ4˜KJšžœžœ˜J˜—šŸœž˜Jš œžœžœ9žœžœ˜\Jšžœžœžœ˜Jšžœ9˜?Jšœ˜J˜—šŸœž˜Jšœžœžœ-˜DJšžœžœžœ˜Jšžœ4˜:Jšœ˜J˜—šŸœž˜Jš œžœžœ(žœžœ˜KJšžœžœžœ˜Jšžœ<˜BJšœ˜J˜—šŸœž˜Jš œžœžœžœžœžœ˜MJšžœ7˜=Jšœ˜J˜—šŸœž˜Jš œžœž œ(žœžœ˜OJšžœžœžœ˜Jšžœžœžœ˜BJšœ˜J˜—šŸœž˜Jšœžœž œ˜7Jšžœžœžœ˜Jšžœžœžœ ˜;Jšœ˜J˜—šŸœž˜Jšœžœ žœžœžœžœžœIžœžœ˜¡Jšžœžœ˜J˜—šŸœž˜Jš œžœ žœžœžœžœžœ=˜‰Jšžœžœ˜J˜—šŸœž˜Jšœžœ žœžœžœžœžœBžœžœ˜šJšžœžœžœ˜Jš™Jš@™@JšžœS˜YJšœ˜J˜—šŸœž˜Jš œžœ žœžœžœžœžœ6˜‚Jšžœžœžœ˜Jš™Jš@™@JšžœN˜TJšœ˜J˜—šŸœž˜Jšœžœ žœžœžœžœžœ1žœžœ˜‰Jšžœžœžœ˜JšžœV˜\Jšœ˜J˜—šŸœž˜Jš œžœ žœžœžœžœžœ%˜qJšžœžœžœ˜JšžœQ˜WJšœ˜J˜—Jš%™%J˜JšŸ œžœ˜/JšŸœžœ˜3JšŸœžœ˜3J˜Jšœžœ4˜AJšœžœ3˜@J˜Jšžœ˜J˜˜!Jšœ“˜“——…—„ý