3 * CONSOLE.C - console input/output functions.
8 * 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
15 #define OUTPUT_BUFFER_SIZE 4096
18 VOID
ConInDisable (VOID
)
20 HANDLE hInput
= GetStdHandle (STD_INPUT_HANDLE
);
23 GetConsoleMode (hInput
, &dwMode
);
24 dwMode
&= ~ENABLE_PROCESSED_INPUT
;
25 SetConsoleMode (hInput
, dwMode
);
29 VOID
ConInEnable (VOID
)
31 HANDLE hInput
= GetStdHandle (STD_INPUT_HANDLE
);
34 GetConsoleMode (hInput
, &dwMode
);
35 dwMode
|= ENABLE_PROCESSED_INPUT
;
36 SetConsoleMode (hInput
, dwMode
);
40 VOID
ConInDummy (VOID
)
42 HANDLE hInput
= GetStdHandle (STD_INPUT_HANDLE
);
47 if (hInput
== INVALID_HANDLE_VALUE
)
48 DebugPrintf (_T("Invalid input handle!!!\n"));
50 ReadConsoleInput (hInput
, &dummy
, 1, &dwRead
);
53 VOID
ConInFlush (VOID
)
55 FlushConsoleInputBuffer (GetStdHandle (STD_INPUT_HANDLE
));
59 VOID
ConInKey (PINPUT_RECORD lpBuffer
)
61 HANDLE hInput
= GetStdHandle (STD_INPUT_HANDLE
);
65 if (hInput
== INVALID_HANDLE_VALUE
)
66 DebugPrintf (_T("Invalid input handle!!!\n"));
71 ReadConsoleInput (hInput
, lpBuffer
, 1, &dwRead
);
72 if ((lpBuffer
->EventType
== KEY_EVENT
) &&
73 (lpBuffer
->Event
.KeyEvent
.bKeyDown
== TRUE
))
81 VOID
ConInString (LPTSTR lpInput
, DWORD dwLength
)
92 pBuf
= (PCHAR
)malloc(dwLength
);
96 ZeroMemory (lpInput
, dwLength
* sizeof(TCHAR
));
97 hFile
= GetStdHandle (STD_INPUT_HANDLE
);
98 GetConsoleMode (hFile
, &dwOldMode
);
100 SetConsoleMode (hFile
, ENABLE_LINE_INPUT
| ENABLE_ECHO_INPUT
);
102 ReadFile (hFile
, (PVOID
)pBuf
, dwLength
, &dwRead
, NULL
);
105 MultiByteToWideChar(CP_ACP
, 0, pBuf
, dwLength
+ 1, lpInput
, dwLength
+ 1);
108 for (i
= 0; i
< dwRead
; i
++, p
++)
110 if (*p
== _T('\x0d'))
121 SetConsoleMode (hFile
, dwOldMode
);
124 static VOID
ConChar(TCHAR c
, DWORD nStdHandle
)
133 WideCharToMultiByte(CP_ACP
, 0, ws
, 2, as
, 2, NULL
, NULL
);
138 WriteFile (GetStdHandle (nStdHandle
),
145 VOID
ConOutChar (TCHAR c
)
147 ConChar(c
, STD_OUTPUT_HANDLE
);
150 VOID
ConPuts(LPTSTR szText
, DWORD nStdHandle
)
156 len
= _tcslen(szText
);
158 pBuf
= malloc(len
+ 1);
159 len
= WideCharToMultiByte(CP_ACP
, 0, szText
, len
+ 1, pBuf
, len
+ 1, NULL
, NULL
) - 1;
163 WriteFile (GetStdHandle (nStdHandle
),
168 WriteFile (GetStdHandle (nStdHandle
),
178 VOID
ConOutPuts (LPTSTR szText
)
180 ConPuts(szText
, STD_OUTPUT_HANDLE
);
184 VOID
ConPrintf(LPTSTR szFormat
, va_list arg_ptr
, DWORD nStdHandle
)
188 TCHAR szOut
[OUTPUT_BUFFER_SIZE
];
191 len
= _vstprintf (szOut
, szFormat
, arg_ptr
);
193 pBuf
= malloc(len
+ 1);
194 len
= WideCharToMultiByte(CP_ACP
, 0, szOut
, len
+ 1, pBuf
, len
+ 1, NULL
, NULL
) - 1;
198 WriteFile (GetStdHandle (nStdHandle
),
208 VOID
ConOutFormatMessage (DWORD MessageId
, ...)
214 va_start (arg_ptr
, MessageId
);
215 ret
= FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_SYSTEM
,
218 MAKELANGID(LANG_NEUTRAL
, SUBLANG_DEFAULT
),
231 ConErrPrintf (_T("Unknown error: %d\n"), MessageId
);
235 VOID
ConOutPrintf (LPTSTR szFormat
, ...)
239 va_start (arg_ptr
, szFormat
);
240 ConPrintf(szFormat
, arg_ptr
, STD_OUTPUT_HANDLE
);
244 VOID
ConErrChar (TCHAR c
)
246 ConChar(c
, STD_ERROR_HANDLE
);
250 VOID
ConErrPuts (LPTSTR szText
)
252 ConPuts(szText
, STD_ERROR_HANDLE
);
256 VOID
ConErrPrintf (LPTSTR szFormat
, ...)
260 va_start (arg_ptr
, szFormat
);
261 ConPrintf(szFormat
, arg_ptr
, STD_ERROR_HANDLE
);
266 VOID
DebugPrintf (LPTSTR szFormat
, ...)
270 va_start (arg_ptr
, szFormat
);
271 ConPrintf(szFormat
, arg_ptr
, STD_ERROR_HANDLE
);
274 TCHAR szOut
[OUTPUT_BUFFER_SIZE
];
275 va_start (arg_ptr
, szFormat
);
276 _vstprintf (szOut
, szFormat
, arg_ptr
);
277 OutputDebugString (szOut
);
283 VOID
SetCursorXY (SHORT x
, SHORT y
)
289 SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE
), coPos
);
293 VOID
GetCursorXY (PSHORT x
, PSHORT y
)
295 CONSOLE_SCREEN_BUFFER_INFO csbi
;
297 GetConsoleScreenBufferInfo (hConsole
, &csbi
);
299 *x
= csbi
.dwCursorPosition
.X
;
300 *y
= csbi
.dwCursorPosition
.Y
;
304 SHORT
GetCursorX (VOID
)
306 CONSOLE_SCREEN_BUFFER_INFO csbi
;
308 GetConsoleScreenBufferInfo (hConsole
, &csbi
);
310 return csbi
.dwCursorPosition
.X
;
314 SHORT
GetCursorY (VOID
)
316 CONSOLE_SCREEN_BUFFER_INFO csbi
;
318 GetConsoleScreenBufferInfo (hConsole
, &csbi
);
320 return csbi
.dwCursorPosition
.Y
;
324 VOID
GetScreenSize (PSHORT maxx
, PSHORT maxy
)
326 CONSOLE_SCREEN_BUFFER_INFO csbi
;
328 GetConsoleScreenBufferInfo (hConsole
, &csbi
);
331 *maxx
= csbi
.dwSize
.X
;
333 *maxy
= csbi
.dwSize
.Y
;
337 VOID
SetCursorType (BOOL bInsert
, BOOL bVisible
)
339 CONSOLE_CURSOR_INFO cci
;
341 cci
.dwSize
= bInsert
? 10 : 99;
342 cci
.bVisible
= bVisible
;
344 SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE
), &cci
);