[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