ReactOS 0.4.16-dev-188-g678aa63
console.c
Go to the documentation of this file.
1/*
2 * CONSOLE.C - console input/output functions.
3 *
4 *
5 * History:
6 *
7 * 20-Jan-1999 (Eric Kohl)
8 * started
9 *
10 * 03-Apr-2005 (Magnus Olsen <magnus@greatlord.com>)
11 * Remove all hardcoded strings in En.rc
12 *
13 * 01-Jul-2005 (Brandon Turner <turnerb7@msu.edu>)
14 * Added ConPrintfPaging and ConOutPrintfPaging
15 *
16 * 02-Feb-2007 (Paolo Devoti <devotip at gmail.com>)
17 * Fixed ConPrintfPaging
18 */
19
20#include "precomp.h"
21
22#define OUTPUT_BUFFER_SIZE 4096
23
24/* Cache codepage for text streams */
27
28/* Global console Screen and Pager */
31
32
33
34/********************* Console STREAM IN utility functions ********************/
35
37{
39 DWORD dwMode;
40
41 GetConsoleMode(hInput, &dwMode);
42 dwMode &= ~ENABLE_PROCESSED_INPUT;
43 SetConsoleMode(hInput, dwMode);
44}
45
47{
49 DWORD dwMode;
50
51 GetConsoleMode(hInput, &dwMode);
52 dwMode |= ENABLE_PROCESSED_INPUT;
53 SetConsoleMode(hInput, dwMode);
54}
55
57{
59}
60
62{
64 DWORD dwRead;
65
66 if (hInput == INVALID_HANDLE_VALUE)
67 WARN ("Invalid input handle!!!\n");
68
69 do
70 {
71 ReadConsoleInput(hInput, lpBuffer, 1, &dwRead);
72 if (lpBuffer->EventType == KEY_EVENT &&
73 lpBuffer->Event.KeyEvent.bKeyDown)
74 {
75 break;
76 }
77 }
78 while (TRUE);
79}
80
82{
83 DWORD dwOldMode;
84 DWORD dwRead = 0;
86
87 LPWSTR p;
88 PCHAR pBuf;
89
90 pBuf = (PCHAR)cmd_alloc(dwLength - 1);
91
92 ZeroMemory(lpInput, dwLength * sizeof(WCHAR));
94 GetConsoleMode(hFile, &dwOldMode);
95
97
98 ReadFile(hFile, (PVOID)pBuf, dwLength - 1, &dwRead, NULL);
99
100 MultiByteToWideChar(InputCodePage, 0, pBuf, dwRead, lpInput, dwLength - 1);
101 cmd_free(pBuf);
102
103 for (p = lpInput; *p; p++)
104 {
105 if (*p == L'\r') // Terminate at the carriage-return.
106 {
107 *p = L'\0';
108 break;
109 }
110 }
111
112 SetConsoleMode(hFile, dwOldMode);
113}
114
115
116
117/******************** Console STREAM OUT utility functions ********************/
118
120{
121 ConWrite(StdOut, &c, 1);
122}
123
125{
126 ConWrite(StdErr, &c, 1);
127}
128
130{
131 INT Len;
132 va_list arg_ptr;
133
134 va_start(arg_ptr, MessageId);
137 NULL,
138 MessageId,
140 &arg_ptr);
141 va_end(arg_ptr);
142
143 if (Len <= 0)
145}
146
147
148
149/************************** Console PAGER functions ***************************/
150
151BOOL ConPrintfVPaging(PCON_PAGER Pager, BOOL StartPaging, LPWSTR szFormat, va_list arg_ptr)
152{
153 // INT len;
155
156 /* Return if no string has been given */
157 if (szFormat == NULL)
158 return TRUE;
159
160 /*len =*/ vswprintf(szOut, szFormat, arg_ptr);
161
162 // return ConPutsPaging(Pager, PagePrompt, StartPaging, szOut);
163 return ConWritePaging(Pager, PagePrompt, StartPaging,
164 szOut, wcslen(szOut));
165}
166
167BOOL __cdecl ConOutPrintfPaging(BOOL StartPaging, LPWSTR szFormat, ...)
168{
169 BOOL bRet;
170 va_list arg_ptr;
171
172 va_start(arg_ptr, szFormat);
173 bRet = ConPrintfVPaging(&StdOutPager, StartPaging, szFormat, arg_ptr);
174 va_end(arg_ptr);
175 return bRet;
176}
177
178VOID ConOutResPaging(BOOL StartPaging, UINT resID)
179{
180 ConResPaging(&StdOutPager, PagePrompt, StartPaging, resID);
181}
182
183
184
185/************************** Console SCREEN functions **************************/
186
188{
189 COORD coPos;
190
191 coPos.X = x;
192 coPos.Y = y;
194}
195
197{
199
201
202 *x = csbi.dwCursorPosition.X;
203 *y = csbi.dwCursorPosition.Y;
204}
205
207{
209
211 return csbi.dwCursorPosition.X;
212}
213
215{
217
219 return csbi.dwCursorPosition.Y;
220}
221
223{
225
226 cci.dwSize = bInsert ? 10 : 99;
227 cci.bVisible = bVisible;
228
230}
231
233{
235
237 {
238 csbi.dwSize.X = 80;
239 csbi.dwSize.Y = 25;
240 }
241
242 if (maxx) *maxx = csbi.dwSize.X;
243 if (maxy) *maxy = csbi.dwSize.Y;
244}
245
246
247
248
249#ifdef INCLUDE_CMD_COLOR
250
252{
254 HANDLE hConsole;
256
257 /* Do not modify *pwDefAttr if we fail, in which case use default attributes */
258
259 hConsole = CreateFile(_T("CONOUT$"), GENERIC_READ|GENERIC_WRITE,
261 OPEN_EXISTING, 0, NULL);
262 if (hConsole == INVALID_HANDLE_VALUE)
263 return FALSE; // No default console
264
265 Success = GetConsoleScreenBufferInfo(hConsole, &csbi);
266 if (Success)
267 *pwDefAttr = csbi.wAttributes;
268
269 CloseHandle(hConsole);
270 return Success;
271}
272
273#endif
274
275
276BOOL ConSetTitle(IN LPCWSTR lpConsoleTitle)
277{
278 /* Now really set the console title */
279 return SetConsoleTitle(lpConsoleTitle);
280}
281
282#ifdef INCLUDE_CMD_BEEP
284{
285#if 0
286 /* Emit an error beep sound */
287 if (IsConsoleHandle(hOutput))
288 Beep(800, 200);
289 else if (IsTTYHandle(hOutput))
290 ConOutPuts(_T("\a")); // BEL character 0x07
291 else
292#endif
293 MessageBeep(-1);
294}
295#endif
296
297#ifdef INCLUDE_CMD_COLOR
299{
300 DWORD dwWritten;
302 COORD coPos;
303
304 /* Foreground and Background colors can't be the same */
305 if ((wColor & 0x0F) == (wColor & 0xF0) >> 4)
306 return FALSE;
307
308 /* Fill the whole background if needed */
309 if (bFill)
310 {
311 GetConsoleScreenBufferInfo(hOutput, &csbi);
312
313 coPos.X = 0;
314 coPos.Y = 0;
316 wColor & 0x00FF,
317 csbi.dwSize.X * csbi.dwSize.Y,
318 coPos,
319 &dwWritten);
320 }
321
322 /* Set the text attribute */
323 SetConsoleTextAttribute(hOutput, wColor & 0x00FF);
324 return TRUE;
325}
326#endif
327
328#include <cjkcode.h>
329#include "wcwidth.c"
330
331// NOTE: The check against 0x80 is to avoid calling the helper function
332// for characters that we already know are not full-width.
333#define IS_FULL_WIDTH(wch) \
334 (((USHORT)(wch) >= 0x0080) && (mk_wcwidth_cjk(wch) == 2))
335
337{
338 SIZE_T ich, cxWidth;
339
341 return _tcslen(pszText);
342
343 for (ich = cxWidth = 0; pszText[ich]; ++ich)
344 {
345 if (IS_FULL_WIDTH(pszText[ich]))
346 cxWidth += 2;
347 else
348 ++cxWidth;
349 }
350
351 return cxWidth;
352}
353
355{
356 int cchMax;
357 PWSTR pszWide;
358 SIZE_T cxWidth;
359
360 cchMax = MultiByteToWideChar(OutputCodePage, 0, pszText, -1, NULL, 0);
361 pszWide = cmd_alloc(cchMax * sizeof(WCHAR));
362 MultiByteToWideChar(OutputCodePage, 0, pszText, -1, pszWide, cchMax);
363 cxWidth = ConGetTextWidthW(pszWide);
364 cmd_free(pszWide);
365 return cxWidth;
366}
367
368/* EOF */
UINT cchMax
#define __cdecl
Definition: accygwin.h:79
char * va_list
Definition: acmsvcex.h:78
#define va_end(ap)
Definition: acmsvcex.h:90
#define va_start(ap, A)
Definition: acmsvcex.h:91
#define STRING_CONSOLE_ERROR
Definition: resource.h:6
#define StdOut
Definition: fc.c:14
void ConResPrintf(FILE *fp, UINT nID,...)
Definition: fc.c:33
#define StdErr
Definition: fc.c:15
BOOL WINAPI FlushConsoleInputBuffer(IN HANDLE hConsoleInput)
Definition: console.c:220
BOOL WINAPI SetConsoleCursorPosition(IN HANDLE hConsoleOutput, IN COORD dwCursorPosition)
Definition: console.c:641
HANDLE WINAPI GetStdHandle(IN DWORD nStdHandle)
Definition: console.c:203
BOOL WINAPI SetConsoleTextAttribute(IN HANDLE hConsoleOutput, IN WORD wAttributes)
Definition: console.c:672
BOOL WINAPI SetConsoleCursorInfo(IN HANDLE hConsoleOutput, IN const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo)
Definition: console.c:618
BOOL WINAPI FillConsoleOutputAttribute(IN HANDLE hConsoleOutput, IN WORD wAttribute, IN DWORD nLength, IN COORD dwWriteCoord, OUT LPDWORD lpNumberOfAttrsWritten)
Definition: console.c:525
BOOL WINAPI GetConsoleScreenBufferInfo(IN HANDLE hConsoleOutput, OUT PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo)
Definition: console.c:595
WORD wColor
VOID SetCursorXY(SHORT x, SHORT y)
Definition: console.c:187
VOID __cdecl ConFormatMessage(PCON_STREAM Stream, DWORD MessageId,...)
Definition: console.c:129
SHORT GetCursorY(VOID)
Definition: console.c:214
VOID ConErrChar(WCHAR c)
Definition: console.c:124
UINT InputCodePage
Definition: console.c:25
BOOL ConSetScreenColor(HANDLE hOutput, WORD wColor, BOOL bFill)
Definition: console.c:298
VOID ConOutResPaging(BOOL StartPaging, UINT resID)
Definition: console.c:178
VOID ConInDisable(VOID)
Definition: console.c:36
SHORT GetCursorX(VOID)
Definition: console.c:206
#define OUTPUT_BUFFER_SIZE
Definition: console.c:22
VOID ConInString(LPWSTR lpInput, DWORD dwLength)
Definition: console.c:81
VOID ConInEnable(VOID)
Definition: console.c:46
VOID GetCursorXY(PSHORT x, PSHORT y)
Definition: console.c:196
VOID ConRingBell(HANDLE hOutput)
Definition: console.c:283
SIZE_T ConGetTextWidthW(PCWSTR pszText)
Definition: console.c:336
UINT OutputCodePage
Definition: console.c:26
VOID ConInKey(PINPUT_RECORD lpBuffer)
Definition: console.c:61
CON_PAGER StdOutPager
Definition: console.c:30
BOOL ConSetTitle(IN LPCWSTR lpConsoleTitle)
Definition: console.c:276
VOID GetScreenSize(PSHORT maxx, PSHORT maxy)
Definition: console.c:232
BOOL ConGetDefaultAttributes(PWORD pwDefAttr)
Definition: console.c:251
CON_SCREEN StdOutScreen
Definition: console.c:29
#define IS_FULL_WIDTH(wch)
Definition: console.c:333
BOOL ConPrintfVPaging(PCON_PAGER Pager, BOOL StartPaging, LPWSTR szFormat, va_list arg_ptr)
Definition: console.c:151
SIZE_T ConGetTextWidthA(PCSTR pszText)
Definition: console.c:354
VOID ConInFlush(VOID)
Definition: console.c:56
BOOL __cdecl ConOutPrintfPaging(BOOL StartPaging, LPWSTR szFormat,...)
Definition: console.c:167
VOID SetCursorType(BOOL bInsert, BOOL bVisible)
Definition: console.c:222
VOID ConOutChar(WCHAR c)
Definition: console.c:119
#define ConOutPuts(szStr)
Definition: console.h:29
#define WARN(fmt,...)
Definition: precomp.h:61
#define IsCJKCodePage(CodePage)
Definition: cjkcode.h:27
#define cmd_free(ptr)
Definition: cmddbg.h:31
#define cmd_alloc(size)
Definition: cmddbg.h:29
SHORT maxx
Definition: cmdinput.c:115
static BOOL bInsert
Definition: cmdinput.c:121
SHORT maxy
Definition: cmdinput.c:116
static TAGREF LPCWSTR LPDWORD LPVOID lpBuffer
Definition: db.cpp:175
#define Len
Definition: deflate.h:82
BOOL WINAPI Beep(IN DWORD dwFreq, IN DWORD dwDuration)
Definition: deviceio.c:48
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CloseHandle
Definition: compat.h:739
#define OPEN_EXISTING
Definition: compat.h:775
#define ReadFile(a, b, c, d, e)
Definition: compat.h:742
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define GENERIC_READ
Definition: compat.h:135
#define MultiByteToWideChar
Definition: compat.h:110
#define FILE_SHARE_READ
Definition: compat.h:136
static DWORD DWORD * dwLength
Definition: fusion.c:86
BOOL WINAPI GetConsoleMode(HANDLE hConsoleHandle, LPDWORD lpMode)
Definition: console.c:1569
BOOL WINAPI DECLSPEC_HOTPATCH SetConsoleMode(HANDLE hConsoleHandle, DWORD dwMode)
Definition: console.c:1606
@ Success
Definition: eventcreate.c:712
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
const GLubyte * c
Definition: glext.h:8905
GLfloat GLfloat p
Definition: glext.h:8902
static _Check_return_opt_ int __cdecl vswprintf(_Out_writes_z_(_SizeInWords) wchar_t *_DstBuf, _In_ size_t _SizeInWords, _In_z_ _Printf_format_string_ const wchar_t *_Format, va_list _ArgList)
Definition: stdio.h:977
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define PCHAR
Definition: match.c:90
static IStream Stream
Definition: htmldoc.c:1115
static BOOL __stdcall PagePrompt(PCON_PAGER Pager, DWORD Done, DWORD Total)
Definition: more.c:160
_In_ HANDLE hFile
Definition: mswsock.h:90
unsigned int UINT
Definition: ndis.h:50
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define GENERIC_WRITE
Definition: nt_native.h:90
#define L(x)
Definition: ntvdm.h:50
INT __stdcall ConWrite(IN PCON_STREAM Stream, IN PCTCH szStr, IN DWORD len)
Definition: outstream.c:85
INT ConMsgPrintfV(IN PCON_STREAM Stream, IN DWORD dwFlags, IN LPCVOID lpSource OPTIONAL, IN DWORD dwMessageId, IN DWORD dwLanguageId, IN va_list *Arguments OPTIONAL)
Definition: outstream.c:1030
#define INIT_CON_PAGER(pScreen)
Definition: pager.h:73
WORD * PWORD
Definition: pedump.c:67
short SHORT
Definition: pedump.c:59
#define INIT_CON_SCREEN(pStream)
Definition: screen.h:49
#define IsConsoleHandle(h)
Definition: console.h:14
BOOL ConResPaging(IN PCON_PAGER Pager, IN PAGE_PROMPT PagePrompt, IN BOOL StartPaging, IN UINT uID)
Definition: pager.c:681
BOOL ConWritePaging(IN PCON_PAGER Pager, IN PAGE_PROMPT PagePrompt, IN BOOL StartPaging, IN PCTCH szStr, IN DWORD len)
Definition: pager.c:549
BOOL IsTTYHandle(IN HANDLE hHandle)
Definition: utils.c:393
Definition: bl.h:1338
ULONG Y
Definition: bl.h:1340
ULONG X
Definition: bl.h:1339
SHORT Y
Definition: blue.h:27
SHORT X
Definition: blue.h:26
#define LANG_USER_DEFAULT
Definition: tnerror.cpp:50
uint16_t * PWSTR
Definition: typedefs.h:56
const uint16_t * PCWSTR
Definition: typedefs.h:57
int16_t * PSHORT
Definition: typedefs.h:55
ULONG_PTR SIZE_T
Definition: typedefs.h:80
int32_t INT
Definition: typedefs.h:58
const char * PCSTR
Definition: typedefs.h:52
#define IN
Definition: typedefs.h:39
char * PCHAR
Definition: typedefs.h:51
#define _T(x)
Definition: vfdio.h:22
#define ZeroMemory
Definition: winbase.h:1712
#define STD_OUTPUT_HANDLE
Definition: winbase.h:268
#define STD_INPUT_HANDLE
Definition: winbase.h:267
#define FORMAT_MESSAGE_FROM_SYSTEM
Definition: winbase.h:423
#define CreateFile
Definition: winbase.h:3749
#define ReadConsoleInput
Definition: wincon.h:778
#define ENABLE_ECHO_INPUT
Definition: wincon.h:80
#define KEY_EVENT
Definition: wincon.h:128
#define SetConsoleTitle
Definition: wincon.h:783
#define ENABLE_LINE_INPUT
Definition: wincon.h:79
#define ENABLE_PROCESSED_INPUT
Definition: wincon.h:78
BOOL WINAPI MessageBeep(_In_ UINT uType)
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
#define _tcslen
Definition: xmlstorage.h:198