Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
2bf9c26d
Commit
2bf9c26d
authored
Jul 25, 2011
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
shlwapi: Add support for 64-bit formats in wsprintf.
parent
4ec27a63
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
57 additions
and
15 deletions
+57
-15
wsprintf.c
dlls/shlwapi/wsprintf.c
+57
-15
No files found.
dlls/shlwapi/wsprintf.c
View file @
2bf9c26d
...
...
@@ -43,6 +43,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(string);
#define WPRINTF_SHORT 0x0010
/* Short arg ('h' prefix) */
#define WPRINTF_UPPER_HEX 0x0020
/* Upper-case hex ('X' specifier) */
#define WPRINTF_WIDE 0x0040
/* Wide arg ('w' prefix) */
#define WPRINTF_INTPTR 0x0080
/* Pointer-size arg ('I' prefix) */
#define WPRINTF_I64 0x0100
/* 64-bit arg ('I64' prefix) */
typedef
enum
{
...
...
@@ -65,11 +67,11 @@ typedef struct
}
WPRINTF_FORMAT
;
typedef
union
{
WCHAR
wchar_view
;
CHAR
char_view
;
LPCSTR
lpcstr_view
;
LPCWSTR
lpcwstr_view
;
INT
int_view
;
WCHAR
wchar_view
;
CHAR
char_view
;
LPCSTR
lpcstr_view
;
LPCWSTR
lpcwstr_view
;
LONGLONG
int_view
;
}
WPRINTF_DATA
;
static
const
CHAR
null_stringA
[]
=
"(null)"
;
...
...
@@ -111,6 +113,12 @@ static INT WPRINTF_ParseFormatA( LPCSTR format, WPRINTF_FORMAT *res )
if
(
*
p
==
'l'
)
{
res
->
flags
|=
WPRINTF_LONG
;
p
++
;
}
else
if
(
*
p
==
'h'
)
{
res
->
flags
|=
WPRINTF_SHORT
;
p
++
;
}
else
if
(
*
p
==
'w'
)
{
res
->
flags
|=
WPRINTF_WIDE
;
p
++
;
}
else
if
(
*
p
==
'I'
)
{
if
(
p
[
1
]
==
'6'
&&
p
[
2
]
==
'4'
)
{
res
->
flags
|=
WPRINTF_I64
;
p
+=
3
;
}
else
if
(
p
[
1
]
==
'3'
&&
p
[
2
]
==
'2'
)
p
+=
3
;
else
{
res
->
flags
|=
WPRINTF_INTPTR
;
p
++
;
}
}
switch
(
*
p
)
{
case
'c'
:
...
...
@@ -132,6 +140,10 @@ static INT WPRINTF_ParseFormatA( LPCSTR format, WPRINTF_FORMAT *res )
case
'u'
:
res
->
type
=
WPR_UNSIGNED
;
break
;
case
'p'
:
res
->
width
=
2
*
sizeof
(
void
*
);
res
->
flags
|=
WPRINTF_ZEROPAD
|
WPRINTF_INTPTR
;
/* fall through */
case
'X'
:
res
->
flags
|=
WPRINTF_UPPER_HEX
;
/* fall through */
...
...
@@ -183,7 +195,13 @@ static INT WPRINTF_ParseFormatW( LPCWSTR format, WPRINTF_FORMAT *res )
if
(
*
p
==
'l'
)
{
res
->
flags
|=
WPRINTF_LONG
;
p
++
;
}
else
if
(
*
p
==
'h'
)
{
res
->
flags
|=
WPRINTF_SHORT
;
p
++
;
}
else
if
(
*
p
==
'w'
)
{
res
->
flags
|=
WPRINTF_WIDE
;
p
++
;
}
switch
((
CHAR
)
*
p
)
else
if
(
*
p
==
'I'
)
{
if
(
p
[
1
]
==
'6'
&&
p
[
2
]
==
'4'
)
{
res
->
flags
|=
WPRINTF_I64
;
p
+=
3
;
}
else
if
(
p
[
1
]
==
'3'
&&
p
[
2
]
==
'2'
)
p
+=
3
;
else
{
res
->
flags
|=
WPRINTF_INTPTR
;
p
++
;
}
}
switch
(
*
p
)
{
case
'c'
:
res
->
type
=
(
res
->
flags
&
WPRINTF_SHORT
)
?
WPR_CHAR
:
WPR_WCHAR
;
...
...
@@ -204,6 +222,10 @@ static INT WPRINTF_ParseFormatW( LPCWSTR format, WPRINTF_FORMAT *res )
case
'u'
:
res
->
type
=
WPR_UNSIGNED
;
break
;
case
'p'
:
res
->
width
=
2
*
sizeof
(
void
*
);
res
->
flags
|=
WPRINTF_ZEROPAD
|
WPRINTF_INTPTR
;
/* fall through */
case
'X'
:
res
->
flags
|=
WPRINTF_UPPER_HEX
;
/* fall through */
...
...
@@ -247,16 +269,32 @@ static UINT WPRINTF_GetLen( WPRINTF_FORMAT *format, WPRINTF_DATA *arg,
if
(
len
>
maxlen
)
len
=
maxlen
;
return
(
format
->
precision
=
len
);
case
WPR_SIGNED
:
len
=
sprintf
(
number
,
"%d"
,
arg
->
int_view
);
break
;
case
WPR_UNSIGNED
:
len
=
sprintf
(
number
,
"%u"
,
(
UINT
)
arg
->
int_view
);
break
;
case
WPR_HEXA
:
len
=
sprintf
(
number
,
(
format
->
flags
&
WPRINTF_UPPER_HEX
)
?
"%X"
:
"%x"
,
(
UINT
)
arg
->
int_view
);
{
const
char
*
digits
=
(
format
->
flags
&
WPRINTF_UPPER_HEX
)
?
"0123456789ABCDEF"
:
"0123456789abcdef"
;
ULONGLONG
num
=
arg
->
int_view
;
int
base
=
format
->
type
==
WPR_HEXA
?
16
:
10
;
char
buffer
[
20
],
*
p
=
buffer
,
*
dst
=
number
;
if
(
format
->
type
==
WPR_SIGNED
&&
arg
->
int_view
<
0
)
{
*
dst
++
=
'-'
;
num
=
-
arg
->
int_view
;
}
if
(
format
->
flags
&
WPRINTF_INTPTR
)
num
=
(
UINT_PTR
)
num
;
else
if
(
!
(
format
->
flags
&
WPRINTF_I64
))
num
=
(
UINT
)
num
;
do
{
*
p
++
=
digits
[
num
%
base
];
num
/=
base
;
}
while
(
num
);
while
(
p
>
buffer
)
*
dst
++
=
*
(
--
p
);
*
dst
=
0
;
len
=
dst
-
number
;
break
;
}
default:
return
0
;
}
...
...
@@ -318,7 +356,9 @@ INT WINAPI wvnsprintfA( LPSTR buffer, INT maxlen, LPCSTR spec, __ms_va_list args
case
WPR_HEXA
:
case
WPR_SIGNED
:
case
WPR_UNSIGNED
:
argData
.
int_view
=
va_arg
(
args
,
INT
);
if
(
format
.
flags
&
WPRINTF_INTPTR
)
argData
.
int_view
=
va_arg
(
args
,
INT_PTR
);
else
if
(
format
.
flags
&
WPRINTF_I64
)
argData
.
int_view
=
va_arg
(
args
,
LONGLONG
);
else
argData
.
int_view
=
va_arg
(
args
,
INT
);
break
;
default:
argData
.
wchar_view
=
0
;
...
...
@@ -423,7 +463,9 @@ INT WINAPI wvnsprintfW( LPWSTR buffer, INT maxlen, LPCWSTR spec, __ms_va_list ar
case
WPR_HEXA
:
case
WPR_SIGNED
:
case
WPR_UNSIGNED
:
argData
.
int_view
=
va_arg
(
args
,
INT
);
if
(
format
.
flags
&
WPRINTF_INTPTR
)
argData
.
int_view
=
va_arg
(
args
,
INT_PTR
);
else
if
(
format
.
flags
&
WPRINTF_I64
)
argData
.
int_view
=
va_arg
(
args
,
LONGLONG
);
else
argData
.
int_view
=
va_arg
(
args
,
INT
);
break
;
default:
argData
.
wchar_view
=
0
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment