static int output_vprintf(const WCHAR* fmt, va_list va_args) { WCHAR str[8192]; int len; len = vsnprintfW(str, sizeof(str)/sizeof(*str), fmt, va_args); if (len < 0) WINE_FIXME("String too long.\n"); else output_write(str, len); return 0; }
static INT vmessagebox(HWND hwnd, INT buttons, INT titleId, INT resId, va_list ap) { static const WCHAR errorW[] = {'E','r','r','o','r',0}; static const WCHAR unknownW[] = {'U','n','k','n','o','w','n',' ','e','r','r','o','r',' ','s','t','r','i','n','g','!',0}; WCHAR title[256]; WCHAR errfmt[1024]; WCHAR errstr[1024]; if (!LoadStringW(hInst, titleId, title, COUNT_OF(title))) lstrcpyW(title, errorW); if (!LoadStringW(hInst, resId, errfmt, COUNT_OF(errfmt))) lstrcpyW(errfmt, unknownW); vsnprintfW(errstr, COUNT_OF(errstr), errfmt, ap); return MessageBoxW(hwnd, errstr, title, buttons); }
static int reg_printfW(const WCHAR *msg, ...) { va_list va_args; int wlen; DWORD count, ret; WCHAR msg_buffer[8192]; va_start(va_args, msg); vsnprintfW(msg_buffer, 8192, msg, va_args); va_end(va_args); wlen = lstrlenW(msg_buffer); ret = WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), msg_buffer, wlen, &count, NULL); if (!ret) { DWORD len; char *msgA; /* On Windows WriteConsoleW() fails if the output is redirected. So fall * back to WriteFile(), assuming the console encoding is still the right * one in that case. */ len = WideCharToMultiByte(GetConsoleOutputCP(), 0, msg_buffer, wlen, NULL, 0, NULL, NULL); msgA = HeapAlloc(GetProcessHeap(), 0, len * sizeof(char)); if (!msgA) return 0; WideCharToMultiByte(GetConsoleOutputCP(), 0, msg_buffer, wlen, msgA, len, NULL, NULL); WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), msgA, len, &count, FALSE); HeapFree(GetProcessHeap(), 0, msgA); } return count; }