From 25d7e0b968172a58a9db09ad82d2f26d62a1b632 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 17 Dec 2009 18:02:00 +0100 Subject: [PATCH] user32: Move wsprintf16 to user16.c. --- dlls/user32/user16.c | 208 +++++++++++++++++++++++++++++++++++++++++ dlls/user32/wsprintf.c | 129 ------------------------- 2 files changed, 208 insertions(+), 129 deletions(-) diff --git a/dlls/user32/user16.c b/dlls/user32/user16.c index 1c5adb420f..6206ec2963 100644 --- a/dlls/user32/user16.c +++ b/dlls/user32/user16.c @@ -132,6 +132,98 @@ static void logfont_32_to_16( const LOGFONTA* font32, LPLOGFONT16 font16 ) lstrcpynA( font16->lfFaceName, font32->lfFaceName, LF_FACESIZE ); } + +/*********************************************************************** + * Helper for wsprintf16 + */ + +#define WPRINTF_LEFTALIGN 0x0001 /* Align output on the left ('-' prefix) */ +#define WPRINTF_PREFIX_HEX 0x0002 /* Prefix hex with 0x ('#' prefix) */ +#define WPRINTF_ZEROPAD 0x0004 /* Pad with zeros ('0' prefix) */ +#define WPRINTF_LONG 0x0008 /* Long arg ('l' prefix) */ +#define WPRINTF_SHORT 0x0010 /* Short arg ('h' prefix) */ +#define WPRINTF_UPPER_HEX 0x0020 /* Upper-case hex ('X' specifier) */ + +typedef enum +{ + WPR_UNKNOWN, + WPR_CHAR, + WPR_STRING, + WPR_SIGNED, + WPR_UNSIGNED, + WPR_HEXA +} WPRINTF_TYPE; + +typedef struct +{ + UINT flags; + UINT width; + UINT precision; + WPRINTF_TYPE type; +} WPRINTF_FORMAT; + +static INT parse_format( LPCSTR format, WPRINTF_FORMAT *res ) +{ + LPCSTR p = format; + + res->flags = 0; + res->width = 0; + res->precision = 0; + if (*p == '-') { res->flags |= WPRINTF_LEFTALIGN; p++; } + if (*p == '#') { res->flags |= WPRINTF_PREFIX_HEX; p++; } + if (*p == '0') { res->flags |= WPRINTF_ZEROPAD; p++; } + while ((*p >= '0') && (*p <= '9')) /* width field */ + { + res->width = res->width * 10 + *p - '0'; + p++; + } + if (*p == '.') /* precision field */ + { + p++; + while ((*p >= '0') && (*p <= '9')) + { + res->precision = res->precision * 10 + *p - '0'; + p++; + } + } + if (*p == 'l') { res->flags |= WPRINTF_LONG; p++; } + else if (*p == 'h') { res->flags |= WPRINTF_SHORT; p++; } + switch(*p) + { + case 'c': + case 'C': /* no Unicode in Win16 */ + res->type = WPR_CHAR; + break; + case 's': + case 'S': + res->type = WPR_STRING; + break; + case 'd': + case 'i': + res->type = WPR_SIGNED; + break; + case 'u': + res->type = WPR_UNSIGNED; + break; + case 'p': + res->width = 8; + res->flags |= WPRINTF_ZEROPAD; + /* fall through */ + case 'X': + res->flags |= WPRINTF_UPPER_HEX; + /* fall through */ + case 'x': + res->type = WPR_HEXA; + break; + default: /* unknown format char */ + res->type = WPR_UNKNOWN; + p--; /* print format as normal char */ + break; + } + return (INT)(p - format) + 1; +} + + /********************************************************************** * InitApp (USER.5) */ @@ -1678,6 +1770,122 @@ BOOL16 WINAPI SetMenuItemBitmaps16( HMENU16 hMenu, UINT16 nPos, UINT16 wFlags, } +/*********************************************************************** + * wvsprintf (USER.421) + */ +INT16 WINAPI wvsprintf16( LPSTR buffer, LPCSTR spec, VA_LIST16 args ) +{ + WPRINTF_FORMAT format; + LPSTR p = buffer; + UINT i, len, sign; + CHAR number[20]; + CHAR char_view = 0; + LPCSTR lpcstr_view = NULL; + INT int_view; + SEGPTR seg_str; + + while (*spec) + { + if (*spec != '%') { *p++ = *spec++; continue; } + spec++; + if (*spec == '%') { *p++ = *spec++; continue; } + spec += parse_format( spec, &format ); + switch(format.type) + { + case WPR_CHAR: + char_view = VA_ARG16( args, CHAR ); + len = format.precision = 1; + break; + case WPR_STRING: + seg_str = VA_ARG16( args, SEGPTR ); + if (IsBadReadPtr16( seg_str, 1 )) lpcstr_view = ""; + else lpcstr_view = MapSL( seg_str ); + if (!lpcstr_view) lpcstr_view = "(null)"; + for (len = 0; !format.precision || (len < format.precision); len++) + if (!lpcstr_view[len]) break; + format.precision = len; + break; + case WPR_SIGNED: + if (format.flags & WPRINTF_LONG) int_view = VA_ARG16( args, INT ); + else int_view = VA_ARG16( args, INT16 ); + len = sprintf( number, "%d", int_view ); + break; + case WPR_UNSIGNED: + if (format.flags & WPRINTF_LONG) int_view = VA_ARG16( args, UINT ); + else int_view = VA_ARG16( args, UINT16 ); + len = sprintf( number, "%u", int_view ); + break; + case WPR_HEXA: + if (format.flags & WPRINTF_LONG) int_view = VA_ARG16( args, UINT ); + else int_view = VA_ARG16( args, UINT16 ); + len = sprintf( number, (format.flags & WPRINTF_UPPER_HEX) ? "%X" : "%x", int_view); + break; + case WPR_UNKNOWN: + continue; + } + if (format.precision < len) format.precision = len; + if (format.flags & WPRINTF_LEFTALIGN) format.flags &= ~WPRINTF_ZEROPAD; + if ((format.flags & WPRINTF_ZEROPAD) && (format.width > format.precision)) + format.precision = format.width; + if (format.flags & WPRINTF_PREFIX_HEX) len += 2; + + sign = 0; + if (!(format.flags & WPRINTF_LEFTALIGN)) + for (i = format.precision; i < format.width; i++) *p++ = ' '; + switch(format.type) + { + case WPR_CHAR: + *p = char_view; + /* wsprintf16 ignores null characters */ + if (*p != '\0') p++; + else if (format.width > 1) *p++ = ' '; + else len = 0; + break; + case WPR_STRING: + if (len) memcpy( p, lpcstr_view, len ); + p += len; + break; + case WPR_HEXA: + if (format.flags & WPRINTF_PREFIX_HEX) + { + *p++ = '0'; + *p++ = (format.flags & WPRINTF_UPPER_HEX) ? 'X' : 'x'; + len -= 2; + } + /* fall through */ + case WPR_SIGNED: + /* Transfer the sign now, just in case it will be zero-padded*/ + if (number[0] == '-') + { + *p++ = '-'; + sign = 1; + } + /* fall through */ + case WPR_UNSIGNED: + for (i = len; i < format.precision; i++) *p++ = '0'; + if (len > sign) memcpy( p, number + sign, len - sign ); + p += len-sign; + break; + case WPR_UNKNOWN: + continue; + } + if (format.flags & WPRINTF_LEFTALIGN) + for (i = format.precision; i < format.width; i++) *p++ = ' '; + } + *p = 0; + return p - buffer; +} + + +/*********************************************************************** + * _wsprintf (USER.420) + */ +INT16 WINAPIV wsprintf16( LPSTR buffer, LPCSTR spec, VA_LIST16 valist ) +{ + return wvsprintf16( buffer, spec, valist ); +} + + /*********************************************************************** * lstrcmp (USER.430) */ diff --git a/dlls/user32/wsprintf.c b/dlls/user32/wsprintf.c index 6cb4912f90..533c48a2ac 100644 --- a/dlls/user32/wsprintf.c +++ b/dlls/user32/wsprintf.c @@ -31,8 +31,6 @@ #include "wingdi.h" #include "winuser.h" -#include "wine/winbase16.h" - #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(string); @@ -280,108 +278,6 @@ static UINT WPRINTF_GetLen( WPRINTF_FORMAT *format, WPRINTF_DATA *arg, } -/*********************************************************************** - * wvsnprintf16 (Not a Windows API) - */ -static INT16 wvsnprintf16( LPSTR buffer, UINT16 maxlen, LPCSTR spec, VA_LIST16 args ) -{ - WPRINTF_FORMAT format; - LPSTR p = buffer; - UINT i, len, sign; - CHAR number[20]; - WPRINTF_DATA cur_arg; - SEGPTR seg_str; - - while (*spec && (maxlen > 1)) - { - if (*spec != '%') { *p++ = *spec++; maxlen--; continue; } - spec++; - if (*spec == '%') { *p++ = *spec++; maxlen--; continue; } - spec += WPRINTF_ParseFormatA( spec, &format ); - switch(format.type) - { - case WPR_WCHAR: /* No Unicode in Win16 */ - case WPR_CHAR: - cur_arg.char_view = VA_ARG16( args, CHAR ); - break; - case WPR_WSTRING: /* No Unicode in Win16 */ - case WPR_STRING: - seg_str = VA_ARG16( args, SEGPTR ); - if (IsBadReadPtr16(seg_str, 1 )) cur_arg.lpcstr_view = ""; - else cur_arg.lpcstr_view = MapSL( seg_str ); - break; - case WPR_SIGNED: - if (!(format.flags & WPRINTF_LONG)) - { - cur_arg.int_view = VA_ARG16( args, INT16 ); - break; - } - /* fall through */ - case WPR_HEXA: - case WPR_UNSIGNED: - if (format.flags & WPRINTF_LONG) - cur_arg.int_view = VA_ARG16( args, UINT ); - else - cur_arg.int_view = VA_ARG16( args, UINT16 ); - break; - case WPR_UNKNOWN: - continue; - } - len = WPRINTF_GetLen( &format, &cur_arg, number, maxlen - 1 ); - sign = 0; - if (!(format.flags & WPRINTF_LEFTALIGN)) - for (i = format.precision; i < format.width; i++, maxlen--) - *p++ = ' '; - switch(format.type) - { - case WPR_WCHAR: /* No Unicode in Win16 */ - case WPR_CHAR: - *p= cur_arg.char_view; - /* wsprintf16 (unlike wsprintf) ignores null characters */ - if (*p != '\0') p++; - else if (format.width > 1) *p++ = ' '; - else len = 0; - break; - case WPR_WSTRING: /* No Unicode in Win16 */ - case WPR_STRING: - if (len) memcpy( p, cur_arg.lpcstr_view, len ); - p += len; - break; - case WPR_HEXA: - if ((format.flags & WPRINTF_PREFIX_HEX) && (maxlen > 3)) - { - *p++ = '0'; - *p++ = (format.flags & WPRINTF_UPPER_HEX) ? 'X' : 'x'; - maxlen -= 2; - len -= 2; - } - /* fall through */ - case WPR_SIGNED: - /* Transfer the sign now, just in case it will be zero-padded*/ - if (number[0] == '-') - { - *p++ = '-'; - sign = 1; - } - /* fall through */ - case WPR_UNSIGNED: - for (i = len; i < format.precision; i++, maxlen--) *p++ = '0'; - if (len > sign) memcpy( p, number + sign, len - sign ); - p += len-sign; - break; - case WPR_UNKNOWN: - continue; - } - if (format.flags & WPRINTF_LEFTALIGN) - for (i = format.precision; i < format.width; i++, maxlen--) - *p++ = ' '; - maxlen -= len; - } - *p = 0; - return (maxlen > 1) ? (INT)(p - buffer) : -1; -} - - /*********************************************************************** * wvsnprintfA (internal) */ @@ -587,19 +483,6 @@ static INT wvsnprintfW( LPWSTR buffer, UINT maxlen, LPCWSTR spec, __ms_va_list a } -/*********************************************************************** - * wvsprintf (USER.421) - */ -INT16 WINAPI wvsprintf16( LPSTR buffer, LPCSTR spec, VA_LIST16 args ) -{ - INT16 res; - - TRACE("for %p got:\n",buffer); - res = wvsnprintf16( buffer, 1024, spec, args ); - return ( res == -1 ) ? 1024 : res; -} - - /*********************************************************************** * wvsprintfA (USER32.@) */ @@ -620,18 +503,6 @@ INT WINAPI wvsprintfW( LPWSTR buffer, LPCWSTR spec, __ms_va_list args ) } -/*********************************************************************** - * _wsprintf (USER.420) - */ -INT16 WINAPIV wsprintf16( LPSTR buffer, LPCSTR spec, VA_LIST16 valist ) -{ - INT16 res; - - res = wvsnprintf16( buffer, 1024, spec, valist ); - return ( res == -1 ) ? 1024 : res; -} - - /*********************************************************************** * wsprintfA (USER32.@) */ -- 2.32.0.93.g670b81a890