CreateRefStreamProcs:
PUBLIC
PROC[
getChar: PROC[self: STREAM] RETURNS[CHARACTER] ← NIL,
endOf: PROC[self: STREAM] RETURNS[BOOLEAN] ← NIL,
charsAvail: PROC[self: STREAM] RETURNS[BOOLEAN] ← NIL,
getBlock: PROC[self: STREAM, block: REF TEXT, startIndex: NAT, stopIndexPlusOne: NAT] RETURNS[nBytesRead: NAT] ← NIL,
unsafeGetBlock: UNSAFE PROC[self: STREAM, block: UnsafeBlock] RETURNS[nBytesRead: INT] ← NIL,
putChar: PROC[self: STREAM, char: CHARACTER] ← NIL,
putBlock: PROC[self: STREAM, block: REF READONLY TEXT, startIndex: NAT, stopIndexPlusOne: NAT] ← NIL,
unsafePutBlock: PROC[self: STREAM, block: UnsafeBlock] ← NIL,
flush: PROC[self: STREAM] ← NIL,
reset: PROC[self: STREAM] ← NIL,
close: PROC[self: STREAM, abort: BOOLEAN ← FALSE] ← NIL,
getIndex: PROC[self: STREAM] RETURNS [INT] ← NIL,
setIndex: PROC[self: STREAM, index: INT] ← NIL,
getLength: PROC[self: STREAM] RETURNS [length: INT] ← NIL,
setLength: PROC[self: STREAM, length: INT] ← NIL,
backup: PROC[self: STREAM, char: CHARACTER] ← NIL,
userAbort: PROC[self: STREAM] RETURNS[abort: BOOLEAN] ← NIL,
setUserAbort: PROC[self: STREAM] ← NIL,
resetUserAbort: PROC[self: STREAM] ← NIL,
setEcho: PROC[self: STREAM, echoTo: STREAM] RETURNS [oldEcho: STREAM] ← NIL,
eraseChar: PROC[self: STREAM, char: CHARACTER] ← NIL,
currentPosition: PROC[self: STREAM] RETURNS[position: INT] ← NIL,
name: ROPE ← NIL
]
RETURNS [REF StreamProcs] = {
AddProc:
SAFE
PROC [operation, via:
PROC
ANY
RETURNS
ANY, procRef:
REF
ANY, key:
ATOM] = {
streamProcs.otherStreamProcs ← Zone.CONS[Zone.NEW[StreamPropertyRecord ← [operation: operation, via: via, proc: procRef, key: key]], streamProcs.otherStreamProcs]
};
streamProcs:
REF StreamProcs ← Zone.
NEW[StreamProcs ← [
getChar: IF getChar = NIL THEN DefaultGetChar ELSE getChar,
endOf: IF endOf = NIL THEN DefaultEndOf ELSE endOf,
charsAvail: IF charsAvail = NIL THEN DefaultCharsAvail ELSE charsAvail,
getBlock: IF getBlock = NIL THEN DefaultGetBlock ELSE getBlock,
unsafeGetBlock: IF unsafeGetBlock = NIL THEN DefaultUnsafeGetBlock ELSE unsafeGetBlock,
putChar: IF putChar = NIL THEN DefaultPutChar ELSE putChar,
putBlock: IF putBlock = NIL THEN DefaultPutBlock ELSE putBlock,
unsafePutBlock: IF unsafePutBlock = NIL THEN DefaultUnsafePutBlock ELSE unsafePutBlock,
flush: IF flush = NIL THEN DefaultFlush ELSE flush,
reset: IF reset = NIL THEN DefaultReset ELSE reset,
close: IF close = NIL THEN DefaultClose ELSE close,
getIndex: IF getIndex = NIL THEN DefaultGetIndex ELSE getIndex,
setIndex: IF setIndex = NIL THEN DefaultSetIndex ELSE setIndex,
name:
IF name =
NIL
THEN "Anonymous"
ELSE name
]] ;
IF getLength # NIL THEN AddProc[operation: GetLength, via: getLength, procRef: Zone.NEW[TypeOfGetLength ← getLength], key: $GetLength];
IF setLength # NIL THEN AddProc[operation: SetLength, via: setLength, procRef: Zone.NEW[TypeOfSetLength ← setLength], key: $SetLength];
IF backup # NIL THEN AddProc[operation: Backup, via: backup, procRef: Zone.NEW[TypeOfBackup ← backup], key: $Backup];
IF userAbort # NIL THEN AddProc[operation: UserAbort, via: userAbort, procRef: Zone.NEW[TypeOfUserAbort ← userAbort], key: $UserAbort];
IF setUserAbort # NIL THEN AddProc[operation: SetUserAbort, via: setUserAbort, procRef: Zone.NEW[TypeOfSetUserAbort ← setUserAbort], key: $SetUserAbort];
IF resetUserAbort # NIL THEN AddProc[operation: ResetUserAbort, via: resetUserAbort, procRef: Zone.NEW[TypeOfResetUserAbort ← resetUserAbort], key: $ResetUserAbort];
IF setEcho # NIL THEN AddProc[operation: SetEcho, via: setEcho, procRef: Zone.NEW[TypeOfSetEcho ← setEcho], key: $SetEcho];
IF eraseChar # NIL THEN AddProc[operation: EraseChar, via: eraseChar, procRef: Zone.NEW[TypeOfEraseChar ← eraseChar], key: $EraseChar];
IF currentPosition # NIL THEN AddProc[operation: CurrentPosition, via: currentPosition, procRef: Zone.NEW[TypeOfCurrentPosition ← currentPosition], key: $CurrentPosition];
};
-- of CreateRefStreamProcs