[PATCH 2/2] attrib.exe: Use program_output.h for console writing
Hugh McMaster
hugh.mcmaster at outlook.com
Tue Mar 17 07:16:40 CDT 2015
---
programs/attrib/attrib.c | 106 +++--------------------------------------------
1 file changed, 5 insertions(+), 101 deletions(-)
diff --git a/programs/attrib/attrib.c b/programs/attrib/attrib.c
index 7e3b01e..3b5b463 100644
--- a/programs/attrib/attrib.c
+++ b/programs/attrib/attrib.c
@@ -21,6 +21,7 @@
#include <windows.h>
#include <wine/debug.h>
#include <wine/unicode.h>
+#include <wine/program_output.h>
#include "attrib.h"
WINE_DEFAULT_DEBUG_CHANNEL(attrib);
@@ -28,103 +29,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(attrib);
static const WCHAR starW[] = {'*','\0'};
/* =========================================================================
- * Load a string from the resource file, handling any error
- * Returns string retrieved from resource file
- * ========================================================================= */
-static WCHAR *ATTRIB_LoadMessage(UINT id)
-{
- static WCHAR msg[MAXSTRING];
- const WCHAR failedMsg[] = {'F', 'a', 'i', 'l', 'e', 'd', '!', 0};
-
- if (!LoadStringW(GetModuleHandleW(NULL), id, msg, sizeof(msg)/sizeof(WCHAR))) {
- WINE_FIXME("LoadString failed with %d\n", GetLastError());
- lstrcpyW(msg, failedMsg);
- }
- return msg;
-}
-
-/* =========================================================================
- * Output a formatted unicode string. Ideally this will go to the console
- * and hence required WriteConsoleW to output it, however if file i/o is
- * redirected, it needs to be WriteFile'd using OEM (not ANSI) format
- * ========================================================================= */
-static int __cdecl ATTRIB_wprintf(const WCHAR *format, ...)
-{
- static WCHAR *output_bufW = NULL;
- static char *output_bufA = NULL;
- static BOOL toConsole = TRUE;
- static BOOL traceOutput = FALSE;
-#define MAX_WRITECONSOLE_SIZE 65535
-
- __ms_va_list parms;
- DWORD nOut;
- int len;
- DWORD res = 0;
-
- /*
- * Allocate buffer to use when writing to console
- * Note: Not freed - memory will be allocated once and released when
- * xcopy ends
- */
-
- if (!output_bufW) output_bufW = HeapAlloc(GetProcessHeap(), 0,
- MAX_WRITECONSOLE_SIZE*sizeof(WCHAR));
- if (!output_bufW) {
- WINE_FIXME("Out of memory - could not allocate 2 x 64 KB buffers\n");
- return 0;
- }
-
- __ms_va_start(parms, format);
- SetLastError(NO_ERROR);
- len = FormatMessageW(FORMAT_MESSAGE_FROM_STRING, format, 0, 0, output_bufW,
- MAX_WRITECONSOLE_SIZE/sizeof(*output_bufW), &parms);
- __ms_va_end(parms);
- if (len == 0 && GetLastError() != NO_ERROR) {
- WINE_FIXME("Could not format string: le=%u, fmt=%s\n", GetLastError(), wine_dbgstr_w(format));
- return 0;
- }
-
- /* Try to write as unicode all the time we think it's a console */
- if (toConsole) {
- res = WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE),
- output_bufW, len, &nOut, NULL);
- }
-
- /* If writing to console has failed (ever) we assume it's file
- i/o so convert to OEM codepage and output */
- if (!res) {
- BOOL usedDefaultChar = FALSE;
- DWORD convertedChars;
-
- toConsole = FALSE;
-
- /*
- * Allocate buffer to use when writing to file. Not freed, as above
- */
- if (!output_bufA) output_bufA = HeapAlloc(GetProcessHeap(), 0,
- MAX_WRITECONSOLE_SIZE);
- if (!output_bufA) {
- WINE_FIXME("Out of memory - could not allocate 2 x 64 KB buffers\n");
- return 0;
- }
-
- /* Convert to OEM, then output */
- convertedChars = WideCharToMultiByte(GetConsoleOutputCP(), 0, output_bufW,
- len, output_bufA, MAX_WRITECONSOLE_SIZE,
- "?", &usedDefaultChar);
- WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), output_bufA, convertedChars,
- &nOut, FALSE);
- }
-
- /* Trace whether screen or console */
- if (!traceOutput) {
- WINE_TRACE("Writing to console? (%d)\n", toConsole);
- traceOutput = TRUE;
- }
- return nOut;
-}
-
-/* =========================================================================
* Handle the processing for a single directory, optionally recursing into
* subdirectories if needed.
* Parameters:
@@ -235,7 +139,7 @@ static BOOL ATTRIB_processdirectory(const WCHAR *rootdir, const WCHAR *filespec,
}
strcpyW(buffer, rootdir);
strcatW(buffer, fd.cFileName);
- ATTRIB_wprintf(fmt, flags, buffer);
+ WINEPROG_output_array(fmt, flags, buffer);
for (count = 0; count < (sizeof(flags)/sizeof(WCHAR) - 1); count++) flags[count] = ' ';
found = TRUE;
}
@@ -261,7 +165,7 @@ int wmain(int argc, WCHAR *argv[])
BOOL found = FALSE;
if ((argc >= 2) && !strcmpW(argv[1], help_option)) {
- ATTRIB_wprintf(ATTRIB_LoadMessage(STRING_HELP));
+ WINEPROG_output_message(STRING_HELP);
return 0;
}
@@ -279,7 +183,7 @@ int wmain(int argc, WCHAR *argv[])
case 'R': case 'r': attrib |= FILE_ATTRIBUTE_READONLY; break;
case 'A': case 'a': attrib |= FILE_ATTRIBUTE_ARCHIVE; break;
default:
- ATTRIB_wprintf(ATTRIB_LoadMessage(STRING_NYI));
+ WINEPROG_output_message(STRING_NYI);
return 0;
}
switch (param[0]) {
@@ -319,7 +223,7 @@ int wmain(int argc, WCHAR *argv[])
found = ATTRIB_processdirectory(curdir, name, attrib_recurse,
attrib_includedirs, attrib_set, attrib_clear);
if (!found) {
- ATTRIB_wprintf(ATTRIB_LoadMessage(STRING_FILENOTFOUND), originalname);
+ WINEPROG_output_message(STRING_FILENOTFOUND, originalname);
}
return 0;
}
--
1.9.1
More information about the wine-patches
mailing list