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