libm3/src/os/WIN32/LazyConsole.m3


 Copyright 1996-2000, Critical Mass, Inc.  All rights reserved. 
 See file COPYRIGHT-CMASS for details. 

UNSAFE MODULE LazyConsole;

IMPORT File, FileWin32, OSError, Terminal, WinBase, WinCon, WinDef;

TYPE
  T = Terminal.T OBJECT
    hd    : WinDef.DWORD;
    setup : BOOLEAN := FALSE;
  OVERRIDES
    read   := Read;
    write  := Write;
    close  := Close;
    status := Status;
  END;

PROCEDURE New (hd: WinDef.DWORD; ds: FileWin32.DirectionSet): File.T =
  BEGIN
    RETURN NEW (T, ds := ds, hd := hd);
  END New;

PROCEDURE Read (t: T;  VAR(*OUT*) b: ARRAY OF File.Byte;
                mayBlock: BOOLEAN): INTEGER
  RAISES {OSError.E} =
  BEGIN
    Init (t);
    RETURN Terminal.T.read (t, b, mayBlock);
  END Read;

PROCEDURE Write (t: T;  READONLY b: ARRAY OF File.Byte)
  RAISES {OSError.E} =
  BEGIN
    IF (NUMBER (b) <= 0) THEN RETURN; END;
    Init (t);
    Terminal.T.write (t, b);
  END Write;

PROCEDURE Close (t: T)
  RAISES {OSError.E} =
  BEGIN
    IF (t.setup) THEN
      Terminal.T.close (t);
    END;
  END Close;

PROCEDURE Status (<*UNUSED*> t: T): File.Status =
  VAR status: File.Status;
  BEGIN
    status.modificationTime := 0.0d0;
    status.type := Terminal.FileType;
    status.size := 0;
    RETURN status;
  END Status;

PROCEDURE Init (t: T) =
  BEGIN
    IF (NOT t.setup) THEN
      t.setup := TRUE;
      EVAL WinCon.AllocConsole ();  (* make sure we've got one! *)
      t.handle := WinBase.GetStdHandle (t.hd);
    END;
  END Init;

BEGIN
END LazyConsole.