2 * CONSOLE.C - console input/output functions.
7 * 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
10 * 03-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
11 * Remove all hardcode string to En.rc
18 #define OUTPUT_BUFFER_SIZE 4096
20 VOID
ConInDisable (VOID
)
22 HANDLE hInput
= GetStdHandle (STD_INPUT_HANDLE
);
25 GetConsoleMode (hInput
, &dwMode
);
26 dwMode
&= ~ENABLE_PROCESSED_INPUT
;
27 SetConsoleMode (hInput
, dwMode
);
31 VOID
ConInEnable (VOID
)
33 HANDLE hInput
= GetStdHandle (STD_INPUT_HANDLE
);
36 GetConsoleMode (hInput
, &dwMode
);
37 dwMode
|= ENABLE_PROCESSED_INPUT
;
38 SetConsoleMode (hInput
, dwMode
);
42 VOID
ConInDummy (VOID
)
44 HANDLE hInput
= GetStdHandle (STD_INPUT_HANDLE
);
49 if (hInput
== INVALID_HANDLE_VALUE
)
50 DebugPrintf (_T("Invalid input handle!!!\n"));
52 ReadConsoleInput (hInput
, &dummy
, 1, &dwRead
);
55 VOID
ConInFlush (VOID
)
57 FlushConsoleInputBuffer (GetStdHandle (STD_INPUT_HANDLE
));
61 VOID
ConInKey (PINPUT_RECORD lpBuffer
)
63 HANDLE hInput
= GetStdHandle (STD_INPUT_HANDLE
);
67 if (hInput
== INVALID_HANDLE_VALUE
)
68 DebugPrintf (_T("Invalid input handle!!!\n"));
73 ReadConsoleInput (hInput
, lpBuffer
, 1, &dwRead
);
74 if ((lpBuffer
->EventType
== KEY_EVENT
) &&
75 (lpBuffer
->Event
.KeyEvent
.bKeyDown
== TRUE
))
83 VOID
ConInString (LPTSTR lpInput
, DWORD dwLength
)
94 pBuf
= (PCHAR
)malloc(dwLength
);
98 ZeroMemory (lpInput
, dwLength
* sizeof(TCHAR
));
99 hFile
= GetStdHandle (STD_INPUT_HANDLE
);
100 GetConsoleMode (hFile
, &dwOldMode
);
102 SetConsoleMode (hFile
, ENABLE_LINE_INPUT
| ENABLE_ECHO_INPUT
);
104 ReadFile (hFile
, (PVOID
)pBuf
, dwLength
, &dwRead
, NULL
);
107 MultiByteToWideChar( GetConsoleCP(), 0, pBuf
, dwLength
+ 1, lpInput
, dwLength
+ 1);
110 for (i
= 0; i
< dwRead
; i
++, p
++)
112 if (*p
== _T('\x0d'))
123 SetConsoleMode (hFile
, dwOldMode
);
126 static VOID
ConChar(TCHAR c
, DWORD nStdHandle
)
135 WideCharToMultiByte( GetConsoleOutputCP(), 0, ws
, 2, as
, 2, NULL
, NULL
);
140 WriteFile (GetStdHandle (nStdHandle
),
147 VOID
ConOutChar (TCHAR c
)
149 ConChar(c
, STD_OUTPUT_HANDLE
);
152 VOID
ConPuts(LPTSTR szText
, DWORD nStdHandle
)
158 len
= _tcslen(szText
);
160 pBuf
= malloc(len
+ 1);
161 len
= WideCharToMultiByte( GetConsoleOutputCP(), 0, szText
, len
+ 1, pBuf
, len
+ 1, NULL
, NULL
) - 1;
165 WriteFile (GetStdHandle (nStdHandle
),
170 WriteFile (GetStdHandle (nStdHandle
),
180 VOID
ConOutPuts (LPTSTR szText
)
182 ConPuts(szText
, STD_OUTPUT_HANDLE
);
186 VOID
ConPrintf(LPTSTR szFormat
, va_list arg_ptr
, DWORD nStdHandle
)
190 TCHAR szOut
[OUTPUT_BUFFER_SIZE
];
193 len
= _vstprintf (szOut
, szFormat
, arg_ptr
);
195 pBuf
= malloc(len
+ 1);
196 len
= WideCharToMultiByte( GetConsoleOutputCP(), 0, szOut
, len
+ 1, pBuf
, len
+ 1, NULL
, NULL
) - 1;
200 WriteFile (GetStdHandle (nStdHandle
),
210 VOID
ConOutFormatMessage (DWORD MessageId
, ...)
212 TCHAR szMsg
[RC_STRING_MAX_SIZE
];
217 va_start (arg_ptr
, MessageId
);
218 ret
= FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_SYSTEM
,
221 MAKELANGID(LANG_NEUTRAL
, SUBLANG_DEFAULT
),
234 LoadString(GetModuleHandle(NULL
), STRING_CONSOLE_ERROR
, szMsg
, RC_STRING_MAX_SIZE
);
239 VOID
ConOutPrintf (LPTSTR szFormat
, ...)
243 va_start (arg_ptr
, szFormat
);
244 ConPrintf(szFormat
, arg_ptr
, STD_OUTPUT_HANDLE
);
248 VOID
ConErrChar (TCHAR c
)
250 ConChar(c
, STD_ERROR_HANDLE
);
254 VOID
ConErrPuts (LPTSTR szText
)
256 ConPuts(szText
, STD_ERROR_HANDLE
);
260 VOID
ConErrPrintf (LPTSTR szFormat
, ...)
264 va_start (arg_ptr
, szFormat
);
265 ConPrintf(szFormat
, arg_ptr
, STD_ERROR_HANDLE
);
270 VOID
DebugPrintf (LPTSTR szFormat
, ...)
274 va_start (arg_ptr
, szFormat
);
275 ConPrintf(szFormat
, arg_ptr
, STD_ERROR_HANDLE
);
278 TCHAR szOut
[OUTPUT_BUFFER_SIZE
];
279 va_start (arg_ptr
, szFormat
);
280 _vstprintf (szOut
, szFormat
, arg_ptr
);
281 OutputDebugString (szOut
);
287 VOID
SetCursorXY (SHORT x
, SHORT y
)
293 SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE
), coPos
);
297 VOID
GetCursorXY (PSHORT x
, PSHORT y
)
299 CONSOLE_SCREEN_BUFFER_INFO csbi
;
301 GetConsoleScreenBufferInfo (hConsole
, &csbi
);
303 *x
= csbi
.dwCursorPosition
.X
;
304 *y
= csbi
.dwCursorPosition
.Y
;
308 SHORT
GetCursorX (VOID
)
310 CONSOLE_SCREEN_BUFFER_INFO csbi
;
312 GetConsoleScreenBufferInfo (hConsole
, &csbi
);
314 return csbi
.dwCursorPosition
.X
;
318 SHORT
GetCursorY (VOID
)
320 CONSOLE_SCREEN_BUFFER_INFO csbi
;
322 GetConsoleScreenBufferInfo (hConsole
, &csbi
);
324 return csbi
.dwCursorPosition
.Y
;
328 VOID
GetScreenSize (PSHORT maxx
, PSHORT maxy
)
330 CONSOLE_SCREEN_BUFFER_INFO csbi
;
332 GetConsoleScreenBufferInfo (hConsole
, &csbi
);
335 *maxx
= csbi
.dwSize
.X
;
337 *maxy
= csbi
.dwSize
.Y
;
341 VOID
SetCursorType (BOOL bInsert
, BOOL bVisible
)
343 CONSOLE_CURSOR_INFO cci
;
345 cci
.dwSize
= bInsert
? 10 : 99;
346 cci
.bVisible
= bVisible
;
348 SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE
), &cci
);