[CMD]: Continue refactoring to lay out the way to using the CONUTILS library in CMD...
[reactos.git] / reactos / base / shell / cmd / console.c
index 29f9550..b83686f 100644 (file)
@@ -21,7 +21,7 @@
 
 #define OUTPUT_BUFFER_SIZE  4096
 
-
+/* Cache codepage for text streams */
 UINT InputCodePage;
 UINT OutputCodePage;
 
@@ -50,6 +50,10 @@ BOOL IsConsoleHandle(HANDLE hHandle)
     return GetConsoleMode(hHandle, &dwMode);
 }
 
+
+
+/********************* Console STREAM IN utility functions ********************/
+
 VOID ConInDisable(VOID)
 {
     HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
@@ -60,7 +64,6 @@ VOID ConInDisable(VOID)
     SetConsoleMode(hInput, dwMode);
 }
 
-
 VOID ConInEnable(VOID)
 {
     HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
@@ -71,13 +74,11 @@ VOID ConInEnable(VOID)
     SetConsoleMode(hInput, dwMode);
 }
 
-
-VOID ConInFlush (VOID)
+VOID ConInFlush(VOID)
 {
     FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
 }
 
-
 VOID ConInKey(PINPUT_RECORD lpBuffer)
 {
     HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
@@ -96,7 +97,6 @@ VOID ConInKey(PINPUT_RECORD lpBuffer)
     while (TRUE);
 }
 
-
 VOID ConInString(LPTSTR lpInput, DWORD dwLength)
 {
     DWORD dwOldMode;
@@ -135,7 +135,11 @@ VOID ConInString(LPTSTR lpInput, DWORD dwLength)
     SetConsoleMode(hFile, dwOldMode);
 }
 
-static VOID ConWrite(TCHAR *str, DWORD len, DWORD nStdHandle)
+
+
+/******************** Console STREAM OUT utility functions ********************/
+
+static VOID ConWrite(DWORD nStdHandle, TCHAR *str, DWORD len)
 {
     DWORD dwNumBytes = 0;
     HANDLE hOutput = GetStdHandle(nStdHandle);
@@ -256,46 +260,89 @@ static VOID ConWrite(TCHAR *str, DWORD len, DWORD nStdHandle)
     }
 }
 
-VOID ConOutChar(TCHAR c)
+VOID ConPuts(DWORD nStdHandle, LPTSTR szText)
 {
-    ConWrite(&c, 1, STD_OUTPUT_HANDLE);
+    ConWrite(nStdHandle, szText, (DWORD)_tcslen(szText));
 }
 
-VOID ConPuts(LPTSTR szText, DWORD nStdHandle)
-{
-    ConWrite(szText, (DWORD)_tcslen(szText), nStdHandle);
-}
-
-VOID ConOutResPaging(BOOL NewPage, UINT resID)
+VOID ConResPuts(DWORD nStdHandle, UINT resID)
 {
     TCHAR szMsg[RC_STRING_MAX_SIZE];
     LoadString(CMD_ModuleHandle, resID, szMsg, ARRAYSIZE(szMsg));
-    ConOutPrintfPaging(NewPage, szMsg);
+    ConPuts(nStdHandle, szMsg);
 }
 
-VOID ConOutResPuts(UINT resID)
+VOID ConOutChar(TCHAR c)
 {
-    TCHAR szMsg[RC_STRING_MAX_SIZE];
-    LoadString(CMD_ModuleHandle, resID, szMsg, ARRAYSIZE(szMsg));
-    ConPuts(szMsg, STD_OUTPUT_HANDLE);
+    ConWrite(STD_OUTPUT_HANDLE, &c, 1);
 }
 
-VOID ConOutPuts(LPTSTR szText)
+VOID ConErrChar(TCHAR c)
 {
-    ConPuts(szText, STD_OUTPUT_HANDLE);
+    ConWrite(STD_ERROR_HANDLE, &c, 1);
 }
 
