2
0

Console.txt 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. MODULE HostConsole;
  2. (* THISIS TEXT COPY OF Console.odc *)
  3. (* DO NOT EDIT *)
  4. IMPORT
  5. SYSTEM,
  6. Console,
  7. WinApi;
  8. TYPE
  9. Cons = POINTER TO RECORD (Console.Console) END;
  10. Process = POINTER TO RECORD (Console.Process) END;
  11. CONST
  12. inBufLen = 128; (* > 0 *)
  13. VAR
  14. cons: Cons;
  15. out, in: WinApi.HANDLE;
  16. ss: ARRAY 1024 OF SHORTCHAR;
  17. inBuf: ARRAY [untagged] inBufLen OF SHORTCHAR;
  18. inBufW, inBufR: INTEGER; (* 0 <= inBufR <= inBufW <= inBufLen *)
  19. version-: INTEGER;
  20. maintainer-: ARRAY 40 OF CHAR;
  21. PROCEDURE (cons: Cons) ReadLn (OUT text: ARRAY OF CHAR);
  22. VAR
  23. W: INTEGER;
  24. res: WinApi.BOOL;
  25. i: INTEGER;
  26. done: BOOLEAN;
  27. res1: INTEGER;
  28. BEGIN
  29. (* ReadLine -> ss, W *)
  30. W := 0;
  31. done := FALSE;
  32. REPEAT
  33. i := inBufR;
  34. WHILE (i < inBufW) & (inBuf[i] # 0AX) & (W < LEN(ss)) DO
  35. ss[W] := inBuf[i];
  36. INC(W);
  37. INC(i)
  38. END;
  39. IF i = inBufW THEN
  40. inBufW := 0; inBufR := 0;
  41. res := WinApi.ReadFile(in, SYSTEM.ADR(inBuf[0]), inBufLen, i, NIL);
  42. IF res # 0 THEN (* TRUE *)
  43. inBufW := i
  44. ELSE
  45. (* W := 0; *) done := TRUE
  46. END
  47. ELSIF inBuf[i] = 0AX THEN
  48. ss[W] := 0AX; INC(W); done := TRUE;
  49. inBufR := i + 1
  50. ELSE (* ss is too small *)
  51. W := 0; done := TRUE
  52. END
  53. UNTIL done;
  54. IF W > 0 THEN
  55. res1 := WinApi.MultiByteToWideChar(WinApi.CP_OEMCP, {}, ss, W, text, LEN(text) - 1);
  56. IF (res1 > 0) & (res1 < LEN(text)) THEN
  57. text[res1] := 0X
  58. ELSE
  59. text[0] := 0X
  60. END
  61. ELSE
  62. text[0] := 0X
  63. END
  64. END ReadLn;
  65. PROCEDURE Print (IN s: ARRAY OF CHAR; len: INTEGER);
  66. VAR res, written: INTEGER;
  67. BEGIN
  68. IF len > 0 THEN
  69. res := WinApi.WideCharToMultiByte(WinApi.CP_OEMCP, {}, s, len, ss, LEN(ss), NIL, NIL);
  70. IF (res > 0) & (res <= LEN(ss)) THEN
  71. res := WinApi.WriteFile(out, SYSTEM.ADR(ss[0]), res, written, NIL)
  72. END
  73. END
  74. END Print;
  75. PROCEDURE (cons: Cons) WriteChar (c: CHAR);
  76. VAR ss: ARRAY 1 OF CHAR;
  77. BEGIN
  78. ss[0] := c;
  79. Print(ss, 1)
  80. END WriteChar;
  81. PROCEDURE (cons: Cons) WriteStr (IN text: ARRAY OF CHAR);
  82. BEGIN
  83. Print(text, LEN(text$))
  84. END WriteStr;
  85. PROCEDURE (cons: Cons) WriteLn;
  86. BEGIN
  87. Print(0DX + 0AX, 2)
  88. END WriteLn;
  89. PROCEDURE (cons: Cons) Open;
  90. VAR res: WinApi.BOOL;
  91. BEGIN
  92. res := WinApi.AllocConsole()
  93. END Open;
  94. PROCEDURE (cons: Cons) Close;
  95. VAR res: WinApi.BOOL;
  96. BEGIN
  97. res := WinApi.FreeConsole()
  98. END Close;
  99. PROCEDURE (cons: Cons) CreateProcess (cmdLine: ARRAY OF CHAR): Console.Process;
  100. BEGIN
  101. (* needs coding *)
  102. RETURN NIL
  103. END CreateProcess;
  104. PROCEDURE (cons: Cons) CommandLine (OUT cmdLine: ARRAY OF CHAR);
  105. BEGIN
  106. END CommandLine;
  107. PROCEDURE (p: Process) Terminate;
  108. BEGIN
  109. (* needs coding *)
  110. END Terminate;
  111. PROCEDURE Maintainer;
  112. BEGIN
  113. version := 303;
  114. maintainer := "A.V.Shiryaev"
  115. END Maintainer;
  116. PROCEDURE Init;
  117. VAR res: WinApi.BOOL;
  118. BEGIN
  119. Maintainer;
  120. NEW(cons);
  121. res := WinApi.AllocConsole(); (* Open console on module load time *)
  122. out := WinApi.GetStdHandle(WinApi.STD_OUTPUT_HANDLE);
  123. in := WinApi.GetStdHandle(WinApi.STD_INPUT_HANDLE);
  124. inBufW := 0; inBufR := 0;
  125. Console.SetConsole(cons)
  126. END Init;
  127. BEGIN
  128. Init
  129. END HostConsole.