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
20 #define OUTPUT_BUFFER_SIZE 4096
27 VOID
ConInDisable (VOID
)
29 HANDLE hInput
= GetStdHandle (STD_INPUT_HANDLE
);
32 GetConsoleMode (hInput
, &dwMode
);
33 dwMode
&= ~ENABLE_PROCESSED_INPUT
;
34 SetConsoleMode (hInput
, dwMode
);
38 VOID
ConInEnable (VOID
)
40 HANDLE hInput
= GetStdHandle (STD_INPUT_HANDLE
);
43 GetConsoleMode (hInput
, &dwMode
);
44 dwMode
|= ENABLE_PROCESSED_INPUT
;
45 SetConsoleMode (hInput
, dwMode
);
49 VOID
ConInDummy (VOID
)
51 HANDLE hInput
= GetStdHandle (STD_INPUT_HANDLE
);
56 if (hInput
== INVALID_HANDLE_VALUE
)
57 DebugPrintf (_T("Invalid input handle!!!\n"));
59 ReadConsoleInput (hInput
, &dummy
, 1, &dwRead
);
62 VOID
ConInFlush (VOID
)
64 FlushConsoleInputBuffer (GetStdHandle (STD_INPUT_HANDLE
));
68 VOID
ConInKey (PINPUT_RECORD lpBuffer
)
70 HANDLE hInput
= GetStdHandle (STD_INPUT_HANDLE
);
74 if (hInput
== INVALID_HANDLE_VALUE
)
75 DebugPrintf (_T("Invalid input handle!!!\n"));
80 ReadConsoleInput (hInput
, lpBuffer
, 1, &dwRead
);
81 if ((lpBuffer
->EventType
== KEY_EVENT
) &&
82 (lpBuffer
->Event
.KeyEvent
.bKeyDown
== TRUE
))
90 VOID
ConInString (LPTSTR lpInput
, DWORD dwLength
)
101 pBuf
= (PCHAR
)malloc(dwLength
);
105 ZeroMemory (lpInput
, dwLength
* sizeof(TCHAR
));
106 hFile
= GetStdHandle (STD_INPUT_HANDLE
);
107 GetConsoleMode (hFile
, &dwOldMode
);
109 SetConsoleMode (hFile
, ENABLE_LINE_INPUT
| ENABLE_ECHO_INPUT
);
111 ReadFile (hFile
, (PVOID
)pBuf
, dwLength
, &dwRead
, NULL
);
114 MultiByteToWideChar( InputCodePage
, 0, pBuf
, dwLength
+ 1, lpInput
, dwLength
+ 1);
117 for (i
= 0; i
< dwRead
; i
++, p
++)
119 if (*p
== _T('\x0d'))
130 SetConsoleMode (hFile
, dwOldMode
);
133 static VOID
ConChar(TCHAR c
, DWORD nStdHandle
)
142 WideCharToMultiByte( OutputCodePage
, 0, ws
, 2, as
, 2, NULL
, NULL
);
147 WriteFile (GetStdHandle (nStdHandle
),
154 VOID
ConOutChar (TCHAR c
)
156 ConChar(c
, STD_OUTPUT_HANDLE
);
159 VOID
ConPuts(LPTSTR szText
, DWORD nStdHandle
)
165 len
= _tcslen(szText
);
167 pBuf
= malloc(len
+ 1);
168 len
= WideCharToMultiByte( OutputCodePage
, 0, szText
, len
+ 1, pBuf
, len
+ 1, NULL
, NULL
) - 1;
172 WriteFile (GetStdHandle (nStdHandle
),
177 WriteFile (GetStdHandle (nStdHandle
),
187 VOID
ConOutResPuts (UINT resID
)
189 TCHAR szMsg
[RC_STRING_MAX_SIZE
];
190 LoadString(CMD_ModuleHandle
, resID
, szMsg
, RC_STRING_MAX_SIZE
);
192 ConPuts(szMsg
, STD_OUTPUT_HANDLE
);
195 VOID
ConOutPuts (LPTSTR szText
)
197 ConPuts(szText
, STD_OUTPUT_HANDLE
);
201 VOID
ConPrintf(LPTSTR szFormat
, va_list arg_ptr
, DWORD nStdHandle
)
205 TCHAR szOut
[OUTPUT_BUFFER_SIZE
];
208 len
= _vstprintf (szOut
, szFormat
, arg_ptr
);
210 pBuf
= malloc(len
+ 1);
211 len
= WideCharToMultiByte( OutputCodePage
, 0, szOut
, len
+ 1, pBuf
, len
+ 1, NULL
, NULL
) - 1;
215 WriteFile (GetStdHandle (nStdHandle
),
225 VOID
ConOutFormatMessage (DWORD MessageId
, ...)
227 TCHAR szMsg
[RC_STRING_MAX_SIZE
];
232 va_start (arg_ptr
, MessageId
);
233 ret
= FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_SYSTEM
,
236 MAKELANGID(LANG_NEUTRAL
, SUBLANG_DEFAULT
),
249 LoadString(CMD_ModuleHandle
, STRING_CONSOLE_ERROR
, szMsg
, RC_STRING_MAX_SIZE
);
254 VOID
ConOutPrintf (LPTSTR szFormat
, ...)
258 va_start (arg_ptr
, szFormat
);
259 ConPrintf(szFormat
, arg_ptr
, STD_OUTPUT_HANDLE
);
263 VOID
ConErrChar (TCHAR c
)
265 ConChar(c
, STD_ERROR_HANDLE
);
269 VOID
ConErrResPuts (UINT resID
)
271 TCHAR szMsg
[RC_STRING_MAX_SIZE
];
272 LoadString(CMD_ModuleHandle
, resID
, szMsg
, RC_STRING_MAX_SIZE
);
273 ConPuts(szMsg
, STD_ERROR_HANDLE
);
276 VOID
ConErrPuts (LPTSTR szText
)
278 ConPuts(szText
, STD_ERROR_HANDLE
);
282 VOID
ConErrPrintf (LPTSTR szFormat
, ...)
286 va_start (arg_ptr
, szFormat
);
287 ConPrintf(szFormat
, arg_ptr
, STD_ERROR_HANDLE
);
292 VOID
DebugPrintf (LPTSTR szFormat
, ...)
296 va_start (arg_ptr
, szFormat
);
297 ConPrintf(szFormat
, arg_ptr
, STD_ERROR_HANDLE
);
300 TCHAR szOut
[OUTPUT_BUFFER_SIZE
];
301 va_start (arg_ptr
, szFormat
);
302 _vstprintf (szOut
, szFormat
, arg_ptr
);
303 OutputDebugString (szOut
);
309 VOID
SetCursorXY (SHORT x
, SHORT y
)
315 SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE
), coPos
);
319 VOID
GetCursorXY (PSHORT x
, PSHORT y
)
321 CONSOLE_SCREEN_BUFFER_INFO csbi
;
323 GetConsoleScreenBufferInfo (hConsole
, &csbi
);
325 *x
= csbi
.dwCursorPosition
.X
;
326 *y
= csbi
.dwCursorPosition
.Y
;
330 SHORT
GetCursorX (VOID
)
332 CONSOLE_SCREEN_BUFFER_INFO csbi
;
334 GetConsoleScreenBufferInfo (hConsole
, &csbi
);
336 return csbi
.dwCursorPosition
.X
;
340 SHORT
GetCursorY (VOID
)
342 CONSOLE_SCREEN_BUFFER_INFO csbi
;
344 GetConsoleScreenBufferInfo (hConsole
, &csbi
);
346 return csbi
.dwCursorPosition
.Y
;
350 VOID
GetScreenSize (PSHORT maxx
, PSHORT maxy
)
352 CONSOLE_SCREEN_BUFFER_INFO csbi
;
354 GetConsoleScreenBufferInfo (hConsole
, &csbi
);
357 *maxx
= csbi
.dwSize
.X
;
359 *maxy
= csbi
.dwSize
.Y
;
363 VOID
SetCursorType (BOOL bInsert
, BOOL bVisible
)
365 CONSOLE_CURSOR_INFO cci
;
367 cci
.dwSize
= bInsert
? 10 : 99;
368 cci
.bVisible
= bVisible
;
370 SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE
), &cci
);