Piotr Caban : msvcrt: Use callback based printf in sprintf functions family .
Alexandre Julliard
julliard at winehq.org
Mon Apr 25 12:47:14 CDT 2011
Module: wine
Branch: master
Commit: bfc2f5f2a538f3d6eff7e23c129571392705c560
URL: http://source.winehq.org/git/wine.git/?a=commit;h=bfc2f5f2a538f3d6eff7e23c129571392705c560
Author: Piotr Caban <piotr at codeweavers.com>
Date: Wed Apr 20 14:42:48 2011 +0200
msvcrt: Use callback based printf in sprintf functions family.
---
dlls/msvcrt/printf.h | 24 ++++++++++++
dlls/msvcrt/wcs.c | 98 +++++++++++++++++++++++--------------------------
2 files changed, 70 insertions(+), 52 deletions(-)
diff --git a/dlls/msvcrt/printf.h b/dlls/msvcrt/printf.h
index 90909a1..2db9b6c 100644
--- a/dlls/msvcrt/printf.h
+++ b/dlls/msvcrt/printf.h
@@ -35,6 +35,30 @@ typedef struct FUNC_NAME(pf_flags_t)
APICHAR Format;
} FUNC_NAME(pf_flags);
+struct FUNC_NAME(_str_ctx) {
+ MSVCRT_size_t len;
+ APICHAR *buf;
+};
+
+static int FUNC_NAME(puts_clbk_str)(void *ctx, int len, const APICHAR *str)
+{
+ struct FUNC_NAME(_str_ctx) *out = ctx;
+
+ if(!out->buf)
+ return len;
+
+ if(out->len < len) {
+ memcpy(out->buf, str, out->len);
+ out->buf += out->len;
+ out->len = 0;
+ return -1;
+ }
+
+ memcpy(out->buf, str, len*sizeof(APICHAR));
+ out->buf += len;
+ return len;
+}
+
static inline const APICHAR* FUNC_NAME(pf_parse_int)(const APICHAR *fmt, int *val)
{
*val = 0;
diff --git a/dlls/msvcrt/wcs.c b/dlls/msvcrt/wcs.c
index a7cec7c..b67fba2 100644
--- a/dlls/msvcrt/wcs.c
+++ b/dlls/msvcrt/wcs.c
@@ -1114,40 +1114,19 @@ printf_arg arg_clbk_valist(void *ctx, int arg_pos, int type, __ms_va_list *valis
}
/*********************************************************************
- * vsnprintf_internal (INTERNAL)
- */
-static inline int vsnprintf_internal( char *str, MSVCRT_size_t len, const char *format,
- MSVCRT__locale_t locale, BOOL valid, __ms_va_list valist )
-{
- DWORD sz;
- LPWSTR formatW = NULL;
- pf_output out;
- int r;
-
- out.unicode = FALSE;
- out.buf.A = str;
- out.grow.A = NULL;
- out.used = 0;
- out.len = len;
-
- sz = MultiByteToWideChar( CP_ACP, 0, format, -1, NULL, 0 );
- formatW = HeapAlloc( GetProcessHeap(), 0, sz*sizeof(WCHAR) );
- MultiByteToWideChar( CP_ACP, 0, format, -1, formatW, sz );
-
- r = pf_vsnprintf( &out, formatW, locale, valid, valist );
-
- HeapFree( GetProcessHeap(), 0, formatW );
-
- return r;
-}
-
-/*********************************************************************
* _vsnprintf (MSVCRT.@)
*/
int CDECL MSVCRT_vsnprintf( char *str, MSVCRT_size_t len,
const char *format, __ms_va_list valist )
{
- return vsnprintf_internal(str, len, format, NULL, FALSE, valist);
+ static const char nullbyte = '\0';
+ struct _str_ctx_a ctx = {len, str};
+ int ret;
+
+ ret = pf_printf_a(puts_clbk_str_a, &ctx, format, NULL, FALSE, FALSE,
+ arg_clbk_valist, NULL, valist);
+ puts_clbk_str_a(&ctx, 1, &nullbyte);
+ return ret;
}
/*********************************************************************
@@ -1156,7 +1135,14 @@ int CDECL MSVCRT_vsnprintf( char *str, MSVCRT_size_t len,
int CDECL MSVCRT_vsnprintf_l( char *str, MSVCRT_size_t len, const char *format,
MSVCRT__locale_t locale, __ms_va_list valist )
{
- return vsnprintf_internal(str, len, format, locale, FALSE, valist);
+ static const char nullbyte = '\0';
+ struct _str_ctx_a ctx = {len, str};
+ int ret;
+
+ ret = pf_printf_a(puts_clbk_str_a, &ctx, format, locale, FALSE, FALSE,
+ arg_clbk_valist, NULL, valist);
+ puts_clbk_str_a(&ctx, 1, &nullbyte);
+ return ret;
}
/*********************************************************************
@@ -1166,6 +1152,8 @@ int CDECL MSVCRT_vsnprintf_s_l( char *str, MSVCRT_size_t sizeOfBuffer,
MSVCRT_size_t count, const char *format,
MSVCRT__locale_t locale, __ms_va_list valist )
{
+ static const char nullbyte = '\0';
+ struct _str_ctx_a ctx;
int len, ret;
if(sizeOfBuffer<count+1 || count==-1)
@@ -1173,7 +1161,11 @@ int CDECL MSVCRT_vsnprintf_s_l( char *str, MSVCRT_size_t sizeOfBuffer,
else
len = count+1;
- ret = vsnprintf_internal(str, len, format, locale, TRUE, valist);
+ ctx.len = len;
+ ctx.buf = str;
+ ret = pf_printf_a(puts_clbk_str_a, &ctx, format, locale, FALSE, TRUE,
+ arg_clbk_valist, NULL, valist);
+ puts_clbk_str_a(&ctx, 1, &nullbyte);
if(ret<0 || ret==len) {
if(count!=MSVCRT__TRUNCATE && count>sizeOfBuffer) {
@@ -1263,30 +1255,19 @@ int CDECL MSVCRT__scprintf(const char *format, ...)
}
/*********************************************************************
- * vsnwprintf_internal (INTERNAL)
- */
-static inline int vsnwprintf_internal(MSVCRT_wchar_t *str, MSVCRT_size_t len,
- const MSVCRT_wchar_t *format, MSVCRT__locale_t locale, BOOL valid,
- __ms_va_list valist)
-{
- pf_output out;
-
- out.unicode = TRUE;
- out.buf.W = str;
- out.grow.W = NULL;
- out.used = 0;
- out.len = len;
-
- return pf_vsnprintf( &out, format, locale, valid, valist );
-}
-
-/*********************************************************************
* _vsnwprintf (MSVCRT.@)
*/
int CDECL MSVCRT_vsnwprintf(MSVCRT_wchar_t *str, MSVCRT_size_t len,
const MSVCRT_wchar_t *format, __ms_va_list valist)
{
- return vsnwprintf_internal(str, len, format, NULL, FALSE, valist);
+ static const MSVCRT_wchar_t nullbyte = '\0';
+ struct _str_ctx_w ctx = {len, str};
+ int ret;
+
+ ret = pf_printf_w(puts_clbk_str_w, &ctx, format, NULL, FALSE, FALSE,
+ arg_clbk_valist, NULL, valist);
+ puts_clbk_str_w(&ctx, 1, &nullbyte);
+ return ret;
}
/*********************************************************************
@@ -1296,7 +1277,14 @@ int CDECL MSVCRT_vsnwprintf_l(MSVCRT_wchar_t *str, MSVCRT_size_t len,
const MSVCRT_wchar_t *format, MSVCRT__locale_t locale,
__ms_va_list valist)
{
- return vsnwprintf_internal(str, len, format, locale, FALSE, valist);
+ static const MSVCRT_wchar_t nullbyte = '\0';
+ struct _str_ctx_w ctx = {len, str};
+ int ret;
+
+ ret = pf_printf_w(puts_clbk_str_w, &ctx, format, locale, FALSE, FALSE,
+ arg_clbk_valist, NULL, valist);
+ puts_clbk_str_w(&ctx, 1, &nullbyte);
+ return ret;
}
/*********************************************************************
@@ -1306,13 +1294,19 @@ int CDECL MSVCRT_vsnwprintf_s_l( MSVCRT_wchar_t *str, MSVCRT_size_t sizeOfBuffer
MSVCRT_size_t count, const MSVCRT_wchar_t *format,
MSVCRT__locale_t locale, __ms_va_list valist)
{
+ static const MSVCRT_wchar_t nullbyte = '\0';
+ struct _str_ctx_w ctx;
int len, ret;
len = sizeOfBuffer;
if(count!=-1 && len>count+1)
len = count+1;
- ret = vsnwprintf_internal(str, len, format, locale, TRUE, valist);
+ ctx.len = len;
+ ctx.buf = str;
+ ret = pf_printf_w(puts_clbk_str_w, &ctx, format, locale, FALSE, TRUE,
+ arg_clbk_valist, NULL, valist);
+ puts_clbk_str_w(&ctx, 1, &nullbyte);
if(ret<0 || ret==len) {
if(count!=MSVCRT__TRUNCATE && count>sizeOfBuffer) {
More information about the wine-cvs
mailing list