Andrew Nguyen : kernel32: Unify the format_insert ANSI and Unicode helpers.

Alexandre Julliard julliard at winehq.org
Mon Apr 19 11:51:20 CDT 2010


Module: wine
Branch: master
Commit: 4c657b870f053c042d30be3f93c7c2fc510a3e55
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4c657b870f053c042d30be3f93c7c2fc510a3e55

Author: Andrew Nguyen <anguyen at codeweavers.com>
Date:   Sun Apr 18 09:09:59 2010 -0500

kernel32: Unify the format_insert ANSI and Unicode helpers.

---

 dlls/kernel32/format_msg.c |  159 +++++++-------------------------------------
 1 files changed, 24 insertions(+), 135 deletions(-)

diff --git a/dlls/kernel32/format_msg.c b/dlls/kernel32/format_msg.c
index 72cc55e..adb24f2 100644
--- a/dlls/kernel32/format_msg.c
+++ b/dlls/kernel32/format_msg.c
@@ -121,12 +121,12 @@ static ULONG_PTR get_arg( int nr, DWORD flags, struct format_args *args )
     return args->args[nr - 1];
 }
 
-
 /**********************************************************************
- *	format_insertA    (internal)
+ *	format_insert    (internal)
  */
-static LPCWSTR format_insertA( int insert, LPCWSTR format, DWORD flags,
-                               struct format_args *args, LPWSTR *result )
+static LPCWSTR format_insert( BOOL unicode_caller, int insert, LPCWSTR format,
+                              DWORD flags, struct format_args *args,
+                              LPWSTR *result )
 {
     static const WCHAR fmt_lu[] = {'%','l','u',0};
     WCHAR *wstring = NULL, *p, fmt[256];
@@ -135,135 +135,20 @@ static LPCWSTR format_insertA( int insert, LPCWSTR format, DWORD flags,
 
     if (*format != '!')  /* simple string */
     {
-        char *str = (char *)get_arg( insert, flags, args );
-        DWORD length = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
-        *result = HeapAlloc( GetProcessHeap(), 0, length * sizeof(WCHAR) );
-        MultiByteToWideChar(CP_ACP, 0, str, -1, *result, length);
-        return format;
-    }
-
-    format++;
-    p = fmt;
-    *p++ = '%';
-
-    while (*format == '0' ||
-           *format == '+' ||
-           *format == '-' ||
-           *format == ' ' ||
-           *format == '*' ||
-           *format == '#')
-    {
-        if (*format == '*')
+        arg = get_arg( insert, flags, args );
+        if (unicode_caller)
         {
-            p += sprintfW( p, fmt_lu, get_arg( insert, flags, args ));
-            insert = -1;
-            format++;
-        }
-        else *p++ = *format++;
-    }
-    while (isdigit(*format)) *p++ = *format++;
-
-    if (*format == '.')
-    {
-        *p++ = *format++;
-        if (*format == '*')
-        {
-            p += sprintfW( p, fmt_lu, get_arg( insert, flags, args ));
-            insert = -1;
-            format++;
-        }
-        else
-            while (isdigit(*format)) *p++ = *format++;
-    }
-
-    /* replicate MS bug: drop an argument when using va_list with width/precision */
-    if (insert == -1 && args->list) args->last--;
-    arg = get_arg( insert, flags, args );
-
-    /* check for wide string format */
-    if ((format[0] == 'l' && format[1] == 's') ||
-        (format[0] == 'l' && format[1] == 'S') ||
-        (format[0] == 'w' && format[1] == 's') ||
-        (format[0] == 'S'))
-    {
-        *p++ = 's';
-    }
-    /* check for wide character format */
-    else if ((format[0] == 'l' && format[1] == 'c') ||
-             (format[0] == 'l' && format[1] == 'C') ||
-             (format[0] == 'w' && format[1] == 'c') ||
-             (format[0] == 'C'))
-    {
-        *p++ = 'c';
-    }
-    /* check for ascii string format */
-    else if ((format[0] == 'h' && format[1] == 's') ||
-             (format[0] == 'h' && format[1] == 'S') ||
-             (format[0] == 's'))
-    {
-        DWORD len = MultiByteToWideChar( CP_ACP, 0, (char *)arg, -1, NULL, 0 );
-        wstring = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
-        MultiByteToWideChar( CP_ACP, 0, (char *)arg, -1, wstring, len );
-        arg = (ULONG_PTR)wstring;
-        *p++ = 's';
-    }
-    /* check for ascii character format */
-    else if ((format[0] == 'h' && format[1] == 'c') ||
-             (format[0] == 'h' && format[1] == 'C') ||
-             (format[0] == 'c'))
-    {
-        char ch = arg;
-        wstring = HeapAlloc( GetProcessHeap(), 0, 2 * sizeof(WCHAR) );
-        MultiByteToWideChar( CP_ACP, 0, &ch, 1, wstring, 1 );
-        wstring[1] = 0;
-        arg = (ULONG_PTR)wstring;
-        *p++ = 's';
-    }
-    /* FIXME: handle I64 etc. */
-    else while (*format && *format != '!') *p++ = *format++;
-
-    *p = 0;
-    size = 256;
-    for (;;)
-    {
-        WCHAR *ret = HeapAlloc( GetProcessHeap(), 0, size * sizeof(WCHAR));
-        int needed = snprintfW( ret, size, fmt, arg );
-        if (needed == -1 || needed >= size)
-        {
-            HeapFree( GetProcessHeap(), 0, ret );
-            size = max( needed + 1, size * 2 );
+            WCHAR *str = (WCHAR *)arg;
+            *result = HeapAlloc( GetProcessHeap(), 0, (strlenW(str) + 1) * sizeof(WCHAR) );
+            strcpyW( *result, str );
         }
         else
         {
-            *result = ret;
-            break;
+            char *str = (char *)get_arg( insert, flags, args );
+            DWORD length = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 );
+            *result = HeapAlloc( GetProcessHeap(), 0, length * sizeof(WCHAR) );
+            MultiByteToWideChar( CP_ACP, 0, str, -1, *result, length );
         }
-    }
-
-    while (*format && *format != '!') format++;
-    if (*format == '!') format++;
-
-    HeapFree( GetProcessHeap(), 0, wstring );
-    return format;
-}
-
-
-/**********************************************************************
- *	format_insertW    (internal)
- */
-static LPCWSTR format_insertW( int insert, LPCWSTR format, DWORD flags,
-                               struct format_args *args, LPWSTR *result )
-{
-    static const WCHAR fmt_lu[] = {'%','l','u',0};
-    WCHAR *wstring = NULL, *p, fmt[256];
-    ULONG_PTR arg;
-    int size;
-
-    if (*format != '!')  /* simple string */
-    {
-        WCHAR *str = (WCHAR *)get_arg( insert, flags, args );
-        *result = HeapAlloc( GetProcessHeap(), 0, (strlenW(str) + 1) * sizeof(WCHAR) );
-        strcpyW( *result, str );
         return format;
     }
 
@@ -308,9 +193,10 @@ static LPCWSTR format_insertW( int insert, LPCWSTR format, DWORD flags,
     /* check for ascii string format */
     if ((format[0] == 'h' && format[1] == 's') ||
         (format[0] == 'h' && format[1] == 'S') ||
-        (format[0] == 'S'))
+        (unicode_caller && format[0] == 'S') ||
+        (!unicode_caller && format[0] == 's'))
     {
-        DWORD len = MultiByteToWideChar( CP_ACP, 0, (char *)arg, -1, /*FIXME*/ NULL, 0 );
+        DWORD len = MultiByteToWideChar( CP_ACP, 0, (char *)arg, -1, NULL, 0 );
         wstring = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) );
         MultiByteToWideChar( CP_ACP, 0, (char *)arg, -1, wstring, len );
         arg = (ULONG_PTR)wstring;
