DEADSOFTWARE

* -> old; Trurl-based -> new
[bbcp.git] / new / _Windows_ / Host / Mod / Console.txt
1 MODULE HostConsole;
3 (* THIS IS TEXT COPY OF Console.odc *)
4 (* DO NOT EDIT *)
6 (*
7 A. V. Shiryaev, 2012.10
9 Console implementation for Windows
10 *)
12 IMPORT SYSTEM, Console, WinApi;
14 TYPE
15 Cons = POINTER TO RECORD (Console.Console) END;
17 CONST
18 inBufLen = 128; (* > 0 *)
20 VAR
21 cons: Cons;
22 out, in: WinApi.HANDLE;
24 ss: ARRAY 1024 OF SHORTCHAR;
26 inBuf: ARRAY [untagged] inBufLen OF SHORTCHAR;
27 inBufW, inBufR: INTEGER; (* 0 <= inBufR <= inBufW <= inBufLen *)
29 PROCEDURE (cons: Cons) ReadLn (OUT text: ARRAY OF CHAR);
30 VAR
31 W: INTEGER;
32 res: WinApi.BOOL;
33 i: INTEGER;
34 done: BOOLEAN;
35 res1: INTEGER;
36 BEGIN
37 (* ReadLine -> ss, W *)
38 W := 0;
39 done := FALSE;
40 REPEAT
41 i := inBufR;
42 WHILE (i < inBufW) & (inBuf[i] # 0AX) & (W < LEN(ss)) DO
43 ss[W] := inBuf[i];
44 INC(W);
45 INC(i)
46 END;
47 IF i = inBufW THEN
48 inBufW := 0; inBufR := 0;
49 res := WinApi.ReadFile(in, SYSTEM.ADR(inBuf[0]), inBufLen, i, NIL);
50 IF res # 0 THEN (* TRUE *)
51 inBufW := i
52 ELSE
53 (* W := 0; *) done := TRUE
54 END
55 ELSIF inBuf[i] = 0AX THEN
56 ss[W] := 0AX; INC(W); done := TRUE;
57 inBufR := i + 1
58 ELSE (* ss is too small *)
59 W := 0; done := TRUE
60 END
61 UNTIL done;
63 IF W > 0 THEN
64 res1 := WinApi.MultiByteToWideChar(WinApi.CP_OEMCP, {}, ss, W, text, LEN(text) - 1);
65 IF (res1 > 0) & (res1 < LEN(text)) THEN
66 text[res1] := 0X
67 ELSE
68 text[0] := 0X
69 END
70 ELSE
71 text[0] := 0X
72 END
73 END ReadLn;
75 PROCEDURE Print (IN s: ARRAY OF CHAR; len: INTEGER);
76 VAR res, written: INTEGER;
77 BEGIN
78 IF len > 0 THEN
79 res := WinApi.WideCharToMultiByte(WinApi.CP_OEMCP, {}, s, len, ss, LEN(ss), NIL, NIL);
80 IF (res > 0) & (res <= LEN(ss)) THEN
81 res := WinApi.WriteFile(out, SYSTEM.ADR(ss[0]), res, written, NIL)
82 END
83 END
84 END Print;
86 PROCEDURE (cons: Cons) WriteChar (c: CHAR);
87 VAR ss: ARRAY 1 OF CHAR;
88 BEGIN
89 ss[0] := c;
90 Print(ss, 1)
91 END WriteChar;
93 PROCEDURE (cons: Cons) WriteStr (IN text: ARRAY OF CHAR);
94 BEGIN
95 Print(text, LEN(text$))
96 END WriteStr;
98 PROCEDURE (cons: Cons) WriteLn;
99 BEGIN
100 Print(0DX + 0AX, 2)
101 END WriteLn;
103 PROCEDURE Init;
104 VAR res: WinApi.BOOL;
105 BEGIN
106 NEW(cons);
108 res := WinApi.AllocConsole(); (* Open console on module load time *)
110 out := WinApi.GetStdHandle(WinApi.STD_OUTPUT_HANDLE);
111 in := WinApi.GetStdHandle(WinApi.STD_INPUT_HANDLE);
113 inBufW := 0; inBufR := 0;
115 Console.SetConsole(cons)
116 END Init;
118 BEGIN
119 Init
120 END HostConsole.