update for HEAD-2003091401
[reactos.git] / subsys / system / cmd / console.c
index ec73f13..8e1d322 100644 (file)
 #define OUTPUT_BUFFER_SIZE  4096
 
 
-#ifdef _DEBUG
-VOID DebugPrintf (LPTSTR szFormat, ...)
-{
-       TCHAR szOut[OUTPUT_BUFFER_SIZE];
-       va_list arg_ptr;
-       DWORD dwWritten;
-
-       va_start (arg_ptr, szFormat);
-       _vstprintf (szOut, szFormat, arg_ptr);
-       va_end (arg_ptr);
-
-       WriteFile (GetStdHandle (STD_ERROR_HANDLE),
-                  szOut,
-                  _tcslen(szOut) * sizeof(TCHAR),
-                  &dwWritten,
-                  NULL);
-#if 0
-       OutputDebugString (szOut);
-#endif
-}
-#endif /* _DEBUG */
-
-
 VOID ConInDisable (VOID)
 {
        HANDLE hInput = GetStdHandle (STD_INPUT_HANDLE);
@@ -76,10 +53,14 @@ VOID ConInDummy (VOID)
 
 #ifdef _DEBUG
        if (hInput == INVALID_HANDLE_VALUE)
-               DebugPrintf ("Invalid input handle!!!\n");
+               DebugPrintf (_T("Invalid input handle!!!\n"));
 #endif /* _DEBUG */
-
+#ifdef __REACTOS__
+       /* ReadConsoleInputW isn't implwmented within ROS. */
+       ReadConsoleInputA (hInput, &dummy, 1, &dwRead);
+#else
        ReadConsoleInput (hInput, &dummy, 1, &dwRead);
+#endif
 }
 
 VOID ConInFlush (VOID)
@@ -95,12 +76,17 @@ VOID ConInKey (PINPUT_RECORD lpBuffer)
 
 #ifdef _DEBUG
        if (hInput == INVALID_HANDLE_VALUE)
