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
13 * 01-Jul-2005 (Brandon Turner) <turnerb7@msu.edu>)
14 * Added ConPrintfPaging and ConOutPrintfPaging
23 #define OUTPUT_BUFFER_SIZE 4096
30 VOID
ConInDisable (VOID
)
32 HANDLE hInput
= GetStdHandle (STD_INPUT_HANDLE
);
35 GetConsoleMode (hInput
, &dwMode
);
36 dwMode
&= ~ENABLE_PROCESSED_INPUT
;
37 SetConsoleMode (hInput
, dwMode
);
41 VOID
ConInEnable (VOID
)
43 HANDLE hInput
= GetStdHandle (STD_INPUT_HANDLE
);
46 GetConsoleMode (hInput
, &dwMode
);
47 dwMode
|= ENABLE_PROCESSED_INPUT
;
48 SetConsoleMode (hInput
, dwMode
);
52 VOID
ConInDummy (VOID
)
54 HANDLE hInput
= GetStdHandle (STD_INPUT_HANDLE
);
59 if (hInput
== INVALID_HANDLE_VALUE
)
60 DebugPrintf (_T("Invalid input handle!!!\n"));
62 ReadConsoleInput (hInput
, &dummy
, 1, &dwRead
);
65 VOID
ConInFlush (VOID
)
67 FlushConsoleInputBuffer (GetStdHandle (STD_INPUT_HANDLE
));
71 VOID
ConInKey (PINPUT_RECORD lpBuffer
)
73 HANDLE hInput
= GetStdHandle (STD_INPUT_HANDLE
);
77 if (hInput
== INVALID_HANDLE_VALUE
)
78 DebugPrintf (_T("Invalid input handle!!!\n"));
83 ReadConsoleInput (hInput
, lpBuffer
, 1, &dwRead
);
84 if ((lpBuffer
->EventType
== KEY_EVENT
) &&
85 (lpBuffer
->Event
.KeyEvent
.bKeyDown
== TRUE
))
93 VOID
ConInString (LPTSTR lpInput
, DWORD dwLength
)
104 pBuf
= (PCHAR
)malloc(dwLength
);
108 ZeroMemory (lpInput
, dwLength
* sizeof(TCHAR
));
109 hFile
= GetStdHandle (STD_INPUT_HANDLE
);
110 GetConsoleMode (hFile
, &dwOldMode
);
112 SetConsoleMode (hFile
, ENABLE_LINE_INPUT
| ENABLE_ECHO_INPUT
);
114 ReadFile (hFile
, (PVOID
)pBuf
, dwLength
, &dwRead
, NULL
);
117 MultiByteToWideChar( InputCodePage
, 0, pBuf
, dwLength
+ 1, lpInput
, dwLength
+ 1);
120 for (i
= 0; i
< dwRead
; i
++, p
++)
122 if (*p
== _T('\x0d'))
133 SetConsoleMode (hFile
, dwOldMode
);
136 static VOID
ConChar(TCHAR c
, DWORD nStdHandle
)
145 WideCharToMultiByte( OutputCodePage
, 0, ws
, 2, as
, 2, NULL
, NULL
);
150 WriteFile (GetStdHandle (nStdHandle
),
157 VOID
ConOutChar (TCHAR c
)
159 ConChar(c
, STD_OUTPUT_HANDLE
);
162 VOID
ConPuts(LPTSTR szText
, DWORD nStdHandle
)
168 len
= _tcslen(szText
);
170 pBuf
= malloc(len
+ 1);
171 len
= WideCharToMultiByte( OutputCodePage
, 0, szText
, len
+ 1, pBuf
, len
+ 1, NULL
, NULL
) - 1;
175 WriteFile (GetStdHandle (nStdHandle
),
180 WriteFile (GetStdHandle (nStdHandle
),
190 VOID
ConOutResPaging(BOOL NewPage
, UINT resID
)
192 TCHAR szMsg
[RC_STRING_MAX_SIZE
];
193 LoadString(CMD_ModuleHandle
, resID
, szMsg
, RC_STRING_MAX_SIZE
);
194 ConOutPrintfPaging(NewPage
, szMsg
);
197 VOID
ConOutResPuts (UINT resID
)
199 TCHAR szMsg
[RC_STRING_MAX_SIZE
];
200 LoadString(CMD_ModuleHandle
, resID
, szMsg
, RC_STRING_MAX_SIZE
);
202 ConPuts(szMsg
, STD_OUTPUT_HANDLE
);
205 VOID
ConOutPuts (LPTSTR szText
)
207 ConPuts(szText
, STD_OUTPUT_HANDLE
);
211 VOID
ConPrintf(LPTSTR szFormat
, va_list arg_ptr
, DWORD nStdHandle
)
215 TCHAR szOut
[OUTPUT_BUFFER_SIZE
];
218 len
= _vstprintf (szOut
, szFormat
, arg_ptr
);
220 pBuf
= malloc(len
+ 1);
221 len
= WideCharToMultiByte( OutputCodePage
, 0, szOut
, len
+ 1, pBuf
, len
+ 1, NULL
, NULL
) - 1;
225 WriteFile (GetStdHandle (nStdHandle
),
235 VOID
ConPrintfPaging(BOOL NewPage
, LPTSTR szFormat
, va_list arg_ptr
, DWORD nStdHandle
)
239 CONSOLE_SCREEN_BUFFER_INFO csbi
;
240 TCHAR szOut
[OUTPUT_BUFFER_SIZE
];
242 static int LineCount
= 0; //used to count number of lines since last pause
243 int ScreenLines
= 0; //used to see how big the screen is
244 int ScreenCol
= 0; //the number of chars in a roow
245 int CharEL
= 0; //chars since end of line
251 //get the size of the visual screen that can be printed too
252 GetConsoleScreenBufferInfo(hConsole
, &csbi
);
253 //subtract 2 to account for "press any key..." and for the blank line at the end of PagePrompt()
254 ScreenLines
= csbi
.srWindow
.Bottom
- csbi
.srWindow
.Top
- 2;
255 ScreenCol
= csbi
.srWindow
.Right
+ 1;
257 //make sure they didnt make the screen to small
259 ConPrintf(szFormat
, arg_ptr
, nStdHandle
);
260 //if more lines have been printed then screen size it is time to stop
261 if(LineCount
>= ScreenLines
)
263 if(PagePrompt() != PROMPT_YES
)
267 //reset the number of lines being printed
271 len
= _vstprintf (szOut
, szFormat
, arg_ptr
);
273 pBuf
= malloc(len
+ 1);
274 len
= WideCharToMultiByte( OutputCodePage
, 0, szOut
, len
+ 1, pBuf
, len
+ 1, NULL
, NULL
) - 1;
278 WriteFile (GetStdHandle (nStdHandle
),
288 //if it is smaller then a row then just check for \n
289 for(i
= 0; i
< len
; i
++)
296 //if it is bigger then a row check for \n and a string longer then a row can handle
297 for(i
= 0; i
< len
; i
++)
307 if(CharEL
> ScreenCol
)
321 VOID
ConOutFormatMessage (DWORD MessageId
, ...)
323 TCHAR szMsg
[RC_STRING_MAX_SIZE
];
328 va_start (arg_ptr
, MessageId
);
329 ret
= FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_SYSTEM
,
332 MAKELANGID(LANG_NEUTRAL
, SUBLANG_DEFAULT
),
345 LoadString(CMD_ModuleHandle
, STRING_CONSOLE_ERROR
, szMsg
, RC_STRING_MAX_SIZE
);
350 VOID
ConOutPrintf (LPTSTR szFormat
, ...)
354 va_start (arg_ptr
, szFormat
);
355 ConPrintf(szFormat
, arg_ptr
, STD_OUTPUT_HANDLE
);
359 VOID
ConOutPrintfPaging (BOOL NewPage
, LPTSTR szFormat
, ...)
363 va_start (arg_ptr
, szFormat
);
364 ConPrintfPaging(NewPage
, szFormat
, arg_ptr
, STD_OUTPUT_HANDLE
);
368 VOID
ConErrChar (TCHAR c
)
370 ConChar(c
, STD_ERROR_HANDLE
);
374 VOID
ConErrResPuts (UINT resID
)
376 TCHAR szMsg
[RC_STRING_MAX_SIZE
];
377 LoadString(CMD_ModuleHandle
, resID
, szMsg
, RC_STRING_MAX_SIZE
);
378 ConPuts(szMsg
, STD_ERROR_HANDLE
);
381 VOID
ConErrPuts (LPTSTR szText
)
383 ConPuts(szText
, STD_ERROR_HANDLE
);
387 VOID
ConErrPrintf (LPTSTR szFormat
, ...)
391 va_start (arg_ptr
, szFormat
);
392 ConPrintf(szFormat
, arg_ptr
, STD_ERROR_HANDLE
);
397 VOID
DebugPrintf (LPTSTR szFormat
, ...)
401 va_start (arg_ptr
, szFormat
);
402 ConPrintf(szFormat
, arg_ptr
, STD_ERROR_HANDLE
);
405 TCHAR szOut
[OUTPUT_BUFFER_SIZE
];
406 va_start (arg_ptr
, szFormat
);
407 _vstprintf (szOut
, szFormat
, arg_ptr
);
408 OutputDebugString (szOut
);
414 VOID
SetCursorXY (SHORT x
, SHORT y
)
420 SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE
), coPos
);
424 VOID
GetCursorXY (PSHORT x
, PSHORT y
)
426 CONSOLE_SCREEN_BUFFER_INFO csbi
;
428 GetConsoleScreenBufferInfo (hConsole
, &csbi
);
430 *x
= csbi
.dwCursorPosition
.X
;
431 *y
= csbi
.dwCursorPosition
.Y
;
435 SHORT
GetCursorX (VOID
)
437 CONSOLE_SCREEN_BUFFER_INFO csbi
;
439 GetConsoleScreenBufferInfo (hConsole
, &csbi
);
441 return csbi
.dwCursorPosition
.X
;
445 SHORT
GetCursorY (VOID
)
447 CONSOLE_SCREEN_BUFFER_INFO csbi
;
449 GetConsoleScreenBufferInfo (hConsole
, &csbi
);
451 return csbi
.dwCursorPosition
.Y
;
455 VOID
GetScreenSize (PSHORT maxx
, PSHORT maxy
)
457 CONSOLE_SCREEN_BUFFER_INFO csbi
;
459 GetConsoleScreenBufferInfo (hConsole
, &csbi
);
462 *maxx
= csbi
.dwSize
.X
;
464 *maxy
= csbi
.dwSize
.Y
;
468 VOID
SetCursorType (BOOL bInsert
, BOOL bVisible
)
470 CONSOLE_CURSOR_INFO cci
;
472 cci
.dwSize
= bInsert
? 10 : 99;
473 cci
.bVisible
= bVisible
;
475 SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE
), &cci
);