3 * CONSOLE.C - console input/output functions.
8 * 20-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
11 * 03-Apr-2005 (Magnus Olsen) <magnus@greatlord.com>)
12 * Remove all hardcode string to En.rc
19 #define OUTPUT_BUFFER_SIZE 4096
22 VOID
ConInDisable (VOID
)
24 HANDLE hInput
= GetStdHandle (STD_INPUT_HANDLE
);
27 GetConsoleMode (hInput
, &dwMode
);
28 dwMode
&= ~ENABLE_PROCESSED_INPUT
;
29 SetConsoleMode (hInput
, dwMode
);
33 VOID
ConInEnable (VOID
)
35 HANDLE hInput
= GetStdHandle (STD_INPUT_HANDLE
);
38 GetConsoleMode (hInput
, &dwMode
);
39 dwMode
|= ENABLE_PROCESSED_INPUT
;
40 SetConsoleMode (hInput
, dwMode
);
44 VOID
ConInDummy (VOID
)
46 HANDLE hInput
= GetStdHandle (STD_INPUT_HANDLE
);
51 if (hInput
== INVALID_HANDLE_VALUE
)
52 DebugPrintf (_T("Invalid input handle!!!\n"));
54 ReadConsoleInput (hInput
, &dummy
, 1, &dwRead
);
57 VOID
ConInFlush (VOID
)
59 FlushConsoleInputBuffer (GetStdHandle (STD_INPUT_HANDLE
));
63 VOID
ConInKey (PINPUT_RECORD lpBuffer
)
65 HANDLE hInput
= GetStdHandle (STD_INPUT_HANDLE
);
69 if (hInput
== INVALID_HANDLE_VALUE
)
70 DebugPrintf (_T("Invalid input handle!!!\n"));
75 ReadConsoleInput (hInput
, lpBuffer
, 1, &dwRead
);
76 if ((lpBuffer
->EventType
== KEY_EVENT
) &&
77 (lpBuffer
->Event
.KeyEvent
.bKeyDown
== TRUE
))
85 VOID
ConInString (LPTSTR lpInput
, DWORD dwLength
)
96 pBuf
= (PCHAR
)malloc(dwLength
);
100 ZeroMemory (lpInput
, dwLength
* sizeof(TCHAR
));
101 hFile
= GetStdHandle (STD_INPUT_HANDLE
);
102 GetConsoleMode (hFile
, &dwOldMode
);
104 SetConsoleMode (hFile
, ENABLE_LINE_INPUT
| ENABLE_ECHO_INPUT
);
106 ReadFile (hFile
, (PVOID
)pBuf
, dwLength
, &dwRead
, NULL
);
109 MultiByteToWideChar(CP_ACP
, 0, pBuf
, dwLength
+ 1, lpInput
, dwLength
+ 1);
112 for (i
= 0; i
< dwRead
; i
++, p
++)
114 if (*p
== _T('\x0d'))
125 SetConsoleMode (hFile
, dwOldMode
);
128 static VOID
ConChar(TCHAR c
, DWORD nStdHandle
)
137 WideCharToMultiByte(CP_ACP
, 0, ws
, 2, as
, 2, NULL
, NULL
);
142 WriteFile (GetStdHandle (nStdHandle
),
149 VOID
ConOutChar (TCHAR c
)
151 ConChar(c
, STD_OUTPUT_HANDLE
);
154 VOID
ConPuts(LPTSTR szText
, DWORD nStdHandle
)
160 len
= _tcslen(szText
);
162 pBuf
= malloc(len
+ 1);
163 len
= WideCharToMultiByte(CP_ACP
, 0, szText
, len
+ 1, pBuf
, len
+ 1, NULL
, NULL
) - 1;
167 WriteFile (GetStdHandle (nStdHandle
),
172 WriteFile (GetStdHandle (nStdHandle
),
182 VOID
ConOutPuts (LPTSTR szText
)
184 ConPuts(szText
, STD_OUTPUT_HANDLE
);
188 VOID
ConPrintf(LPTSTR szFormat
, va_list arg_ptr
, DWORD nStdHandle
)
192 TCHAR szOut
[OUTPUT_BUFFER_SIZE
];
195 len
= _vstprintf (szOut
, szFormat
, arg_ptr
);
197 pBuf
= malloc(len
+ 1);
198 len
= WideCharToMultiByte(CP_ACP
, 0, szOut
, len
+ 1, pBuf
, len
+ 1, NULL
, NULL
) - 1;
202 WriteFile (GetStdHandle (nStdHandle
),
212 VOID
ConOutFormatMessage (DWORD MessageId
, ...)
217 WCHAR szMsg
[RC_STRING_MAX_SIZE
];
219 va_start (arg_ptr
, MessageId
);
220 ret
= FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_SYSTEM
,
223 MAKELANGID(LANG_NEUTRAL
, SUBLANG_DEFAULT
),
236 LoadString( GetModuleHandle(NULL
), STRING_CONSOLE_ERROR
, (LPTSTR
) szMsg
,sizeof(szMsg
));
237 ConErrPrintf (_T((LPTSTR
)szMsg
));
241 VOID
ConOutPrintf (LPTSTR szFormat
, ...)
245 va_start (arg_ptr
, szFormat
);
246 ConPrintf(szFormat
, arg_ptr
, STD_OUTPUT_HANDLE
);
250 VOID
ConErrChar (TCHAR c
)
252 ConChar(c
, STD_ERROR_HANDLE
);
256 VOID
ConErrPuts (LPTSTR szText
)
258 ConPuts(szText
, STD_ERROR_HANDLE
);
262 VOID
ConErrPrintf (LPTSTR szFormat
, ...)
266 va_start (arg_ptr
, szFormat
);
267 ConPrintf(szFormat
, arg_ptr
, STD_ERROR_HANDLE
);
272 VOID
DebugPrintf (LPTSTR szFormat
, ...)
276 va_start (arg_ptr
, szFormat
);
277 ConPrintf(szFormat
, arg_ptr
, STD_ERROR_HANDLE
);
280 TCHAR szOut
[OUTPUT_BUFFER_SIZE
];
281 va_start (arg_ptr
, szFormat
);
282 _vstprintf (szOut
, szFormat
, arg_ptr
);
283 OutputDebugString (szOut
);
289 VOID
SetCursorXY (SHORT x
, SHORT y
)
295 SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE
), coPos
);
299 VOID
GetCursorXY (PSHORT x
, PSHORT y
)
301 CONSOLE_SCREEN_BUFFER_INFO csbi
;
303 GetConsoleScreenBufferInfo (hConsole
, &csbi
);
305 *x
= csbi
.dwCursorPosition
.X
;
306 *y
= csbi
.dwCursorPosition
.Y
;
310 SHORT
GetCursorX (VOID
)
312 CONSOLE_SCREEN_BUFFER_INFO csbi
;
314 GetConsoleScreenBufferInfo (hConsole
, &csbi
);
316 return csbi
.dwCursorPosition
.X
;
320 SHORT
GetCursorY (VOID
)
322 CONSOLE_SCREEN_BUFFER_INFO csbi
;
324 GetConsoleScreenBufferInfo (hConsole
, &csbi
);
326 return csbi
.dwCursorPosition
.Y
;
330 VOID
GetScreenSize (PSHORT maxx
, PSHORT maxy
)
332 CONSOLE_SCREEN_BUFFER_INFO csbi
;
334 GetConsoleScreenBufferInfo (hConsole
, &csbi
);
337 *maxx
= csbi
.dwSize
.X
;
339 *maxy
= csbi
.dwSize
.Y
;
343 VOID
SetCursorType (BOOL bInsert
, BOOL bVisible
)
345 CONSOLE_CURSOR_INFO cci
;
347 cci
.dwSize
= bInsert
? 10 : 99;
348 cci
.bVisible
= bVisible
;
350 SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE
), &cci
);