@@ -319,7 +205,8 @@ static LPCWSTR format_insertW( int insert, LPCWSTR format, DWORD flags,
     /* check for ascii character format */
     else if ((format[0] == 'h' && format[1] == 'c') ||
              (format[0] == 'h' && format[1] == 'C') ||
-             (format[0] == 'C'))
+             (unicode_caller && format[0] == 'C') ||
+             (!unicode_caller && format[0] == 'c'))
     {
         char ch = arg;
         wstring = HeapAlloc( GetProcessHeap(), 0, 2 * sizeof(WCHAR) );
@@ -331,14 +218,16 @@ static LPCWSTR format_insertW( int insert, LPCWSTR format, DWORD flags,
     /* check for wide string format */
     else if ((format[0] == 'l' && format[1] == 's') ||
              (format[0] == 'l' && format[1] == 'S') ||
-             (format[0] == 'w' && format[1] == 's'))
+             (format[0] == 'w' && format[1] == 's') ||
+             (!unicode_caller && format[0] == 'S'))
     {
         *p++ = 's';
     }
     /* check for wide character format */
     else if ((format[0] == 'l' && format[1] == 'c') ||
              (format[0] == 'l' && format[1] == 'C') ||
-             (format[0] == 'w' && format[1] == 'c'))
+             (format[0] == 'w' && format[1] == 'c') ||
+             (!unicode_caller && format[0] == 'C'))
     {
         *p++ = 'c';
     }
@@ -426,7 +315,7 @@ static LPWSTR format_messageA( DWORD dwFlags, LPCWSTR fmtstr, struct format_args
                         f++;
                         break;
                     }
-                    f = format_insertA( insertnr, f, dwFlags, format_args, &str );
+                    f = format_insert( FALSE, insertnr, f, dwFlags, format_args, &str );
                     for (x = str; *x; x++) ADD_TO_T(*x);
                     HeapFree( GetProcessHeap(), 0, str );
                     break;
@@ -536,7 +425,7 @@ static LPWSTR format_messageW( DWORD dwFlags, LPCWSTR fmtstr, struct format_args
                         f++;
                         break;
                     }
-                    f = format_insertW( insertnr, f, dwFlags, format_args, &str );
+                    f = format_insert( TRUE, insertnr, f, dwFlags, format_args, &str );
                     for (x = str; *x; x++) ADD_TO_T(*x);
                     HeapFree( GetProcessHeap(), 0, str );
                     break;




More information about the wine-cvs mailing list