[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