DIRECTORY Atom USING [GetPropFromList, PropList, PutPropOnList, RemPropFromList], IO, Rope; IOUtils: CEDAR DEFINITIONS IMPORTS Atom 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; 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] = INLINE { self.propList _ Atom.PutPropOnList[self.propList, key, data] }; LookupData: PROC [self: STREAM, key: ATOM] RETURNS [REF ANY] = INLINE { RETURN[Atom.GetPropFromList[self.propList, key]] }; RemoveData: PROC [self: STREAM, key: ATOM] = INLINE { self.propList _ Atom.RemPropFromList[self.propList, key] }; StoreProc: PROC [class: REF StreamProcs, key: ATOM, procRef: REF ANY] = INLINE { class.propList _ Atom.PutPropOnList[class.propList, key, procRef] }; LookupProc: PROC [self: STREAM, key: ATOM] RETURNS [procRef: REF ANY] = INLINE { RETURN[Atom.GetPropFromList[self.streamProcs.propList, key]] }; END. CHANGE LOG Created by MBrown on August 31, 1983 9:55 am ‚IOUtils.mesa This interface defines procedures that are of interest primarily to implementors of elaborate stream classes. Last edited by: MBrown on September 18, 1983 6:57 pm 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 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]. Κ ˜Iheadšœ ™ bodyšœm™mšœ™Jšœ$™$——˜šΟk ˜ Jšœœ=˜GJšœ˜J˜J˜——š Πblœœ œœœœ˜3Jš˜Jšœœœ˜Jšœœœœ˜Jšœ œœ ˜#—™J™ΓJ™Jšœ œœ˜"Jšœœ˜JšΟn œœ œœ˜:JšŸ œœ œœ˜PunitšŸ œœœ˜HJšœ˜Jšœœ œ-™^Jšœœœ™Eš Ÿ œœœ œœœ˜TJš œœœœ œ˜/——J˜šŸœœ+˜?Jšœ˜Mš Ÿ œœœ œœ˜?MšŸœ˜ JšŸ œ˜JšŸ œ˜—J™Jšœœ™£šŸœœ$˜=šœ œ œ˜-Jš œœ œ œ œ œ˜A———™š Ÿœœœœœœ˜1Jš Οr Πkr  ‘  ˜@Jšœœ œ‘ œœœœœ˜;J˜—šŸœœœ ˜,Jšœrœœ™–—Mš Ÿœœœœœ˜=šŸœœœ œœœ œ˜UJšœœ˜—šŸœœœ œœœ œ˜\Jšœœ˜—š Ÿœœœœ œ ˜KJšœœ˜—MšŸœœœœ˜:MšŸœœœ œœœœ œ˜_MšŸœœœ œœœœ œ˜fMšŸœœœ œ˜EJ˜JšŸ œœœœœœœ œœ˜oJ˜JšŸœœœ˜$J˜š Ÿ œœœœœœ˜8Jšœœ œ/˜J—šŸ œœœœœœœ˜—šŸ œœœœ˜*Jšœœ œ+˜FJ˜—š Ÿ œœ œœ œœ˜EJšœœ œ3˜O—šŸ œœœœœ œœ˜EJšœœœ9˜J——J˜Jšœ˜J˜Jšœ˜ J˜J˜,J˜J˜—…— pύ