[1/4] cmd: Improve handle type recognition in WCMD_ReadFile (try 5)

Frédéric Delanoy frederic.delanoy at gmail.com
Wed Oct 5 07:02:43 CDT 2011


try 5: formatting fix
try 4: drop 'cmd: Avoid checking handle type when already known in WCMD_ReadFile'
patch and improve handle type detection instead (derived from handle value), as
suggested by Éric Pouech.
This gives a noticeable speedup compared to the previous version (calling
ReadConsoleW first and ReadFile on failure)

---
 programs/cmd/wcmdmain.c |   36 +++++++++++++++++-------------------
 1 files changed, 17 insertions(+), 19 deletions(-)

diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c
index eb57928..5611642 100644
--- a/programs/cmd/wcmdmain.c
+++ b/programs/cmd/wcmdmain.c
@@ -233,6 +233,11 @@ void WCMD_leave_paged_mode(void)
   pagedMessage = NULL;
 }
 
+static inline BOOL is_console_handle(HANDLE h)
+{
+    return (((DWORD_PTR)h) & 3) == 3;
+}
+
 /***************************************************************************
  * WCMD_Readfile
  *
@@ -240,30 +245,23 @@ void WCMD_leave_paged_mode(void)
  */
 BOOL WCMD_ReadFile(const HANDLE hIn, WCHAR *intoBuf, const DWORD maxChars, LPDWORD charsRead)
 {
-    BOOL   res;
-
-    /* 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;
 
-        DWORD numRead;
-        char *buffer;
+    if (is_console_handle(hIn))
+        /* Try to read from console as Unicode */
+        return ReadConsoleW(hIn, intoBuf, maxChars, charsRead, NULL);
 
-        if (!(buffer = get_file_buffer()))
-            return FALSE;
+    /* We assume it's a file handle and read then convert from assumed OEM codepage */
+    if (!(buffer = get_file_buffer()))
+        return FALSE;
 
-        /* Read from file (assume OEM codepage) */
-        res = ReadFile(hIn, buffer, maxChars, &numRead, NULL);
+    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.7




More information about the wine-patches mailing list