Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
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-cw
Commits
9134f37e
Commit
9134f37e
authored
Oct 25, 2002
by
Bill Medland
Committed by
Alexandre Julliard
Oct 25, 2002
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix OLE_GetFormatW so that GetDateFormatW works.
Rearranged for simplicity.
parent
97a4384d
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
146 additions
and
121 deletions
+146
-121
locale.c
dlls/kernel/tests/locale.c
+54
-0
ole2nls.c
ole/ole2nls.c
+92
-121
No files found.
dlls/kernel/tests/locale.c
View file @
9134f37e
...
...
@@ -30,6 +30,7 @@
#define BUFFER_SIZE 50
/* Buffer used by callback function */
char
GlobalBuffer
[
BUFFER_SIZE
];
#define COUNTOF(x) (sizeof(x)/sizeof(x)[0])
/* TODO :
* Unicode versions
...
...
@@ -183,6 +184,58 @@ LCID lcid;
eq
(
ret
,
0
,
"GetDateFormat with len=2"
,
"%d"
);
}
void
TestGetDateFormatW
()
{
int
ret
,
error
,
cmp
;
SYSTEMTIME
curtime
;
WCHAR
buffer
[
BUFFER_SIZE
],
format
[
BUFFER_SIZE
],
Expected
[
BUFFER_SIZE
];
LCID
lcid
;
lcid
=
MAKELCID
(
MAKELANGID
(
LANG_ENGLISH
,
SUBLANG_ENGLISH_US
),
SORT_DEFAULT
);
/* 1. Error cases */
/* 1a If flags is not zero then format must be null. */
ret
=
GetDateFormatW
(
LOCALE_SYSTEM_DEFAULT
,
DATE_LONGDATE
,
NULL
,
format
,
buffer
,
sizeof
(
buffer
)
/
sizeof
(
buffer
[
0
]));
error
=
ret
?
0
:
GetLastError
();
ok
(
ret
==
0
&&
error
==
ERROR_INVALID_FLAGS
,
"GetDateFormatW allowed flags and format"
);
/* 1b The buffer can only be null if the count is zero */
/* For the record other bad pointers result in a page fault (Win98) */
ret
=
GetDateFormatW
(
LOCALE_SYSTEM_DEFAULT
,
0
,
NULL
,
format
,
NULL
,
sizeof
(
buffer
)
/
sizeof
(
buffer
[
0
]));
error
=
ret
?
0
:
GetLastError
();
ok
(
ret
==
0
&&
error
==
ERROR_INVALID_PARAMETER
,
"GetDateFormatW did not detect null buffer pointer."
);
ret
=
GetDateFormatW
(
LOCALE_SYSTEM_DEFAULT
,
0
,
NULL
,
format
,
NULL
,
0
);
error
=
ret
?
0
:
GetLastError
();
ok
(
ret
!=
0
&&
error
==
0
,
"GetDateFormatW did not permit null buffer pointer when counting."
);
/* 1c An incorrect day of week is corrected. */
curtime
.
wYear
=
2002
;
curtime
.
wMonth
=
10
;
curtime
.
wDay
=
23
;
curtime
.
wDayOfWeek
=
5
;
/* should be 3 - Wednesday */
curtime
.
wHour
=
0
;
curtime
.
wMinute
=
0
;
curtime
.
wSecond
=
0
;
curtime
.
wMilliseconds
=
234
;
MultiByteToWideChar
(
CP_ACP
,
0
,
"dddd d MMMM yyyy"
,
-
1
,
format
,
COUNTOF
(
format
));
ret
=
GetDateFormatW
(
lcid
,
0
,
&
curtime
,
format
,
buffer
,
COUNTOF
(
buffer
));
error
=
ret
?
0
:
GetLastError
();
MultiByteToWideChar
(
CP_ACP
,
0
,
"Wednesday 23 October 2002"
,
-
1
,
Expected
,
COUNTOF
(
Expected
));
cmp
=
ret
?
lstrcmpW
(
buffer
,
Expected
)
:
2
;
ok
(
ret
==
lstrlenW
(
Expected
)
+
1
&&
error
==
0
&&
cmp
==
0
,
"Day of week correction failed
\n
"
);
/* 1d Invalid year, month or day results in error */
/* 1e Insufficient space results in error */
/* 2. Standard behaviour */
/* 1c is a reasonable test */
/* 3. Replicated undocumented behaviour */
/* e.g. unexepected characters are retained. */
}
void
TestGetCurrencyFormat
()
{
...
...
@@ -343,6 +396,7 @@ START_TEST(locale)
TestGetLocaleInfoA
();
TestGetTimeFormatA
();
TestGetDateFormatA
();
TestGetDateFormatW
();
TestGetNumberFormat
();
TestGetCurrencyFormat
();
TestCompareStringA
();
...
...
ole/ole2nls.c
View file @
9134f37e
...
...
@@ -1572,26 +1572,15 @@ static INT OLE_GetFormatA(LCID locale,
/******************************************************************************
* OLE_GetFormatW [INTERNAL]
*
* dateformat is set TRUE if being called for a date, false for a time
*/
static
INT
OLE_GetFormatW
(
LCID
locale
,
DWORD
flags
,
DWORD
tflags
,
const
SYSTEMTIME
*
xtime
,
LPCWSTR
format
,
LPWSTR
output
,
INT
outlen
)
LPWSTR
output
,
INT
outlen
,
int
dateformat
)
{
INT
inpos
,
outpos
;
int
count
,
type
=
0
,
inquote
;
int
Overflow
;
/* loop check */
char
tmp
[
16
];
WCHAR
buf
[
40
];
int
buflen
=
0
;
WCHAR
arg0
[]
=
{
0
},
arg1
[]
=
{
'%'
,
'd'
,
0
};
WCHAR
arg2
[]
=
{
'%'
,
'0'
,
'2'
,
'd'
,
0
};
WCHAR
*
argarr
[
3
];
int
datevars
=
0
,
timevars
=
0
;
argarr
[
0
]
=
arg0
;
argarr
[
1
]
=
arg1
;
argarr
[
2
]
=
arg2
;
INT
outpos
;
/* make a debug report */
TRACE
(
"args: 0x%lx, 0x%lx, 0x%lx, time(d=%d,h=%d,m=%d,s=%d), fmt:%s (at %p), "
...
...
@@ -1600,55 +1589,50 @@ static INT OLE_GetFormatW(LCID locale, DWORD flags, DWORD tflags,
xtime
->
wDay
,
xtime
->
wHour
,
xtime
->
wMinute
,
xtime
->
wSecond
,
debugstr_w
(
format
),
format
,
output
,
outlen
);
if
(
outlen
==
0
)
{
FIXME
(
"outlen = 0, returning 255
\n
"
);
return
255
;
}
/* initialize state variables */
inpos
=
outpos
=
0
;
count
=
0
;
inquote
=
Overflow
=
0
;
/* this is really just a sanity check
*/
output
[
0
]
=
buf
[
0
]
=
0
;
/* this loop is the core of the function */
for
(
inpos
=
0
;
/* we have several break points */
;
inpos
++
)
{
if
(
inquote
)
{
if
(
format
[
inpos
]
==
(
WCHAR
)
'\''
)
{
if
(
format
[
inpos
+
1
]
==
'\''
)
{
inpos
++
;
output
[
outpos
++
]
=
'\''
;
}
else
{
inquote
=
0
;
continue
;
}
}
else
if
(
format
[
inpos
]
==
0
)
{
output
[
outpos
++
]
=
0
;
if
(
outpos
>
outlen
)
Overflow
=
1
;
break
;
/* normal exit (within a quote) */
}
else
{
output
[
outpos
++
]
=
format
[
inpos
];
/* copy input */
if
(
outpos
>
outlen
)
{
Overflow
=
1
;
output
[
outpos
-
1
]
=
0
;
break
;
}
}
}
else
if
(
(
count
&&
(
format
[
inpos
]
!=
type
))
||
(
(
count
==
4
&&
type
==
'y'
)
||
(
count
==
4
&&
type
==
'M'
)
||
(
count
==
4
&&
type
==
'd'
)
||
(
count
==
2
&&
type
==
'g'
)
||
(
count
==
2
&&
type
==
'h'
)
||
(
count
==
2
&&
type
==
'H'
)
||
(
count
==
2
&&
type
==
'm'
)
||
(
count
==
2
&&
type
==
's'
)
||
(
count
==
2
&&
type
==
't'
)
)
)
{
outpos
=
0
;
while
(
*
format
)
{
/* Literal string: Maybe terminated early by a \0
*/
if
(
*
format
==
(
WCHAR
)
'\''
)
{
format
++
;
while
(
*
format
)
{
if
(
*
format
==
(
WCHAR
)
'\''
)
{
format
++
;
if
(
*
format
!=
'\''
)
{
break
;
/* It was a terminating quote */
}
}
if
(
!
outlen
)
/* We are counting */
;
else
if
(
outpos
>=
outlen
)
goto
too_short
;
else
output
[
outpos
]
=
*
format
;
outpos
++
;
format
++
;
}
}
else
if
(
(
dateformat
&&
(
*
format
==
'd'
||
*
format
==
'M'
||
*
format
==
'y'
||
*
format
==
'g'
)
)
||
(
!
dateformat
&&
(
*
format
==
'H'
||
*
format
==
'h'
||
*
format
==
'm'
||
*
format
==
's'
||
*
format
==
't'
)
)
)
{
int
type
,
count
;
char
tmp
[
16
];
WCHAR
buf
[
40
];
int
buflen
=
0
;
type
=
*
format
;
format
++
;
for
(
count
=
1
;
*
format
==
type
;
format
++
)
count
++
;
switch
(
type
)
{
case
'd'
:
if
(
count
=
=
4
)
{
if
(
count
>
=
4
)
{
GetLocaleInfoW
(
locale
,
LOCALE_SDAYNAME1
+
(
xtime
->
wDayOfWeek
+
6
)
%
7
,
buf
,
sizeof
(
buf
)
/
sizeof
(
WCHAR
)
);
...
...
@@ -1664,7 +1648,7 @@ static INT OLE_GetFormatW(LCID locale, DWORD flags, DWORD tflags,
break
;
case
'M'
:
if
(
count
=
=
4
)
{
if
(
count
>
=
4
)
{
GetLocaleInfoW
(
locale
,
LOCALE_SMONTHNAME1
+
xtime
->
wMonth
-
1
,
buf
,
sizeof
(
buf
)
/
sizeof
(
WCHAR
)
);
...
...
@@ -1678,12 +1662,10 @@ static INT OLE_GetFormatW(LCID locale, DWORD flags, DWORD tflags,
}
break
;
case
'y'
:
if
(
count
=
=
4
)
{
if
(
count
>
=
4
)
{
sprintf
(
tmp
,
"%d"
,
xtime
->
wYear
);
}
else
if
(
count
==
3
)
{
strcpy
(
tmp
,
"yyy"
);
}
else
{
sprintf
(
tmp
,
"%.*d"
,
count
,
xtime
->
wYear
%
100
);
sprintf
(
tmp
,
"%.*d"
,
count
>
2
?
2
:
count
,
xtime
->
wYear
%
100
);
}
MultiByteToWideChar
(
CP_ACP
,
0
,
tmp
,
-
1
,
buf
,
sizeof
(
buf
)
/
sizeof
(
WCHAR
)
);
break
;
...
...
@@ -1701,22 +1683,22 @@ static INT OLE_GetFormatW(LCID locale, DWORD flags, DWORD tflags,
case
'h'
:
/* hours 1:00-12:00 --- is this right? */
sprintf
(
tmp
,
"%.*d"
,
count
,
(
xtime
->
wHour
-
1
)
%
12
+
1
);
sprintf
(
tmp
,
"%.*d"
,
count
>
2
?
2
:
count
,
(
xtime
->
wHour
-
1
)
%
12
+
1
);
MultiByteToWideChar
(
CP_ACP
,
0
,
tmp
,
-
1
,
buf
,
sizeof
(
buf
)
/
sizeof
(
WCHAR
)
);
break
;
case
'H'
:
sprintf
(
tmp
,
"%.*d"
,
count
,
xtime
->
wHour
);
sprintf
(
tmp
,
"%.*d"
,
count
>
2
?
2
:
count
,
xtime
->
wHour
);
MultiByteToWideChar
(
CP_ACP
,
0
,
tmp
,
-
1
,
buf
,
sizeof
(
buf
)
/
sizeof
(
WCHAR
)
);
break
;
case
'm'
:
sprintf
(
tmp
,
"%.*d"
,
count
,
xtime
->
wMinute
);
sprintf
(
tmp
,
"%.*d"
,
count
>
2
?
2
:
count
,
xtime
->
wMinute
);
MultiByteToWideChar
(
CP_ACP
,
0
,
tmp
,
-
1
,
buf
,
sizeof
(
buf
)
/
sizeof
(
WCHAR
)
);
break
;
case
's'
:
sprintf
(
tmp
,
"%.*d"
,
count
,
xtime
->
wSecond
);
sprintf
(
tmp
,
"%.*d"
,
count
>
2
?
2
:
count
,
xtime
->
wSecond
);
MultiByteToWideChar
(
CP_ACP
,
0
,
tmp
,
-
1
,
buf
,
sizeof
(
buf
)
/
sizeof
(
WCHAR
)
);
break
;
...
...
@@ -1730,69 +1712,47 @@ static INT OLE_GetFormatW(LCID locale, DWORD flags, DWORD tflags,
break
;
}
/* no matter what happened, we need to check this next
character the next time we loop through */
inpos
--
;
/* cat buf onto the output */
outlen
=
strlenW
(
buf
);
if
(
outpos
+
buflen
<
outlen
)
{
buflen
=
strlenW
(
buf
);
if
(
!
outlen
)
/* We are counting */
;
else
if
(
outpos
+
buflen
<
outlen
)
{
strcpyW
(
output
+
outpos
,
buf
);
outpos
+=
buflen
;
}
else
{
lstrcpynW
(
output
+
outpos
,
buf
,
outlen
-
outpos
);
Overflow
=
1
;
break
;
/* Abnormal exit */
/* Is this an undocumented feature we are supporting? */
goto
too_short
;
}
/* reset the variables we used this time */
count
=
0
;
type
=
'\0'
;
}
else
if
(
format
[
inpos
]
==
0
)
{
/* we can't check for this at the beginning, because that
would keep us from printing a format spec that ended the
string */
output
[
outpos
]
=
0
;
break
;
/* NORMAL EXIT */
}
else
if
(
count
)
{
/* how we keep track of the middle of a format spec */
count
++
;
continue
;
}
else
if
(
(
datevars
&&
(
format
[
inpos
]
==
'd'
||
format
[
inpos
]
==
'M'
||
format
[
inpos
]
==
'y'
||
format
[
inpos
]
==
'g'
)
)
||
(
timevars
&&
(
format
[
inpos
]
==
'H'
||
format
[
inpos
]
==
'h'
||
format
[
inpos
]
==
'm'
||
format
[
inpos
]
==
's'
||
format
[
inpos
]
==
't'
)
)
)
{
type
=
format
[
inpos
];
count
=
1
;
continue
;
}
else
if
(
format
[
inpos
]
==
'\''
)
{
inquote
=
1
;
continue
;
outpos
+=
buflen
;
}
else
{
/* unquoted literals */
output
[
outpos
++
]
=
format
[
inpos
];
/* a literal character */
if
(
!
outlen
)
/* We are counting */
;
else
if
(
outpos
>=
outlen
)
goto
too_short
;
else
output
[
outpos
]
=
*
format
;
outpos
++
;
format
++
;
}
}
if
(
Overflow
)
{
SetLastError
(
ERROR_INSUFFICIENT_BUFFER
);
WARN
(
" buffer overflow
\n
"
);
};
/* final string terminator and sanity check */
if
(
!
outlen
)
/* We are counting */
;
else
if
(
outpos
>=
outlen
)
goto
too_short
;
else
output
[
outpos
]
=
'\0'
;
outpos
++
;
if
(
outpos
>
outlen
-
1
)
outpos
=
outlen
-
1
;
output
[
outpos
]
=
'0'
;
TRACE
(
" returning %s
\n
"
,
debugstr_w
(
output
));
return
(
!
Overflow
)
?
outlen
:
0
;
TRACE
(
" returning %d %s
\n
"
,
outpos
,
debugstr_w
(
output
));
return
outpos
;
too_short
:
SetLastError
(
ERROR_INSUFFICIENT_BUFFER
);
WARN
(
" buffer overflow
\n
"
);
return
0
;
}
...
...
@@ -1910,6 +1870,17 @@ INT WINAPI GetDateFormatW(LCID locale,DWORD flags,
TRACE
(
"(0x%04lx,0x%08lx,%p,%s,%p,%d)
\n
"
,
locale
,
flags
,
xtime
,
debugstr_w
(
format
),
date
,
datelen
);
/* Tests (could be left until OLE_GetFormatW) */
if
(
flags
&&
format
)
{
SetLastError
(
ERROR_INVALID_FLAGS
);
return
0
;
}
if
(
datelen
&&
!
date
)
{
SetLastError
(
ERROR_INVALID_PARAMETER
);
return
0
;
}
if
(
!
locale
)
{
locale
=
LOCALE_SYSTEM_DEFAULT
;
};
...
...
@@ -1950,7 +1921,7 @@ INT WINAPI GetDateFormatW(LCID locale,DWORD flags,
ret
=
OLE_GetFormatW
(
thislocale
,
flags
,
0
,
thistime
,
thisformat
,
date
,
datelen
);
date
,
datelen
,
1
);
TRACE
(
"GetDateFormatW() returning %d, with data=%s
\n
"
,
...
...
@@ -3067,7 +3038,7 @@ GetTimeFormatW(LCID locale, /* [in] */
}
ret
=
OLE_GetFormatW
(
thislocale
,
thisflags
,
flags
,
thistime
,
thisformat
,
timestr
,
timelen
);
timestr
,
timelen
,
0
);
return
ret
;
}
...
...
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