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