[2/4] cmd: Avoid reading char by char from console

Frédéric Delanoy frederic.delanoy at gmail.com
Mon Sep 26 17:42:41 CDT 2011


This also makes sure WCMD_ReadFile is only used to read from files, and never from the console
---
 programs/cmd/batch.c    |   16 ++++++++++++----
 programs/cmd/wcmdmain.c |   31 ++++++++++---------------------
 2 files changed, 22 insertions(+), 25 deletions(-)

diff --git a/programs/cmd/batch.c b/programs/cmd/batch.c
index c5e73c6..2285caf 100644
--- a/programs/cmd/batch.c
+++ b/programs/cmd/batch.c
@@ -181,13 +181,21 @@ WCHAR *WCMD_parameter (WCHAR *s, int n, WCHAR **where, WCHAR **end) {
  * the LF (or CRLF) from the line.
  */
 
-WCHAR *WCMD_fgets (WCHAR *s, int noChars, HANDLE h) {
-
-  DWORD bytes;
-  BOOL status;
+WCHAR *WCMD_fgets (WCHAR *s, int noChars, HANDLE h)
+{
+  DWORD bytes, charsRead, dummy;
+  BOOL status, is_console_handle;
   WCHAR *p;
 
   p = s;
+  is_console_handle = !!GetConsoleMode(h, &dummy);
+  if (is_console_handle) {
+    status = ReadConsoleW(h, s, noChars, &charsRead, NULL);
+    if (!status) return NULL;
+    s[charsRead-2] = '\0'; /* Strip \r\n */
+    return p;
+  }
+  /* TODO: More intelligent buffering for reading lines from files */
   do {
     status = WCMD_ReadFile (h, s, 1, &bytes, NULL);
     if ((status == 0) || ((bytes == 0) && (s == p))) return NULL;
diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c
index b1d67bc..47096853 100644
--- a/programs/cmd/wcmdmain.c
+++ b/programs/cmd/wcmdmain.c
@@ -236,36 +236,25 @@ void WCMD_leave_paged_mode(void)
 /***************************************************************************
  * WCMD_Readfile
  *
- *	Read characters in from a console/file, returning result in Unicode
+ * Read characters in from a file, returning result in Unicode
  *      with signature identical to ReadFile
  */
 BOOL WCMD_ReadFile(const HANDLE hIn, WCHAR *intoBuf, const DWORD maxChars,
                           LPDWORD charsRead, const LPOVERLAPPED unused) {
 
-    BOOL   res;
+    DWORD numRead;
+    char *buffer;
 
-    /* Try to read from console as Unicode */
-    res = ReadConsoleW(hIn, intoBuf, maxChars, charsRead, NULL);
-
-    /* If reading from console has failed we assume its file
-       i/o so read in and convert from OEM codepage               */
-    if (!res) {
-
-        DWORD numRead;
-        char *buffer;
-
-        if (!(buffer = get_file_buffer()))
-            return FALSE;
+    if (!(buffer = get_file_buffer()))
+        return FALSE;
 
-        /* Read from file (assume OEM codepage) */
-        res = ReadFile(hIn, buffer, maxChars, &numRead, unused);
+    /* Read from file I/O so convert from assumed OEM codepage */
+    if (!ReadFile(hIn, buffer, maxChars, &numRead, NULL))
+        return FALSE;
 
-        /* Convert from OEM */
-        *charsRead = MultiByteToWideChar(GetConsoleCP(), 0, buffer, numRead,
-                         intoBuf, maxChars);
+    *charsRead = MultiByteToWideChar(GetConsoleCP(), 0, buffer, numRead, intoBuf, maxChars);
 
-    }
-    return res;
+    return TRUE;
 }
 
 /*******************************************************************
-- 
1.7.6.3




More information about the wine-patches mailing list