-
-VOID ConPrintf(LPTSTR szFormat, va_list arg_ptr, DWORD nStdHandle)
+VOID ConPrintfV(DWORD nStdHandle, LPTSTR szFormat, va_list arg_ptr)
 {
     TCHAR szOut[OUTPUT_BUFFER_SIZE];
     DWORD len;
 
     len = (DWORD)_vstprintf(szOut, szFormat, arg_ptr);
-    ConWrite(szOut, len, nStdHandle);
+    ConWrite(nStdHandle, szOut, len);
 }
 
-INT ConPrintfPaging(BOOL NewPage, LPTSTR szFormat, va_list arg_ptr, DWORD nStdHandle)
+VOID ConPrintf(DWORD nStdHandle, LPTSTR szFormat, ...)
+{
+    va_list arg_ptr;
+
+    va_start(arg_ptr, szFormat);
+    ConPrintfV(nStdHandle, szFormat, arg_ptr);
+    va_end(arg_ptr);
+}
+
+VOID ConResPrintf(DWORD nStdHandle, UINT resID, ...)
+{
+    TCHAR szMsg[RC_STRING_MAX_SIZE];
+    va_list arg_ptr;
+
+    va_start(arg_ptr, resID);
+    LoadString(CMD_ModuleHandle, resID, szMsg, ARRAYSIZE(szMsg));
+    ConPrintfV(nStdHandle, szMsg, arg_ptr);
+    va_end(arg_ptr);
+}
+
+VOID ConFormatMessage(DWORD nStdHandle, DWORD MessageId, ...)
+{
+    DWORD ret;
+    LPTSTR text;
+    va_list arg_ptr;
+
+    va_start(arg_ptr, MessageId);
+    ret = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
+                        NULL,
+                        MessageId,
+                        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+                        (LPTSTR)&text,
+                        0,
+                        &arg_ptr);
+    va_end(arg_ptr);
+
+    if (ret > 0)
+    {
+        ConPuts(nStdHandle, text);
+        LocalFree(text);
+    }
+    else
+    {
+        ConResPrintf(nStdHandle, STRING_CONSOLE_ERROR, MessageId);
+    }
+}
+
+
+
+/************************** Console PAGER functions ***************************/
+
+BOOL ConPrintfVPaging(DWORD nStdHandle, BOOL NewPage, LPTSTR szFormat, va_list arg_ptr)
 {
     INT len;
     CONSOLE_SCREEN_BUFFER_INFO csbi;
@@ -319,14 +366,14 @@ INT ConPrintfPaging(BOOL NewPage, LPTSTR szFormat, va_list arg_ptr, DWORD nStdHa
 
     /* Reset LineCount and return if no string has been given */
     if (szFormat == NULL)
-        return 0;
+        return TRUE;
 
     /* Get the size of the visual screen that can be printed to */
     if (!IsConsoleHandle(hOutput) || !GetConsoleScreenBufferInfo(hOutput, &csbi))
     {
         /* We assume it's a file handle */
-        ConPrintf(szFormat, arg_ptr, nStdHandle);
-        return 0;
+        ConPrintfV(nStdHandle, szFormat, arg_ptr);
+        return TRUE;
     }
 
     /*
@@ -339,8 +386,8 @@ INT ConPrintfPaging(BOOL NewPage, LPTSTR szFormat, va_list arg_ptr, DWORD nStdHa
     /* Make sure the user doesn't have the screen too small */
     if (ScreenLines < 4)
     {
-        ConPrintf(szFormat, arg_ptr, nStdHandle);
-        return 0;
+        ConPrintfV(nStdHandle, szFormat, arg_ptr);
+        return TRUE;
     }
 
     len = _vstprintf(szOut, szFormat, arg_ptr);
@@ -361,9 +408,7 @@ INT ConPrintfPaging(BOOL NewPage, LPTSTR szFormat, va_list arg_ptr, DWORD nStdHa
 
             /* Prompt the user */
             if (PagePrompt() != PROMPT_YES)
-            {
-                return 1;
-            }
+                return FALSE;
 
             // TODO: Recalculate 'ScreenLines' in case the user redimensions
             // the window during the prompt.
@@ -375,137 +420,30 @@ INT ConPrintfPaging(BOOL NewPage, LPTSTR szFormat, va_list arg_ptr, DWORD nStdHa
 
     WriteConsole(hOutput, &szOut[from], i-from, &dwWritten, NULL);
 
-    return 0;
-}
-
-VOID ConErrFormatMessage(DWORD MessageId, ...)
-{
-    TCHAR szMsg[RC_STRING_MAX_SIZE];
-    DWORD ret;
-    LPTSTR text;
-    va_list arg_ptr;
-
-    va_start(arg_ptr, MessageId);
-    ret = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
-                        NULL,
-                        MessageId,
-                        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
-                        (LPTSTR) &text,
-                        0,
-                        &arg_ptr);
-
-    va_end(arg_ptr);
-    if (ret > 0)
-    {
-        ConErrPuts(text);
-        LocalFree(text);
-    }
-    else
-    {
-        LoadString(CMD_ModuleHandle, STRING_CONSOLE_ERROR, szMsg, ARRAYSIZE(szMsg));
-        ConErrPrintf(szMsg);
-    }
-}
-
-VOID ConOutFormatMessage(DWORD MessageId, ...)
-{
-    TCHAR szMsg[RC_STRING_MAX_SIZE];
-    DWORD ret;
-    LPTSTR text;
-    va_list arg_ptr;
-
-    va_start(arg_ptr, MessageId);
-    ret = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
-                        NULL,
-                        MessageId,
-                        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
-                        (LPTSTR) &text,
-                        0,
-                        &arg_ptr);
-
-    va_end(arg_ptr);
-    if (ret > 0)
-    {
-        ConErrPuts(text);
-        LocalFree(text);
-    }
-    else
-    {
-        LoadString(CMD_ModuleHandle, STRING_CONSOLE_ERROR, szMsg, ARRAYSIZE(szMsg));
-        ConErrPrintf(szMsg);
-    }
+    return TRUE;
 }
 
-VOID ConOutResPrintf(UINT resID, ...)
+BOOL ConOutPrintfPaging(BOOL NewPage, LPTSTR szFormat, ...)
 {
-    TCHAR szMsg[RC_STRING_MAX_SIZE];
-    va_list arg_ptr;
-
-    va_start(arg_ptr, resID);
-    LoadString(CMD_ModuleHandle, resID, szMsg, ARRAYSIZE(szMsg));
-    ConPrintf(szMsg, arg_ptr, STD_OUTPUT_HANDLE);
-    va_end(arg_ptr);
-}
-
-VOID ConOutPrintf(LPTSTR szFormat, ...)
-{
-    va_list arg_ptr;
-
-    va_start(arg_ptr, szFormat);
-    ConPrintf(szFormat, arg_ptr, STD_OUTPUT_HANDLE);
-    va_end(arg_ptr);
-}
-
-INT ConOutPrintfPaging(BOOL NewPage, LPTSTR szFormat, ...)
-{
-    INT iReturn;
+    BOOL bRet;
     va_list arg_ptr;
 
     va_start(arg_ptr, szFormat);
-    iReturn = ConPrintfPaging(NewPage, szFormat, arg_ptr, STD_OUTPUT_HANDLE);
+    bRet = ConPrintfVPaging(STD_OUTPUT_HANDLE, NewPage, szFormat, arg_ptr);
     va_end(arg_ptr);
-    return iReturn;
-}
-
-VOID ConErrChar(TCHAR c)
-{
-    ConWrite(&c, 1, STD_ERROR_HANDLE);
+    return bRet;
 }
 
-
-VOID ConErrResPuts(UINT resID)
+VOID ConOutResPaging(BOOL NewPage, UINT resID)
 {
     TCHAR szMsg[RC_STRING_MAX_SIZE];
     LoadString(CMD_ModuleHandle, resID, szMsg, ARRAYSIZE(szMsg));
-    ConPuts(szMsg, STD_ERROR_HANDLE);
-}
-
-VOID ConErrPuts(LPTSTR szText)
-{
-    ConPuts(szText, STD_ERROR_HANDLE);
-}
-
-
-VOID ConErrResPrintf(UINT resID, ...)
-{
-    TCHAR szMsg[RC_STRING_MAX_SIZE];
-    va_list arg_ptr;
-
-    va_start(arg_ptr, resID);
-    LoadString(CMD_ModuleHandle, resID, szMsg, ARRAYSIZE(szMsg));
-    ConPrintf(szMsg, arg_ptr, STD_ERROR_HANDLE);
-    va_end(arg_ptr);
+    ConOutPrintfPaging(NewPage, szMsg);
 }
 
-VOID ConErrPrintf(LPTSTR szFormat, ...)
-{
-    va_list arg_ptr;
 
-    va_start(arg_ptr, szFormat);
-    ConPrintf(szFormat, arg_ptr, STD_ERROR_HANDLE);
-    va_end(arg_ptr);
-}
 
+/************************** Console SCREEN functions **************************/
 
 VOID SetCursorXY(SHORT x, SHORT y)
 {
@@ -566,4 +504,85 @@ VOID GetScreenSize(PSHORT maxx, PSHORT maxy)
     if (maxy) *maxy = csbi.dwSize.Y;
 }
 
+
+
+
+BOOL ConSetTitle(IN LPCTSTR lpConsoleTitle)
+{
+    /* Now really set the console title */
+    return SetConsoleTitle(lpConsoleTitle);
+}
+
+#ifdef INCLUDE_CMD_BEEP
+VOID ConRingBell(HANDLE hOutput)
+{
+#if 0
+    /* Emit an error beep sound */
+    if (IsConsoleHandle(hOutput))
+        Beep(800, 200);
+    else if (IsTTYHandle(hOutput))
+        ConOutPuts(_T("\a")); // BEL character 0x07
+    else
+#endif
+        MessageBeep(-1);
+}
+#endif
+
+#ifdef INCLUDE_CMD_CLS
+VOID ConClearScreen(HANDLE hOutput)
+{
+    CONSOLE_SCREEN_BUFFER_INFO csbi;
+    COORD coPos;
+    DWORD dwWritten;
+
+    if (GetConsoleScreenBufferInfo(hOutput, &csbi))
+    {
+        coPos.X = 0;
+        coPos.Y = 0;
+        FillConsoleOutputAttribute(hOutput, csbi.wAttributes,
+                                   csbi.dwSize.X * csbi.dwSize.Y,
+                                   coPos, &dwWritten);
+        FillConsoleOutputCharacter(hOutput, _T(' '),
+                                   csbi.dwSize.X * csbi.dwSize.Y,
+                                   coPos, &dwWritten);
+        SetConsoleCursorPosition(hOutput, coPos);
+    }
+    else
+    {
+        ConOutChar(_T('\f'));
+    }
+}
+#endif
+
+#ifdef INCLUDE_CMD_COLOR
+BOOL ConSetScreenColor(HANDLE hOutput, WORD wColor, BOOL bFill)
+{
+    DWORD dwWritten;
+    CONSOLE_SCREEN_BUFFER_INFO csbi;
+    COORD coPos;
+
+    /* Foreground and Background colors can't be the same */
+    if ((wColor & 0x0F) == (wColor & 0xF0) >> 4)
+        return FALSE;
+
+    /* Fill the whole background if needed */
+    if (bFill)
+    {
+        GetConsoleScreenBufferInfo(hOutput, &csbi);
+
+        coPos.X = 0;
+        coPos.Y = 0;
+        FillConsoleOutputAttribute(hOutput,
+                                   wColor & 0x00FF,
+                                   csbi.dwSize.X * csbi.dwSize.Y,
+                                   coPos,
+                                   &dwWritten);
+    }
+
+    /* Set the text attribute */
+    SetConsoleTextAttribute(hOutput, wColor & 0x00FF);
+    return TRUE;
+}
+#endif
+
 /* EOF */