-- StreamAltoDefault.mesa last edited by: HGM on: January 15, 1981  10:44 PM

DIRECTORY
  Environment USING [Block, Byte],
  Stream;

StreamAltoDefault: PROGRAM EXPORTS Stream =
  BEGIN OPEN Stream;
  Unimplemented: ERROR = CODE;
  LeftAndRight: TYPE = MACHINE DEPENDENT RECORD [left, right: Environment.Byte];
  -- Stream implementation (defaults)
  defaultObject: PUBLIC Object ←
    [options: defaultInputOptions, getByte: DefaultGetByte,
      putByte: DefaultPutByte, getWord: DefaultGetWord, putWord: DefaultPutWord,
      get: DefaultGet, put: DefaultPut, setSST: NIL, sendAttention: NIL,
      waitAttention: NIL, delete: NIL];
  DefaultGetByte: PROCEDURE [sH: Handle] RETURNS [byte: Byte] =
    BEGIN
    array: PACKED ARRAY [0..1] OF Byte;
    options: InputOptions = [FALSE, FALSE, FALSE, TRUE, TRUE];
    IF sH.get = DefaultGet THEN ERROR Unimplemented;
    [] ← sH.get[sH, Block[@array, 1, 2], options];
    RETURN[array[1]] -- right-justify the byte

    END;

  DefaultGetWord: PROCEDURE [sH: Handle] RETURNS [word: Word] =
    BEGIN OPEN w: LOOPHOLE[word, LeftAndRight];
    options: InputOptions = [FALSE, FALSE, FALSE, TRUE, TRUE];
    SELECT TRUE FROM
      sH.getByte ~= DefaultGetByte =>
	BEGIN w.left ← sH.getByte[sH]; w.right ← sH.getByte[sH]; END;
      sH.get ~= DefaultGet => [] ← sH.get[sH, Block[@word, 0, 2], options];
      ENDCASE => ERROR Unimplemented;
    END;

  DefaultGet: PROCEDURE [sH: Handle, block: Block, options: InputOptions]
    RETURNS [
      bytesTransferred: CARDINAL, why: CompletionCode, sst: SubSequenceType] =
    BEGIN ERROR Unimplemented; END;

  DefaultPutByte: PROCEDURE [sH: Handle, byte: Byte] =
    BEGIN
    array: PACKED ARRAY [0..1] OF Byte ← [0, byte];
    IF sH.put = DefaultPut THEN ERROR Unimplemented;
    sH.put[sH, Block[@array, 1, 2], FALSE];
    END;

  DefaultPutWord: PROCEDURE [sH: Handle, word: Word] =
    BEGIN OPEN w: LOOPHOLE[word, LeftAndRight];
    SELECT TRUE FROM
      sH.putByte ~= DefaultPutByte =>
	BEGIN sH.putByte[sH, w.left]; sH.putByte[sH, w.right]; END;
      sH.put ~= DefaultPut => sH.put[sH, Block[@word, 0, 2], FALSE];
      ENDCASE => ERROR Unimplemented;
    END;

  DefaultPut: PROCEDURE [sH: Handle, block: Block, endPhysicalRecord: BOOLEAN] =
    BEGIN ERROR Unimplemented; END;

  END.