[1/4] cmd: Avoid checking handle type when already known in WCMD_ReadFile

Frédéric Delanoy frederic.delanoy at gmail.com
Tue Oct 4 04:06:16 CDT 2011


In some cases, the handle type is already known (e.g. in WCMD_fgets), so don't bother autodetecting it.
---
 programs/cmd/batch.c    |    2 +-
 programs/cmd/builtins.c |   22 +++++++++++-----------
 programs/cmd/wcmd.h     |    3 ++-
 programs/cmd/wcmdmain.c |   30 ++++++++++++++++++------------
 4 files changed, 32 insertions(+), 25 deletions(-)

diff --git a/programs/cmd/batch.c b/programs/cmd/batch.c
index 5f83c35..17ceb32 100644
--- a/programs/cmd/batch.c
+++ b/programs/cmd/batch.c
@@ -210,7 +210,7 @@ WCHAR *WCMD_fgets(WCHAR *s, int noChars, HANDLE h, BOOL is_console_handle)
 
   /* TODO: More intelligent buffering for reading lines from files */
   do {
-    status = WCMD_ReadFile(h, s, 1, &bytes);
+    status = WCMD_ReadFile(h, s, 1, &bytes, 0);
     if ((status == 0) || ((bytes == 0) && (s == p))) return NULL;
     if (*s == '\n') bytes = 0;
     else if (*s != '\r') {
diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c
index 0df123a..2bb647b 100644
--- a/programs/cmd/builtins.c
+++ b/programs/cmd/builtins.c
@@ -115,7 +115,7 @@ static BOOL WCMD_ask_confirm (const WCHAR *message, BOOL showSureText,
           WCMD_output_asis (Abuffer);
       }
       WCMD_output_asis (endBkt);
-      WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), answer, sizeof(answer)/sizeof(WCHAR), &count);
+      WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), answer, sizeof(answer)/sizeof(WCHAR), &count, 2);
       answer[0] = toupperW(answer[0]);
     }
 
@@ -305,7 +305,7 @@ void WCMD_choice (const WCHAR * command) {
     while (TRUE) {
 
         /* FIXME: Add support for option /T */
-        WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), answer, 1, &count);
+        WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), answer, 1, &count, 2);
 
         if (!opt_s)
             answer[0] = toupperW(answer[0]);
@@ -1696,7 +1696,7 @@ void WCMD_pause (void) {
   WCHAR string[32];
 
   WCMD_output (anykey);
-  WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), string, sizeof(string)/sizeof(WCHAR), &count);
+  WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), string, sizeof(string)/sizeof(WCHAR), &count, 2);
 }
 
 /****************************************************************************
@@ -2144,7 +2144,7 @@ void WCMD_setshow_date (void) {
       WCMD_output (WCMD_LoadMessage(WCMD_CURRENTDATE), curdate);
       if (strstrW (quals, parmT) == NULL) {
         WCMD_output (WCMD_LoadMessage(WCMD_NEWDATE));
-        WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), buffer, sizeof(buffer)/sizeof(WCHAR), &count);
+        WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), buffer, sizeof(buffer)/sizeof(WCHAR), &count, 2);
         if (count > 2) {
           WCMD_output (WCMD_LoadMessage(WCMD_NYI));
         }
@@ -2262,7 +2262,7 @@ void WCMD_setshow_env (WCHAR *s) {
     if (strlenW(p) != 0) WCMD_output(p);
 
     /* Read the reply */
-    WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), string, sizeof(string)/sizeof(WCHAR), &count);
+    WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), string, sizeof(string)/sizeof(WCHAR), &count, 2);
     if (count > 1) {
       string[count-1] = '\0'; /* ReadFile output is not null-terminated! */
       if (string[count-2] == '\r') string[count-2] = '\0'; /* Under Windoze we get CRLF! */
@@ -2372,7 +2372,7 @@ void WCMD_setshow_time (void) {
       WCMD_output (WCMD_LoadMessage(WCMD_CURRENTTIME), curtime);
       if (strstrW (quals, parmT) == NULL) {
         WCMD_output (WCMD_LoadMessage(WCMD_NEWTIME));
-        WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), buffer, sizeof(buffer)/sizeof(WCHAR), &count);
+        WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), buffer, sizeof(buffer)/sizeof(WCHAR), &count, 2);
         if (count > 2) {
           WCMD_output (WCMD_LoadMessage(WCMD_NYI));
         }
@@ -2469,7 +2469,7 @@ void WCMD_type (WCHAR *command) {
         static const WCHAR fmt[] = {'\n','%','s','\n','\n','\0'};
         WCMD_output(fmt, thisArg);
       }
