cmd: Use helper function to return file io buffer.

This commit is contained in:
Frédéric Delanoy 2011-09-23 12:37:43 +02:00 committed by Alexandre Julliard
parent 7fae5f4f9f
commit e5565a6d64
1 changed files with 25 additions and 22 deletions

View File

@ -102,6 +102,19 @@ static char *output_bufA = NULL;
#define MAX_WRITECONSOLE_SIZE 65535 #define MAX_WRITECONSOLE_SIZE 65535
static BOOL unicodePipes = FALSE; static BOOL unicodePipes = FALSE;
/*
* Returns a buffer for reading from/writing to file
* Never freed
*/
static char *get_file_buffer(void)
{
if (!output_bufA) {
output_bufA = HeapAlloc(GetProcessHeap(), 0, MAX_WRITECONSOLE_SIZE);
if (!output_bufA)
WINE_FIXME("Out of memory - could not allocate ansi 64K buffer\n");
}
return output_bufA;
}
/******************************************************************* /*******************************************************************
* WCMD_output_asis_len - send output to current standard output * WCMD_output_asis_len - send output to current standard output
@ -126,23 +139,18 @@ static void WCMD_output_asis_len(const WCHAR *message, int len, HANDLE device) {
if (!res) { if (!res) {
BOOL usedDefaultChar = FALSE; BOOL usedDefaultChar = FALSE;
DWORD convertedChars; DWORD convertedChars;
char *buffer;
if (!unicodePipes) { if (!unicodePipes) {
/*
* Allocate buffer to use when writing to file. (Not freed, as one off) if (!(buffer = get_file_buffer()))
*/ return;
if (!output_bufA) output_bufA = HeapAlloc(GetProcessHeap(), 0,
MAX_WRITECONSOLE_SIZE);
if (!output_bufA) {
WINE_FIXME("Out of memory - could not allocate ansi 64K buffer\n");
return;
}
/* Convert to OEM, then output */ /* Convert to OEM, then output */
convertedChars = WideCharToMultiByte(GetConsoleOutputCP(), 0, message, convertedChars = WideCharToMultiByte(GetConsoleOutputCP(), 0, message,
len, output_bufA, MAX_WRITECONSOLE_SIZE, len, buffer, MAX_WRITECONSOLE_SIZE,
"?", &usedDefaultChar); "?", &usedDefaultChar);
WriteFile(device, output_bufA, convertedChars, WriteFile(device, buffer, convertedChars,
&nOut, FALSE); &nOut, FALSE);
} else { } else {
WriteFile(device, message, len*sizeof(WCHAR), WriteFile(device, message, len*sizeof(WCHAR),
@ -223,21 +231,16 @@ BOOL WCMD_ReadFile(const HANDLE hIn, WCHAR *intoBuf, const DWORD maxChars,
if (!res) { if (!res) {
DWORD numRead; DWORD numRead;
/* char *buffer;
* Allocate buffer to use when reading from file. Not freed
*/ if (!(buffer = get_file_buffer()))
if (!output_bufA) output_bufA = HeapAlloc(GetProcessHeap(), 0, return FALSE;
MAX_WRITECONSOLE_SIZE);
if (!output_bufA) {
WINE_FIXME("Out of memory - could not allocate ansi 64K buffer\n");
return 0;
}
/* Read from file (assume OEM codepage) */ /* Read from file (assume OEM codepage) */
res = ReadFile(hIn, output_bufA, maxChars, &numRead, unused); res = ReadFile(hIn, buffer, maxChars, &numRead, unused);
/* Convert from OEM */ /* Convert from OEM */
*charsRead = MultiByteToWideChar(GetConsoleCP(), 0, output_bufA, numRead, *charsRead = MultiByteToWideChar(GetConsoleCP(), 0, buffer, numRead,
intoBuf, maxChars); intoBuf, maxChars);
} }