[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