Piotr Caban : msvcp100: Add time_get<char>::get_fmt implementation.

Alexandre Julliard julliard at winehq.org
Tue Nov 20 15:39:51 CST 2018


Module: wine
Branch: master
Commit: ba7cf8cf8fdbb279f2849f109fbe97f57ec2cc61
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=ba7cf8cf8fdbb279f2849f109fbe97f57ec2cc61

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Nov 20 18:30:46 2018 +0100

msvcp100: Add time_get<char>::get_fmt implementation.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msvcp90/locale.c | 58 ++++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 48 insertions(+), 10 deletions(-)

diff --git a/dlls/msvcp90/locale.c b/dlls/msvcp90/locale.c
index 64f7de2..7755ddf 100644
--- a/dlls/msvcp90/locale.c
+++ b/dlls/msvcp90/locale.c
@@ -10019,16 +10019,6 @@ dateorder __thiscall time_get_char_date_order(const time_get_char *this)
     return call_time_get_char_do_date_order(this);
 }
 
-/* ?get@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AEAVios_base at 2@AEAHPEAUtm@@PEBD4 at Z */
-DEFINE_THISCALL_WRAPPER(time_get_char_get_fmt, 44)
-istreambuf_iterator_char* __thiscall time_get_char_get_fmt(const time_get_char *this,
-        istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
-        ios_base *base, int *err, struct tm *t, const char *fmtstart, const char *fmtend)
-{
-    FIXME("(%p %p %p %p %p %p %p) stub\n", this, ret, base, err, t, fmtstart, fmtend);
-    return NULL;
-}
-
 static int find_longest_match(istreambuf_iterator_char *iter, const char *str)
 {
     int i, len = 0, last_match = -1, match = -1;
@@ -10590,6 +10580,54 @@ istreambuf_iterator_char* __thiscall time_get_char_get(const time_get_char *this
     return call_time_get_char_do_get(this, ret, s, e, base, err, t, fmt, mod);
 }
 
+/* ?get@?$time_get at DV?$istreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QEBA?AV?$istreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@0AEAVios_base at 2@AEAHPEAUtm@@PEBD4 at Z */
+DEFINE_THISCALL_WRAPPER(time_get_char_get_fmt, 44)
+istreambuf_iterator_char* __thiscall time_get_char_get_fmt(const time_get_char *this,
+        istreambuf_iterator_char *ret, istreambuf_iterator_char s, istreambuf_iterator_char e,
+        ios_base *base, int *err, struct tm *t, const char *fmtstart, const char *fmtend)
+{
+    ctype_char *ctype;
+
+    TRACE("(%p %p %p %p %p %s)\n", this, ret, base, err, t, wine_dbgstr_an(fmtstart, fmtend-fmtstart));
+
+    ctype = ctype_char_use_facet(IOS_LOCALE(base));
+    istreambuf_iterator_char_val(&s);
+
+    while(fmtstart < fmtend) {
+        if(ctype_char_is_ch(ctype, _SPACE, *fmtstart)) {
+            skip_ws(ctype, &s);
+            fmtstart++;
+            continue;
+        }
+
+        if(!s.strbuf) {
+            *err |= IOSTATE_failbit;
+            break;
+        }
+
+        if(*fmtstart != '%' || fmtstart+1 >= fmtend || fmtstart[1] == '%') {
+            if(s.val != *fmtstart)
+                *err |= IOSTATE_failbit;
+            else
+                istreambuf_iterator_char_inc(&s);
+            if(*fmtstart == '%')
+                fmtstart++;
+        } else {
+            fmtstart++;
+            time_get_char_get(this, &s, s, e, base, err, t, *fmtstart, 0);
+        }
+
+        if(*err & IOSTATE_failbit)
+            break;
+        fmtstart++;
+    }
+
+    if(!s.strbuf)
+        *err |= IOSTATE_eofbit;
+    *ret = s;
+    return ret;
+}
+
 /* ?get@?$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@@PBD4 at Z */
 /* ??_7_Locimp at locale@std@@6B@ */
 extern const vtable_ptr MSVCP_locale__Locimp_vtable;




More information about the wine-cvs mailing list