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

Frédéric Delanoy frederic.delanoy at gmail.com
Tue Oct 4 07:41:01 CDT 2011


In some cases, the handle type is already known (e.g. in WCMD_fgets), so don't bother autodetecting it.

try 2: Add a handle type enum as suggested by Dan Kegel
---
 programs/cmd/batch.c    |    2 +-
 programs/cmd/builtins.c |   29 ++++++++++++++++++-----------
 programs/cmd/wcmd.h     |   11 ++++++++++-
 programs/cmd/wcmdmain.c |   31 ++++++++++++++++++-------------
 4 files changed, 47 insertions(+), 26 deletions(-)

diff --git a/programs/cmd/batch.c b/programs/cmd/batch.c
index 5f83c35..e13ecaa 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, CMD_HT_FILE);
     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..19348d9 100644
--- a/programs/cmd/builtins.c
+++ b/programs/cmd/builtins.c
@@ -115,7 +115,8 @@ 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,
+                    CMD_HT_UNKNOWN);
       answer[0] = toupperW(answer[0]);
     }
 
@@ -305,7 +306,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, CMD_HT_UNKNOWN);
 
         if (!opt_s)
             answer[0] = toupperW(answer[0]);
@@ -1696,7 +1697,8 @@ 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,
+                CMD_HT_UNKNOWN);
 }
 
 /****************************************************************************
@@ -2144,7 +2146,8 @@ 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,
+                      CMD_HT_UNKNOWN);
         if (count > 2) {
           WCMD_output (WCMD_LoadMessage(WCMD_NYI));
         }
@@ -2262,7 +2265,8 @@ 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,
+                  CMD_HT_UNKNOWN);
     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 +2376,8 @@ 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,
+                      CMD_HT_UNKNOWN);
         if (count > 2) {
           WCMD_output (WCMD_LoadMessage(WCMD_NYI));
         }
@@ -2469,7 +2474,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, CMD_HT_FILE)) {
         if (count == 0) break;	/* ReadFile reports success on EOF! */
         buffer[count] = 0;
         WCMD_output_asis (buffer);
@@ -2523,7 +2528,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, CMD_HT_UNKNOWN)) {
       if (count == 0) break;	/* ReadFile reports success on EOF! */
       buffer[count] = 0;
       WCMD_output_asis (buffer);
@@ -2554,7 +2559,8 @@ 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,
+                      CMD_HT_UNKNOWN);
         WCMD_enter_paged_mode(moreStrPage);
       }
 
@@ -2576,7 +2582,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 +2683,8 @@ 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,
+                  CMD_HT_UNKNOWN);
     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..8eb7b03 100644
--- a/programs/cmd/wcmd.h
+++ b/programs/cmd/wcmd.h
@@ -50,6 +50,14 @@ typedef struct _CMD_LIST {
   WCHAR               pipeFile[MAX_PATH]; /* Where to get input from for pipes */
 } CMD_LIST;
 
+/* Data structure to hold handle type */
+
+typedef enum _CMD_HANDLE_TYPE {
+  CMD_HT_FILE,     /* File handle */
+  CMD_HT_CONSOLE,  /* Console handle */
+  CMD_HT_UNKNOWN   /* Unknown type (file or console) */
+} CMD_HANDLE_TYPE;
+
 void WCMD_assoc (const WCHAR *, BOOL);
 void WCMD_batch (WCHAR *, WCHAR *, int, WCHAR *, HANDLE);
 void WCMD_call (WCHAR *command);
@@ -108,7 +116,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,
+                   CMD_HANDLE_TYPE 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..0643558 100644
--- a/programs/cmd/wcmdmain.c
+++ b/programs/cmd/wcmdmain.c
@@ -234,20 +234,25 @@ void WCMD_leave_paged_mode(void)
 }
 
 /***************************************************************************
- * WCMD_Readfile
+ * WCMD_ReadFile
  *
- *	Read characters in from a console/file, returning result in Unicode
+ * Reads characters in from a console/file, returning result in Unicode
  */
-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,
+                   CMD_HANDLE_TYPE handle_type)
 {
-    BOOL   res;
+    BOOL res;
 
-    /* Try to read from console as Unicode */
-    res = ReadConsoleW(hIn, intoBuf, maxChars, charsRead, NULL);
+    if (handle_type == CMD_HT_CONSOLE || handle_type == CMD_HT_UNKNOWN) {
+       /* Try to read from console as Unicode */
+       res = ReadConsoleW(hIn, intoBuf, maxChars, charsRead, NULL);
+       if (handle_type == CMD_HT_CONSOLE)
+           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 == CMD_HT_FILE || !res) {
 
         DWORD numRead;
         char *buffer;
@@ -259,10 +264,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 +295,8 @@ 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,
+                        CMD_HT_UNKNOWN);
         }
       }
     } while (((message = ptr) != NULL) && (*ptr));
-- 
1.7.7




More information about the wine-patches mailing list