Module: wine Branch: master Commit: bfa3045816d2d9caf64b4a13fb06fb77b6361ef6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=bfa3045816d2d9caf64b4a13fb...
Author: Piotr Caban piotr@codeweavers.com Date: Mon Apr 16 12:26:16 2012 +0200
msvcrt: Added support for %W and %U format in strftime.
---
dlls/msvcrt/tests/time.c | 26 ++++++++++++++++++++++++++ dlls/msvcrt/time.c | 16 +++++++++++++--- 2 files changed, 39 insertions(+), 3 deletions(-)
diff --git a/dlls/msvcrt/tests/time.c b/dlls/msvcrt/tests/time.c index 6fb7491..c6e2a9c 100644 --- a/dlls/msvcrt/tests/time.c +++ b/dlls/msvcrt/tests/time.c @@ -704,6 +704,32 @@ static void test_strftime(void) ok(retA == 2, "expected 2, got %ld\n", retA); ok(!strcmp(bufA, "AM"), "got %s\n", bufA);
+ retA = strftime(bufA, 256, "%U", gmt_tm); + ok(retA == 2, "expected 2, got %ld\n", retA); + ok(!strcmp(bufA, "00"), "got %s\n", bufA); + + retA = strftime(bufA, 256, "%W", gmt_tm); + ok(retA == 2, "expected 2, got %ld\n", retA); + ok(!strcmp(bufA, "00"), "got %s\n", bufA); + + gmt_tm->tm_wday = 0; + retA = strftime(bufA, 256, "%U", gmt_tm); + ok(retA == 2, "expected 2, got %ld\n", retA); + ok(!strcmp(bufA, "01"), "got %s\n", bufA); + + retA = strftime(bufA, 256, "%W", gmt_tm); + ok(retA == 2, "expected 2, got %ld\n", retA); + ok(!strcmp(bufA, "00"), "got %s\n", bufA); + + gmt_tm->tm_yday = 365; + retA = strftime(bufA, 256, "%U", gmt_tm); + ok(retA == 2, "expected 2, got %ld\n", retA); + ok(!strcmp(bufA, "53"), "got %s\n", bufA); + + retA = strftime(bufA, 256, "%W", gmt_tm); + ok(retA == 2, "expected 2, got %ld\n", retA); + ok(!strcmp(bufA, "52"), "got %s\n", bufA); + gmt_tm->tm_mon = 1; gmt_tm->tm_mday = 30; retA = strftime(bufA, 256, "%c", gmt_tm); diff --git a/dlls/msvcrt/time.c b/dlls/msvcrt/time.c index 69bd391..bc68218 100644 --- a/dlls/msvcrt/time.c +++ b/dlls/msvcrt/time.c @@ -1077,9 +1077,19 @@ MSVCRT_size_t CDECL _Strftime(char *str, MSVCRT_size_t max, const char *format, break; case 'U': case 'W': - FIXME("format %c not yet supported (%x)\n", *format, alternate); - str[0] = 0; - return 0; + if(mstm->tm_wday<0 || mstm->tm_wday>6 || mstm->tm_yday<0 || mstm->tm_yday>365) + goto einval_error; + if(*format == 'U') + tmp = mstm->tm_wday; + else if(!mstm->tm_wday) + tmp = 6; + else + tmp = mstm->tm_wday-1; + + tmp = mstm->tm_yday/7 + (tmp<=mstm->tm_yday%7); + if(!strftime_int(str, &ret, max, tmp, alternate ? 0 : 2, 0, 53)) + return 0; + break; case '%': str[ret++] = '%'; break;