Piotr Caban : msvcp90: Add time_get<char>::do_get_weekday implementation.
Alexandre Julliard
julliard at winehq.org
Wed Aug 15 14:39:55 CDT 2018
Module: wine
Branch: master
Commit: 215ff448dcae833de85e60664b155b578ba781e6
URL: https://source.winehq.org/git/wine.git/?a=commit;h=215ff448dcae833de85e60664b155b578ba781e6
Author: Piotr Caban <piotr at codeweavers.com>
Date: Wed Aug 15 12:49:09 2018 +0200
msvcp90: Add time_get<char>::do_get_weekday implementation.
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/msvcp90/locale.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 57 insertions(+), 2 deletions(-)
diff --git a/dlls/msvcp90/locale.c b/dlls/msvcp90/locale.c
index b506c9e..be5edad 100644
--- a/dlls/msvcp90/locale.c
+++ b/dlls/msvcp90/locale.c
@@ -10090,6 +10090,52 @@ istreambuf_iterator_char* __thiscall time_get_char_get_date(const time_get_char
return call_time_get_char_do_get_date(this, ret, s, e, base, err, t);
}
+static int find_longest_match(istreambuf_iterator_char *iter, const char *str)
+{
+ int i, len = 0, last_match = -1, match = -1;
+ const char *p, *end;
+ char buf[64];
+
+ for(istreambuf_iterator_char_val(iter); iter->strbuf && len<ARRAY_SIZE(buf);
+ istreambuf_iterator_char_inc(iter))
+ {
+ BOOL got_prefix = FALSE;
+
+ buf[len++] = iter->val;
+ last_match = match;
+ match = -1;
+ for(p=str+1, i=0; *p; p = (*end ? end+1 : end), i++)
+ {
+ end = strchr(p, ':');
+ if (!end)
+ end = p + strlen(p);
+
+ if (end-p >= len && !memcmp(p, buf, len))
+ {
+ if (end-p == len)
+ match = i;
+ else
+ got_prefix = TRUE;
+ }
+ }
+
+ if (!got_prefix)
+ {
+ if (match != -1)
+ {
+ istreambuf_iterator_char_inc(iter);
+ return match;
+ }
+ break;
+ }
+ }
+ if (len == ARRAY_SIZE(buf))
+ FIXME("temporary buffer is too small\n");
+ if (!iter->strbuf)
+ return match;
+ return last_match;
+}
+
/* ?do_get_monthname@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z */
/* ?do_get_monthname@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MEBA?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AEAVios_base at 2@AEAHPEAUtm@@@Z */
DEFINE_THISCALL_WRAPPER(time_get_char_do_get_monthname, 36) /* virtual */
@@ -10186,8 +10232,17 @@ istreambuf_iterator_char* __thiscall time_get_char_do_get_weekday(const time_get
istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
ios_base *base, int *err, struct tm *t)
{
- FIXME("(%p %p %p %p %p) stub\n", this, ret, base, err, t);
- return NULL;
+ int match;
+
+ TRACE("(%p %p %p %p %p)\n", this, ret, base, err, t);
+
+ if ((match = find_longest_match(&s, this->days)) != -1)
+ t->tm_wday = match / 2;
+ else
+ *err |= IOSTATE_failbit;
+
+ *ret = s;
+ return ret;
}
/* ?get_weekday@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AAVios_base at 2@AAHPAUtm@@@Z */
More information about the wine-cvs
mailing list