123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- MODULE HostConsole;
- (* THISIS TEXT COPY OF Console.odc *)
- (* DO NOT EDIT *)
- IMPORT
- SYSTEM,
- Console,
- WinApi;
- TYPE
- Cons = POINTER TO RECORD (Console.Console) END;
- Process = POINTER TO RECORD (Console.Process) END;
- CONST
- inBufLen = 128; (* > 0 *)
- VAR
- cons: Cons;
- out, in: WinApi.HANDLE;
- ss: ARRAY 1024 OF SHORTCHAR;
- inBuf: ARRAY [untagged] inBufLen OF SHORTCHAR;
- inBufW, inBufR: INTEGER; (* 0 <= inBufR <= inBufW <= inBufLen *)
- version-: INTEGER;
- maintainer-: ARRAY 40 OF CHAR;
- PROCEDURE (cons: Cons) ReadLn (OUT text: ARRAY OF CHAR);
- VAR
- W: INTEGER;
- res: WinApi.BOOL;
- i: INTEGER;
- done: BOOLEAN;
- res1: INTEGER;
- BEGIN
- (* ReadLine -> ss, W *)
- W := 0;
- done := FALSE;
- REPEAT
- i := inBufR;
- WHILE (i < inBufW) & (inBuf[i] # 0AX) & (W < LEN(ss)) DO
- ss[W] := inBuf[i];
- INC(W);
- INC(i)
- END;
- IF i = inBufW THEN
- inBufW := 0; inBufR := 0;
- res := WinApi.ReadFile(in, SYSTEM.ADR(inBuf[0]), inBufLen, i, NIL);
- IF res # 0 THEN (* TRUE *)
- inBufW := i
- ELSE
- (* W := 0; *) done := TRUE
- END
- ELSIF inBuf[i] = 0AX THEN
- ss[W] := 0AX; INC(W); done := TRUE;
- inBufR := i + 1
- ELSE (* ss is too small *)
- W := 0; done := TRUE
- END
- UNTIL done;
- IF W > 0 THEN
- res1 := WinApi.MultiByteToWideChar(WinApi.CP_OEMCP, {}, ss, W, text, LEN(text) - 1);
- IF (res1 > 0) & (res1 < LEN(text)) THEN
- text[res1] := 0X
- ELSE
- text[0] := 0X
- END
- ELSE
- text[0] := 0X
- END
- END ReadLn;
- PROCEDURE Print (IN s: ARRAY OF CHAR; len: INTEGER);
- VAR res, written: INTEGER;
- BEGIN
- IF len > 0 THEN
- res := WinApi.WideCharToMultiByte(WinApi.CP_OEMCP, {}, s, len, ss, LEN(ss), NIL, NIL);
- IF (res > 0) & (res <= LEN(ss)) THEN
- res := WinApi.WriteFile(out, SYSTEM.ADR(ss[0]), res, written, NIL)
- END
- END
- END Print;
- PROCEDURE (cons: Cons) WriteChar (c: CHAR);
- VAR ss: ARRAY 1 OF CHAR;
- BEGIN
- ss[0] := c;
- Print(ss, 1)
- END WriteChar;
- PROCEDURE (cons: Cons) WriteStr (IN text: ARRAY OF CHAR);
- BEGIN
- Print(text, LEN(text$))
- END WriteStr;
- PROCEDURE (cons: Cons) WriteLn;
- BEGIN
- Print(0DX + 0AX, 2)
- END WriteLn;
- PROCEDURE (cons: Cons) Open;
- VAR res: WinApi.BOOL;
- BEGIN
- res := WinApi.AllocConsole()
- END Open;
- PROCEDURE (cons: Cons) Close;
- VAR res: WinApi.BOOL;
- BEGIN
- res := WinApi.FreeConsole()
- END Close;
- PROCEDURE (cons: Cons) CreateProcess (cmdLine: ARRAY OF CHAR): Console.Process;
- BEGIN
- (* needs coding *)
- RETURN NIL
- END CreateProcess;
- PROCEDURE (cons: Cons) CommandLine (OUT cmdLine: ARRAY OF CHAR);
- BEGIN
- END CommandLine;
- PROCEDURE (p: Process) Terminate;
- BEGIN
- (* needs coding *)
- END Terminate;
- PROCEDURE Maintainer;
- BEGIN
- version := 303;
- maintainer := "A.V.Shiryaev"
- END Maintainer;
- PROCEDURE Init;
- VAR res: WinApi.BOOL;
- BEGIN
- Maintainer;
- NEW(cons);
- res := WinApi.AllocConsole(); (* Open console on module load time *)
- out := WinApi.GetStdHandle(WinApi.STD_OUTPUT_HANDLE);
- in := WinApi.GetStdHandle(WinApi.STD_INPUT_HANDLE);
- inBufW := 0; inBufR := 0;
- Console.SetConsole(cons)
- END Init;
- BEGIN
- Init
- END HostConsole.
|