Module: wine Branch: master Commit: 7303b8c4dbae5dc8d0904aefc7c4ef4bd524225b URL: http://source.winehq.org/git/wine.git/?a=commit;h=7303b8c4dbae5dc8d0904aefc7...
Author: Piotr Caban piotr@codeweavers.com Date: Wed Apr 20 14:42:26 2011 +0200
msvcrt: Use callback based printf in cprintf functions family.
---
dlls/msvcrt/console.c | 62 +++++++++++++++---------------------------------- dlls/msvcrt/msvcrt.h | 3 +- dlls/msvcrt/wcs.c | 23 ++++++++++++++++++ 3 files changed, 44 insertions(+), 44 deletions(-)
diff --git a/dlls/msvcrt/console.c b/dlls/msvcrt/console.c index e23ff3e..41e5e0d 100644 --- a/dlls/msvcrt/console.c +++ b/dlls/msvcrt/console.c @@ -298,37 +298,30 @@ int CDECL _kbhit(void) return retval; }
+static int puts_clbk_console_a(void *ctx, int len, const char *str) +{ + LOCK_CONSOLE; + if(!WriteConsoleA(MSVCRT_console_out, str, len, NULL, NULL)) + len = -1; + UNLOCK_CONSOLE; + return len; +} + +static int puts_clbk_console_w(void *ctx, int len, const MSVCRT_wchar_t *str) +{ + LOCK_CONSOLE; + if(!WriteConsoleW(MSVCRT_console_out, str, len, NULL, NULL)) + len = -1; + UNLOCK_CONSOLE; + return len; +}
/********************************************************************* * _vcprintf (MSVCRT.@) */ int CDECL _vcprintf(const char* format, __ms_va_list valist) { - char buf[2048]; - LPWSTR formatW = NULL; - DWORD sz; - pf_output out; - int retval; - - out.unicode = FALSE; - out.buf.A = out.grow.A = buf; - out.used = 0; - out.len = sizeof(buf); - - sz = MultiByteToWideChar( CP_ACP, 0, format, -1, NULL, 0 ); - formatW = HeapAlloc( GetProcessHeap(), 0, sz*sizeof(WCHAR) ); - MultiByteToWideChar( CP_ACP, 0, format, -1, formatW, sz ); - - if ((retval = pf_vsnprintf( &out, formatW, NULL, FALSE, valist )) > 0) - { - LOCK_CONSOLE; - retval = _cputs( out.buf.A ); - UNLOCK_CONSOLE; - } - HeapFree( GetProcessHeap(), 0, formatW ); - if (out.buf.A != buf) - MSVCRT_free (out.buf.A); - return retval; + return pf_printf_a(puts_clbk_console_a, NULL, format, NULL, FALSE, FALSE, arg_clbk_valist, NULL, valist); }
/********************************************************************* @@ -352,24 +345,7 @@ int CDECL _cprintf(const char* format, ...) */ int CDECL _vcwprintf(const MSVCRT_wchar_t* format, __ms_va_list valist) { - MSVCRT_wchar_t buf[2048]; - pf_output out; - int retval; - - out.unicode = TRUE; - out.buf.W = out.grow.W = buf; - out.used = 0; - out.len = sizeof(buf) / sizeof(buf[0]); - - if ((retval = pf_vsnprintf( &out, format, NULL, FALSE, valist )) >= 0) - { - LOCK_CONSOLE; - retval = _cputws( out.buf.W ); - UNLOCK_CONSOLE; - } - if (out.buf.W != buf) - MSVCRT_free (out.buf.W); - return retval; + return pf_printf_w(puts_clbk_console_w, NULL, format, NULL, FALSE, FALSE, arg_clbk_valist, NULL, valist); }
/********************************************************************* diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h index 677bb57..979a05b 100644 --- a/dlls/msvcrt/msvcrt.h +++ b/dlls/msvcrt/msvcrt.h @@ -943,11 +943,12 @@ typedef union _printf_arg LONGLONG get_longlong; double get_double; } printf_arg; -typedef printf_arg (*args_clbk)(void*, int, size_t, __ms_va_list*); +typedef printf_arg (*args_clbk)(void*, int, int, __ms_va_list*); int pf_printf_a(puts_clbk_a, void*, const char*, MSVCRT__locale_t, BOOL, BOOL, args_clbk, void*, __ms_va_list); int pf_printf_w(puts_clbk_w, void*, const MSVCRT_wchar_t*, MSVCRT__locale_t, BOOL, BOOL, args_clbk, void*, __ms_va_list); +printf_arg arg_clbk_valist(void*, int, int, __ms_va_list*);
#define MSVCRT__OVERFLOW 3 #define MSVCRT__UNDERFLOW 4 diff --git a/dlls/msvcrt/wcs.c b/dlls/msvcrt/wcs.c index a4c817b..a7cec7c 100644 --- a/dlls/msvcrt/wcs.c +++ b/dlls/msvcrt/wcs.c @@ -1091,6 +1091,29 @@ int pf_vsnprintf( pf_output *out, const WCHAR *format, }
/********************************************************************* + * arg_clbk_valist (INTERNAL) + */ +printf_arg arg_clbk_valist(void *ctx, int arg_pos, int type, __ms_va_list *valist) +{ + printf_arg ret; + + if(type == VT_I8) + ret.get_longlong = va_arg(*valist, LONGLONG); + else if(type == VT_INT) + ret.get_int = va_arg(*valist, int); + else if(type == VT_R8) + ret.get_double = va_arg(*valist, double); + else if(type == VT_PTR) + ret.get_ptr = va_arg(*valist, void*); + else { + ERR("Incorrect type\n"); + ret.get_int = 0; + } + + return ret; +} + +/********************************************************************* * vsnprintf_internal (INTERNAL) */ static inline int vsnprintf_internal( char *str, MSVCRT_size_t len, const char *format,