-      while (WCMD_ReadFile(h, buffer, sizeof(buffer)/sizeof(WCHAR) - 1, &count)) {
+      while (WCMD_ReadFile(h, buffer, sizeof(buffer)/sizeof(WCHAR) - 1, &count, 0)) {
         if (count == 0) break;	/* ReadFile reports success on EOF! */
         buffer[count] = 0;
         WCMD_output_asis (buffer);
@@ -2523,7 +2523,7 @@ void WCMD_more (WCHAR *command) {
     wsprintfW(moreStrPage, moreFmt, moreStr);
 
     WCMD_enter_paged_mode(moreStrPage);
-    while (WCMD_ReadFile(hstdin, buffer, (sizeof(buffer)/sizeof(WCHAR))-1, &count)) {
+    while (WCMD_ReadFile(hstdin, buffer, (sizeof(buffer)/sizeof(WCHAR))-1, &count, 2)) {
       if (count == 0) break;	/* ReadFile reports success on EOF! */
       buffer[count] = 0;
       WCMD_output_asis (buffer);
@@ -2554,7 +2554,7 @@ void WCMD_more (WCHAR *command) {
         wsprintfW(moreStrPage, moreFmt2, moreStr, 100);
         WCMD_leave_paged_mode();
         WCMD_output_asis(moreStrPage);
-        WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), buffer, sizeof(buffer)/sizeof(WCHAR), &count);
+        WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), buffer, sizeof(buffer)/sizeof(WCHAR), &count, 2);
         WCMD_enter_paged_mode(moreStrPage);
       }
 
@@ -2576,7 +2576,7 @@ void WCMD_more (WCHAR *command) {
         fileLen = (((ULONG64)fileInfo.nFileSizeHigh) << 32) + fileInfo.nFileSizeLow;
 
         needsPause = TRUE;
-        while (WCMD_ReadFile(h, buffer, (sizeof(buffer)/sizeof(WCHAR))-1, &count)) {
+        while (WCMD_ReadFile(h, buffer, (sizeof(buffer)/sizeof(WCHAR))-1, &count, 0)) {
           if (count == 0) break;	/* ReadFile reports success on EOF! */
           buffer[count] = 0;
           curPos += count;
@@ -2677,7 +2677,7 @@ int WCMD_volume(BOOL set_label, const WCHAR *path)
     	curdir[0], label, HIWORD(serial), LOWORD(serial));
   if (set_label) {
     WCMD_output (WCMD_LoadMessage(WCMD_VOLUMEPROMPT));
-    WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), string, sizeof(string)/sizeof(WCHAR), &count);
+    WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), string, sizeof(string)/sizeof(WCHAR), &count, 2);
     if (count > 1) {
       string[count-1] = '\0';		/* ReadFile output is not null-terminated! */
       if (string[count-2] == '\r') string[count-2] = '\0'; /* Under Windoze we get CRLF! */
diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h
index 98e1246..26c3e81 100644
--- a/programs/cmd/wcmd.h
+++ b/programs/cmd/wcmd.h
@@ -108,7 +108,8 @@ void WCMD_opt_s_strip_quotes(WCHAR *cmd);
 WCHAR *WCMD_LoadMessage(UINT id);
 WCHAR *WCMD_strdupW(const WCHAR *input);
 void WCMD_strsubstW(WCHAR *start, const WCHAR* next, const WCHAR* insert, int len);
-BOOL WCMD_ReadFile(const HANDLE hIn, WCHAR *intoBuf, const DWORD maxChars, LPDWORD charsRead);
+BOOL WCMD_ReadFile(const HANDLE hIn, WCHAR *intoBuf, const DWORD maxChars, LPDWORD charsRead,
+                   DWORD handle_type);
 
 WCHAR    *WCMD_ReadAndParseLine(const WCHAR *initialcmd, CMD_LIST **output,
                                 HANDLE readFrom, const BOOL is_console_handle);
diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c
index eb57928..e385efe 100644
--- a/programs/cmd/wcmdmain.c
+++ b/programs/cmd/wcmdmain.c
@@ -236,18 +236,25 @@ void WCMD_leave_paged_mode(void)
 /***************************************************************************
  * WCMD_Readfile
  *
- *	Read characters in from a console/file, returning result in Unicode
+ * Reads characters in from a console/file, returning result in Unicode
+ * handle_type: type of hIn handle
+ *              0 if file, 1 if console, anything else if unknown (autodetect)
  */
-BOOL WCMD_ReadFile(const HANDLE hIn, WCHAR *intoBuf, const DWORD maxChars, LPDWORD charsRead)
+BOOL WCMD_ReadFile(const HANDLE hIn, WCHAR *intoBuf, const DWORD maxChars, LPDWORD charsRead,
+                   DWORD handle_type)
 {
-    BOOL   res;
+    BOOL res;
 
-    /* Try to read from console as Unicode */
-    res = ReadConsoleW(hIn, intoBuf, maxChars, charsRead, NULL);
+    if (handle_type > 0) {
+       /* Try to read from console as Unicode */
+       res = ReadConsoleW(hIn, intoBuf, maxChars, charsRead, NULL);
+       if (handle_type == 1)
+           return res;
+    }
 
-    /* If reading from console has failed we assume its file
-       i/o so read in and convert from OEM codepage               */
-    if (!res) {
+    /* If reading from console has failed (or if it's a file handle) read as file
+       and convert from OEM codepage */
+    if (handle_type == 0 || !res) {
 
         DWORD numRead;
         char *buffer;
@@ -259,10 +266,9 @@ BOOL WCMD_ReadFile(const HANDLE hIn, WCHAR *intoBuf, const DWORD maxChars, LPDWO
         res = ReadFile(hIn, buffer, maxChars, &numRead, NULL);
 
         /* Convert from OEM */
-        *charsRead = MultiByteToWideChar(GetConsoleCP(), 0, buffer, numRead,
-                         intoBuf, maxChars);
-
+        *charsRead = MultiByteToWideChar(GetConsoleCP(), 0, buffer, numRead, intoBuf, maxChars);
     }
+
     return res;
 }
 
@@ -291,7 +297,7 @@ static void WCMD_output_asis_handle (DWORD std_handle, const WCHAR *message) {
         if (++line_count >= max_height - 1) {
           line_count = 0;
           WCMD_output_asis_len(pagedMessage, strlenW(pagedMessage), handle);
-          WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), string, sizeof(string)/sizeof(WCHAR), &count);
+          WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), string, sizeof(string)/sizeof(WCHAR), &count, 2);
         }
       }
     } while (((message = ptr) != NULL) && (*ptr));
-- 
1.7.6.3




More information about the wine-patches mailing list