-- Stream.mesa (last edited by: McJones on: August 13, 1980 5:07 PM)
DIRECTORY
Environment USING [Block, Byte, Word];
Stream: DEFINITIONS =
BEGIN
-- Types
Handle: TYPE = POINTER TO Object;
Byte: TYPE = Environment.Byte;
Word: TYPE = Environment.Word;
SubSequenceType: TYPE = [0..256);
Block: TYPE = Environment.Block;
InputOptions: TYPE = RECORD [
terminateOnEndPhysicalRecord, signalLongBlock, signalShortBlock, signalSSTChange, signalEndOfStream:
BOOLEAN];
defaultInputOptions: InputOptions = [FALSE, FALSE, FALSE, FALSE, FALSE];
CompletionCode: TYPE = {normal, endRecord, sstChange, endOfStream};
-- Operations
GetByte: PROCEDURE [sH: Handle] RETURNS [byte: Byte] = INLINE {RETURN[sH.getByte[sH]]};
-- Get the next byte from the stream.
GetChar: PROCEDURE [sH: Handle] RETURNS [char: CHARACTER] = INLINE {RETURN[LOOPHOLE[sH.getByte[sH]]]};
-- Get the next character from the stream.
GetWord: PROCEDURE [sH: Handle] RETURNS [word: Word] = INLINE {RETURN[sH.getWord[sH]]};
-- Get the next two bytes from the stream, and return them in a word (first in left half).
GetBlock: PROCEDURE [sH: Handle, block: Block]
RETURNS [bytesTransferred: CARDINAL, why: CompletionCode, sst: SubSequenceType] = INLINE {[bytesTransferred, why, sst] ← sH.get[sH, block, sH.options]};
-- Get the next zero or more bytes from the stream, moving them to the specified block of memory.
SetInputOptions: PROCEDURE [sH: Handle, options: InputOptions] = INLINE {sH.options ← options};
-- Set the input options of the stream.
PutByte: PROCEDURE [sH: Handle, byte: Byte] = INLINE {sH.putByte[sH, byte]};
-- Put a byte at the next available position in the stream.
PutChar: PROCEDURE [sH: Handle, char: CHARACTER] = INLINE
{sH.putByte[sH,
LOOPHOLE[char]]};
-- Put a character at the next available position in the stream.
PutWord: PROCEDURE [sH: Handle, word: Word] = INLINE {sH.putWord[sH, word]};
-- Put two bytes into the next available positions in the stream, left half of word first.
PutBlock: PROCEDURE [sH: Handle, block: Block, endPhysicalRecord: BOOLEANFALSE] = INLINE {sH.put[sH, block, endPhysicalRecord]};
-- Put zero or more bytes into the next available positions in the stream, moving them from a block in memory.
SendNow: PROCEDURE [sH: Handle] = INLINE {bl: Block = [NIL, 0, 0]; sH.put[sH, bl, TRUE]};
-- Terminate the current physical record.
SetSST: PROCEDURE [sH: Handle, sst: SubSequenceType] = INLINE {sH.setSST[sH, sst]};
-- Change the current SubSequenceType.
SendAttention: PROCEDURE [sH: Handle, byte: Byte] = INLINE {sH.sendAttention[sH, byte]};
-- Send an attention down the stream.
WaitForAttention: PROCEDURE [sH: Handle] RETURNS [Byte] = INLINE {RETURN[sH.waitAttention[sH]]};
-- Wait for an attention to arrive.
Delete: PROCEDURE [sH: Handle] = INLINE {sH.delete[sH]};
-- Delete the stream object.
-- Signals and errors
EndOfStream: SIGNAL [nextIndex: CARDINAL];
LongBlock: SIGNAL [nextIndex: CARDINAL];
ShortBlock: ERROR;
SSTChange: SIGNAL [sst: SubSequenceType, nextIndex: CARDINAL];
TimeOut: SIGNAL [nextIndex: CARDINAL];
-- Representation
Object: TYPE = RECORD [
options: InputOptions,
getByte: GetByteProcedure,
putByte: PutByteProcedure,
getWord: GetWordProcedure,
putWord: PutWordProcedure,
get: GetProcedure,
put: PutProcedure,
setSST: SetSSTProcedure,
sendAttention: SendAttentionProcedure,
waitAttention: WaitAttentionProcedure,
delete: DeleteProcedure];
GetByteProcedure: TYPE = PROCEDURE [sH: Handle] RETURNS [byte: Byte];
PutByteProcedure: TYPE = PROCEDURE [sH: Handle, byte: Byte];
GetWordProcedure: TYPE = PROCEDURE [sH: Handle] RETURNS [word: Word];
PutWordProcedure: TYPE = PROCEDURE [sH: Handle, word: Word];
GetProcedure: TYPE = PROCEDURE [sH: Handle, block: Block, options: InputOptions] RETURNS [bytesTransferred: CARDINAL, why: CompletionCode, sst: SubSequenceType];
PutProcedure: TYPE = PROCEDURE [sH: Handle, block: Block, endPhysicalRecord: BOOLEAN];
SetSSTProcedure: TYPE = PROCEDURE [sH: Handle, sst: SubSequenceType];
SendAttentionProcedure: TYPE = PROCEDURE [sH: Handle, byte: Byte];
WaitAttentionProcedure: TYPE = PROCEDURE [sH: Handle] RETURNS [Byte];
DeleteProcedure: TYPE = PROCEDURE [sH: Handle];
-- The following are default values for stream object records
defaultObject: READONLY Object;
-- = [
--
options: defaultInputOptions, (see above)
--
getByte: DefaultGetByte, (requires sH.get defined)
--
putByte: DefaultPutByte, (requires sH.put defined)
--
getWord: DefaultGetWord, (requires one of sH.getByte or sH.get defined)
--
putWord: DefaultPutWord, (requires one of sH.putByte or sH.put defined)
--
get: DefaultGet, (requires sH.getByte defined)
--
put: DefaultPut, (requires sH.putByte defined)
--
setSST: DefaultSetSST, (raises Runtime.UnboundProcedure)
--
sendAttention: DefaultSendAttention, (raises Runtime.UnboundProcedure)
--
waitAttention: DefaultWaitAttention, (raises Runtime.UnboundProcedure)
--
delete: DefaultDelete];(raises Runtime.UnboundProcedure)
END.
LOG
Time: March 17, 1978 11:39 AM By: LauerAction: Created file
Time: April 6, 1978 3:24 PMBy: LauerAction: Updated to conform to revised Functional Specifications
Time: April 18, 1978 9:58 AMBy: LauerAction: Updated for compilation by Alpha release of Mesa 4.0 (LONG POINTER is allowed).
Time: May 5, 1978 2:19 PMBy: LauerAction: Added GetWord and PutWord
Time: June 22, 1978 8:57 AMBy: LauerAction: Added EndOfStream signal, input option, and completion code
Time: July 21, 1978 11:31 AMBy: LauerAction: Moved type Block from Stream to Environment; added GetChar and PutChar
Time: August 14, 1978 2:03 PMBy: LauerAction: Deleted DeleteModule (can be simulated by Runtime.UnNew[GlobalFrame[p]]; moved "DeleteModuleAfterReturn" to Runtime and renamed it SelfDestruct
Time: February 22, 1979 2:50 PM By: DalalAction: Moved a large number of procedures from StreamImpl.mesa to this module as INLINEs; added the parameter sH to all the procedures of Stream.Object; added Delete
Time: March 13, 1979 10:17 AM By: DalalAction: Modified SendAttention and WaitForAttention to take and return a byte of data respectively
Time: February 1, 1980 7:16 PM By: McJonesAction: Added object procedures for get/put byte/word; new defaults
Time: August 13, 1980 5:07 PM By: McJonesAction: Deleted defaults within definition of Object