DIRECTORY IO, Rope; IOUtils: CEDAR DEFINITIONS SHARES IO = BEGIN ROPE: TYPE = Rope.ROPE; STREAM: TYPE = IO.STREAM; StreamProcs: TYPE = IO.StreamProcs; PFProcs: TYPE = REF PFProcsRecord; PFProcsRecord: TYPE; CopyPFProcs: PROC [stream: STREAM] RETURNS [new: PFProcs]; SetPFProcs: PROC [stream: STREAM, pfProcs: PFProcs] RETURNS [previous: PFProcs]; SetPFCodeProc: PROC [pfProcs: PFProcs, char: CHAR, codeProc: PFCodeProc] RETURNS [previous: PFCodeProc]; PFCodeProc: TYPE = PROC [stream: STREAM, val: IO.Value, format: Format, char: CHAR]; Format: TYPE = RECORD [form: ROPE, first: INT]; SetPFErrorProc: PROC [pfProcs: PFProcs, errorProc: PFErrorProc] RETURNS[previous: PFErrorProc]; PFErrorProc: TYPE = PROC [error: IO.ErrorCode, stream: STREAM]; PFErrorPrintPounds: PFErrorProc; PFErrorNoop: PFErrorProc; PFErrorError: PFErrorProc; SetDefaultPFCodeProc: PROC [char: CHAR, codeProc: PFCodeProc] RETURNS [previous: PFCodeProc]; SetDefaultPFErrorProc: PROC [errorProc: PFErrorProc] RETURNS [previous: PFErrorProc]; RegisterPrintRefAny: PROC [printRefAnyProc: PrintRefAnyProc]; PrintRefAnyProc: TYPE = PROC [stream: STREAM, refAny: REF READONLY ANY, depth: INT, width: INT, verbose: BOOL]; AddNAT: PROC [a, b: NAT] RETURNS [NAT] = INLINE { sum: CARDINAL = LOOPHOLE [a, CARDINAL] + LOOPHOLE [b, CARDINAL]; RETURN [IF sum > 0 THEN LOOPHOLE [sum, NAT] ELSE NAT.LAST]; }; closedStreamProcs: READONLY REF StreamProcs; GetCharViaUnsafeGetBlock: PROC [self: STREAM] RETURNS [CHAR]; GetBlockViaGetChar: PROC [self: STREAM, block: REF TEXT, startIndex: NAT, count: NAT] RETURNS [nBytesRead: NAT]; GetBlockViaUnsafeGetBlock: PROC [self: STREAM, block: REF TEXT, startIndex: NAT, count: NAT] RETURNS [nBytesRead: NAT]; UnsafeGetBlockViaGetChar: UNSAFE PROC [self: STREAM, block: IO.UnsafeBlock] RETURNS [nBytesRead: INT]; PutCharViaUnsafePutBlock: PROC [self: STREAM, char: CHAR]; PutBlockViaPutChar: PROC [self: STREAM, block: REF READONLY TEXT, startIndex: NAT, count: NAT]; PutBlockViaUnsafePutBlock: PROC [self: STREAM, block: REF READONLY TEXT, startIndex: NAT, count: NAT]; UnsafePutBlockViaPutChar: PROC [self: STREAM, block: IO.UnsafeBlock]; AmbushStream: PROC [self: STREAM, streamProcs: REF IO.StreamProcs, streamData: REF ANY, reusing: STREAM _ NIL]; UnAmbushStream: PROC [self: STREAM]; StoreData: PROC [self: STREAM, key: ATOM, data: REF ANY]; LookupData: PROC [self: STREAM, key: ATOM] RETURNS [REF ANY]; RemoveData: PROC [self: STREAM, key: ATOM]; StoreProc: PROC [class: REF StreamProcs, key: ATOM, procRef: REF ANY]; LookupProc: PROC [self: STREAM, key: ATOM] RETURNS [procRef: REF ANY]; END. θIOUtils.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. MBrown on September 18, 1983 6:57 pm Russ Atkinson (RRA) February 2, 1985 1:01:03 pm PST Beach, February 27, 1985 10:22:33 am PST Procedures of interest to STREAM implementors Printing The following procedures are used to change PutF's interpretation of the format string or its error handling. Note that PFProcs are bound to a stream instance, not to a stream class or globally. ! IO.Error [PFInvalidPFProcs, NIL]: pfProcs = NIL (pfProcs was not obtained from CopyPFProcs.) ! IO.Error [PFInvalidCode, NIL]: char is not IN ['A..'Z] or ['a..'z]. The following procedures are used to change PutF's interpretation of the format string or its error handling. Note that PFProcs are bound to a stream instance, not to a stream class or globally. The following procedure establishes the implementation of PrintRefAny to be used by Put and PutF (the default implementation just prints the REF itself, in octal): Implementing a stream class Procs for a closed stream (variety = $inputOutput, class = $Closed): Reset and Close are no-op, other procs raise ERROR IO.Error[$StreamClosed, self]. Property list manipulation CHANGE LOG Created by MBrown on August 31, 1983 9:55 am Κ˜codešœ ™ Kšœ Οmœ1™4