-               DebugPrintf ("Invalid input handle!!!\n");
+               DebugPrintf (_T("Invalid input handle!!!\n"));
 #endif /* _DEBUG */
 
        do
        {
+#ifdef __REACTOS__
+               /* ReadConsoleInputW isn't implwmented within ROS. */
+               ReadConsoleInputA (hInput, lpBuffer, 1, &dwRead);
+#else
                ReadConsoleInput (hInput, lpBuffer, 1, &dwRead);
+#endif
                if ((lpBuffer->EventType == KEY_EVENT) &&
                        (lpBuffer->Event.KeyEvent.bKeyDown == TRUE))
                        break;
@@ -118,15 +104,24 @@ VOID ConInString (LPTSTR lpInput, DWORD dwLength)
 
        LPTSTR p;
        DWORD  i;
+       PCHAR pBuf;
 
+#ifdef UNICODE
+       pBuf = (PCHAR)alloca(dwLength);
+#else
+       pBuf = lpInput;
+#endif
        ZeroMemory (lpInput, dwLength * sizeof(TCHAR));
        hFile = GetStdHandle (STD_INPUT_HANDLE);
        GetConsoleMode (hFile, &dwOldMode);
 
        SetConsoleMode (hFile, ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT);
 
-       ReadFile (hFile, lpInput, dwLength, &dwRead, NULL);
+       ReadFile (hFile, (PVOID)pBuf, dwLength, &dwRead, NULL);
 
+#ifdef _UNICODE
+       MultiByteToWideChar(CP_ACP, 0, pBuf, dwLength + 1, lpInput, dwLength + 1);
+#endif
        p = lpInput;
        for (i = 0; i < dwRead; i++, p++)
        {
@@ -140,100 +135,132 @@ VOID ConInString (LPTSTR lpInput, DWORD dwLength)
        SetConsoleMode (hFile, dwOldMode);
 }
 
-
-VOID ConOutChar (TCHAR c)
+static VOID ConChar(TCHAR c, DWORD nStdHandle)
 {
        DWORD dwWritten;
-
-       WriteFile (GetStdHandle (STD_OUTPUT_HANDLE),
-                  &c,
-                  sizeof(TCHAR),
+       CHAR cc;
+#ifdef _UNICODE
+       CHAR as[2];
+       WCHAR ws[2];
+       ws[0] = c;
+       ws[1] = 0;
+       WideCharToMultiByte(CP_ACP, 0, ws, 2, as, 2, NULL, NULL);
+       cc = as[0];
+#else
+       cc = c;
+#endif
+       WriteFile (GetStdHandle (nStdHandle),
+                  &cc,
+                  1,
                   &dwWritten,
                   NULL);
 }
 
+VOID ConOutChar (TCHAR c)
+{
+       ConChar(c, STD_OUTPUT_HANDLE);
+}
 
-VOID ConOutPuts (LPTSTR szText)
+VOID ConPuts(LPTSTR szText, DWORD nStdHandle)
 {
        DWORD dwWritten;
-
-       WriteFile (GetStdHandle (STD_OUTPUT_HANDLE),
-                  szText,
-                  _tcslen(szText) * sizeof(TCHAR),
+       PCHAR pBuf;
+       INT len;
+
+       len = _tcslen(szText);
+#ifdef _UNICODE
+       pBuf = alloca(len + 1);
+       len = WideCharToMultiByte(CP_ACP, 0, szText, len + 1, pBuf, len + 1, NULL, NULL) - 1;
+#else
+       pBuf = szText;
+#endif
+       WriteFile (GetStdHandle (nStdHandle),
+                  pBuf,
+                  len,
                   &dwWritten,
                   NULL);
-       WriteFile (GetStdHandle (STD_OUTPUT_HANDLE),
-                  _T("\n"),
-                  sizeof(TCHAR),
+       WriteFile (GetStdHandle (nStdHandle),
+                  "\n",
+                  1,
                   &dwWritten,
                   NULL);
 }
 
+VOID ConOutPuts (LPTSTR szText)
+{
+       ConPuts(szText, STD_OUTPUT_HANDLE);
+}
+
 
-VOID ConOutPrintf (LPTSTR szFormat, ...)
+VOID ConPrintf(LPTSTR szFormat, va_list arg_ptr, DWORD nStdHandle)
 {
+       INT len;
+       PCHAR pBuf;
        TCHAR szOut[OUTPUT_BUFFER_SIZE];
        DWORD dwWritten;
-       va_list arg_ptr;
-
-       va_start (arg_ptr, szFormat);
-       _vstprintf (szOut, szFormat, arg_ptr);
-       va_end (arg_ptr);
 
-       WriteFile (GetStdHandle (STD_OUTPUT_HANDLE),
-                  szOut,
-                  _tcslen(szOut) * sizeof(TCHAR),
+       len = _vstprintf (szOut, szFormat, arg_ptr);
+#ifdef _UNICODE
+       pBuf = alloca(len + 1);
+       len = WideCharToMultiByte(CP_ACP, 0, szOut, len + 1, pBuf, len + 1, NULL, NULL) - 1;
+#else
+       pBuf = szOut;
+#endif
+       WriteFile (GetStdHandle (nStdHandle),
+                  pBuf,
+                  len,
                   &dwWritten,
                   NULL);
 }
 
 
-VOID ConErrChar (TCHAR c)
+VOID ConOutPrintf (LPTSTR szFormat, ...)
 {
-       DWORD dwWritten;
+       va_list arg_ptr;
 
-       WriteFile (GetStdHandle (STD_ERROR_HANDLE),
-                  &c,
-                  sizeof(TCHAR),
-                  &dwWritten,
-                  NULL);
+       va_start (arg_ptr, szFormat);
+       ConPrintf(szFormat, arg_ptr, STD_OUTPUT_HANDLE);
+       va_end (arg_ptr);
+}
+
+VOID ConErrChar (TCHAR c)
+{
+       ConChar(c, STD_ERROR_HANDLE);
 }
 
 
 VOID ConErrPuts (LPTSTR szText)
 {
-       DWORD dwWritten;
-
-       WriteFile (GetStdHandle (STD_ERROR_HANDLE),
-                  szText,
-                  _tcslen(szText) * sizeof(TCHAR),
-                  &dwWritten,
-                  NULL);
-       WriteFile (GetStdHandle (STD_ERROR_HANDLE),
-                  _T ("\n"),
-                  sizeof(TCHAR),
-                  &dwWritten,
-                  NULL);
+       ConPuts(szText, STD_ERROR_HANDLE);
 }
 
 
 VOID ConErrPrintf (LPTSTR szFormat, ...)
 {
-       TCHAR szOut[OUTPUT_BUFFER_SIZE];
-       DWORD dwWritten;
        va_list arg_ptr;
 
        va_start (arg_ptr, szFormat);
-       _vstprintf (szOut, szFormat, arg_ptr);
+       ConPrintf(szFormat, arg_ptr, STD_ERROR_HANDLE);
        va_end (arg_ptr);
-
-       WriteFile (GetStdHandle (STD_ERROR_HANDLE),
-                  szOut,
-                  _tcslen(szOut) * sizeof(TCHAR),
-                  &dwWritten,
-                  NULL);
 }
 
+#ifdef _DEBUG
+VOID DebugPrintf (LPTSTR szFormat, ...)
+{
+       va_list arg_ptr;
+
+       va_start (arg_ptr, szFormat);
+       ConPrintf(szFormat, arg_ptr, STD_ERROR_HANDLE);
+       va_end (arg_ptr);
+#if 0
+       TCHAR szOut[OUTPUT_BUFFER_SIZE];
+       va_start (arg_ptr, szFormat);
+       _vstprintf (szOut, szFormat, arg_ptr);
+       OutputDebugString (szOut);
+       va_end (arg_ptr);
+#endif
+}
+#endif /* _DEBUG */
 
 VOID SetCursorXY (SHORT x, SHORT y)
 {
@@ -249,7 +276,7 @@ VOID GetCursorXY (PSHORT x, PSHORT y)
 {
        CONSOLE_SCREEN_BUFFER_INFO csbi;
 
-       GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &csbi);
+       GetConsoleScreenBufferInfo (hConsole, &csbi);
 
        *x = csbi.dwCursorPosition.X;
        *y = csbi.dwCursorPosition.Y;
@@ -260,7 +287,7 @@ SHORT GetCursorX (VOID)
 {
        CONSOLE_SCREEN_BUFFER_INFO csbi;
 
-       GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &csbi);
+       GetConsoleScreenBufferInfo (hConsole, &csbi);
 
        return csbi.dwCursorPosition.X;
 }
@@ -270,7 +297,7 @@ SHORT GetCursorY (VOID)
 {
        CONSOLE_SCREEN_BUFFER_INFO csbi;
 
-       GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &csbi);
+       GetConsoleScreenBufferInfo (hConsole, &csbi);
 
        return csbi.dwCursorPosition.Y;
 }
@@ -280,7 +307,7 @@ VOID GetScreenSize (PSHORT maxx, PSHORT maxy)
 {
        CONSOLE_SCREEN_BUFFER_INFO csbi;
 
-       GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &csbi);
+       GetConsoleScreenBufferInfo (hConsole, &csbi);
 
        if (maxx)
                *maxx = csbi.dwSize.X;