Piotr Caban : msvcp90: Added num_put<char>::put(integral number).

Alexandre Julliard julliard at winehq.org
Fri Jun 22 10:52:03 CDT 2012


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Fri Jun 22 10:27:02 2012 +0200

msvcp90: Added num_put<char>::put(integral number).

---

 dlls/msvcp90/locale.c |  120 +++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 106 insertions(+), 14 deletions(-)

diff --git a/dlls/msvcp90/locale.c b/dlls/msvcp90/locale.c
index fc85426..eabdef8 100644
--- a/dlls/msvcp90/locale.c
+++ b/dlls/msvcp90/locale.c
@@ -5477,8 +5477,30 @@ ostreambuf_iterator_char* __cdecl num_put_char__Fput(const num_put *this, ostrea
 /* ?_Ifmt@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@AEBAPEADPEADPEBDH at Z */
 char* __cdecl num_put_char__Ifmt(const num_put *this, char *fmt, const char *spec, int fmtfl)
 {
-    FIXME("(%p %p %p %d) stub\n", this, fmt, spec, fmtfl);
-    return NULL;
+    int base = fmtfl & FMTFLAG_basefield;
+    char *p = fmt;
+
+    TRACE("(%p %p %p %d)\n", this, fmt, spec, fmtfl);
+
+    *p++ = '%';
+    if(fmtfl & FMTFLAG_showpos)
+        *p++ = '+';
+    if(fmtfl & FMTFLAG_showbase)
+        *p++ = '#';
+
+    *p++ = *spec++;
+    if(*spec == 'l')
+        *p++ = *spec++;
+
+    if(base == FMTFLAG_oct)
+        *p++ = 'o';
+    else if(base == FMTFLAG_hex)
+        *p++ = (fmtfl & FMTFLAG_uppercase) ? 'X' : 'x';
+    else
+        *p++ = *spec;
+
+    *p++ = '\0';
+    return fmt;
 }
 
 /* ?_Iput@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@ABA?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@DPADI at Z */
@@ -5486,8 +5508,55 @@ char* __cdecl num_put_char__Ifmt(const num_put *this, char *fmt, const char *spe
 ostreambuf_iterator_char* __cdecl num_put_char__Iput(const num_put *this, ostreambuf_iterator_char *ret,
         ostreambuf_iterator_char dest, ios_base *base, char fill, char *buf, MSVCP_size_t count)
 {
-    FIXME("(%p %p %p %d %p %ld) stub\n", this, ret, base, fill, buf, count);
-    return NULL;
+    numpunct_char *numpunct = numpunct_char_use_facet(base->loc);
+    basic_string_char grouping_bstr;
+    const char *grouping;
+    char *p, sep;
+    int cur_group = 0, group_size = 0;
+    int adjustfield = base->fmtfl & FMTFLAG_adjustfield;
+    MSVCP_size_t pad;
+
+    TRACE("(%p %p %p %d %s %ld)\n", this, ret, base, fill, buf, count);
+
+    /* Add separators to number */
+    numpunct_char_grouping(numpunct, &grouping_bstr);
+    grouping = MSVCP_basic_string_char_c_str(&grouping_bstr);
+    sep = grouping[0] ? numpunct_char_thousands_sep(numpunct) : '\0';
+
+    for(p=buf+count-1; p>buf && sep && grouping[cur_group]!=CHAR_MAX; p--) {
+        group_size++;
+        if(group_size == grouping[cur_group]) {
+            group_size = 0;
+            if(grouping[cur_group+1])
+                cur_group++;
+
+            memmove(p+1, p, buf+count-p);
+            *p = sep;
+            count++;
+        }
+    }
+    MSVCP_basic_string_char_dtor(&grouping_bstr);
+
+    /* Display number with padding */
+    if(count >= base->wide)
+        pad = 0;
+    else
+        pad = base->wide-count;
+    base->wide = 0;
+
+    if((adjustfield & FMTFLAG_internal) && (buf[0]=='-' || buf[0]=='+')) {
+        num_put_char__Putc(this, &dest, dest, buf, 1);
+        buf++;
+    }else if((adjustfield & FMTFLAG_internal) && (buf[1]=='x' || buf[1]=='X')) {
+        num_put_char__Putc(this, &dest, dest, buf, 2);
+        buf += 2;
+    }
+    if(adjustfield != FMTFLAG_left) {
+        num_put_char__Rep(this, ret, dest, fill, pad);
+        pad = 0;
+    }
+    num_put_char__Putc(this, &dest, dest, buf, count);
+    return num_put_char__Rep(this, ret, dest, fill, pad);
 }
 
 /* ?do_put@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@MBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@DJ at Z */
@@ -5499,8 +5568,13 @@ DEFINE_THISCALL_WRAPPER(num_put_char_do_put_long, 28)
 ostreambuf_iterator_char* __thiscall num_put_char_do_put_long(const num_put *this, ostreambuf_iterator_char *ret,
         ostreambuf_iterator_char dest, ios_base *base, char fill, LONG v)
 {
-    FIXME("(%p %p %p %d %d) stub\n", this, ret, base, fill, v);
-    return NULL;
+    char tmp[48]; /* 22(8^22>2^64)*2(separators beetwen every digit) + 3(strlen("+0x"))+1 */
+    char fmt[7]; /* strlen("%+#lld")+1 */
+
+    TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
+
+    return num_put_char__Iput(this, ret, dest, base, fill, tmp,
+            sprintf(tmp, num_put_char__Ifmt(this, fmt, "ld", base->fmtfl), v));
 }
 
 /* ?put@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@DJ at Z */
@@ -5522,8 +5596,13 @@ DEFINE_THISCALL_WRAPPER(num_put_char_do_put_ulong, 28)
 ostreambuf_iterator_char* __thiscall num_put_char_do_put_ulong(const num_put *this, ostreambuf_iterator_char *ret,
         ostreambuf_iterator_char dest, ios_base *base, char fill, ULONG v)
 {
-    FIXME("(%p %p %p %d %d) stub\n", this, ret, base, fill, v);
-    return NULL;
+    char tmp[48]; /* 22(8^22>2^64)*2(separators beetwen every digit) + 3(strlen("+0x"))+1 */
+    char fmt[7]; /* strlen("%+#lld")+1 */
+
+    TRACE("(%p %p %p %d %d)\n", this, ret, base, fill, v);
+
+    return num_put_char__Iput(this, ret, dest, base, fill, tmp,
+            sprintf(tmp, num_put_char__Ifmt(this, fmt, "lu", base->fmtfl), v));
 }
 
 /* ?put@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@DK at Z */
@@ -5583,8 +5662,11 @@ DEFINE_THISCALL_WRAPPER(num_put_char_do_put_ptr, 28)
 ostreambuf_iterator_char* __thiscall num_put_char_do_put_ptr(const num_put *this, ostreambuf_iterator_char *ret,
         ostreambuf_iterator_char dest, ios_base *base, char fill, const void *v)
 {
-    FIXME("(%p %p %p %d %p) stub\n", this, ret, base, fill, v);
-    return NULL;
+    char tmp[17]; /* 8(16^8==2^64)*2(separators beetwen every digit) + 1 */
+
+    TRACE("(%p %p %p %d %p)\n", this, ret, base, fill, v);
+
+    return num_put_char__Iput(this, ret, dest, base, fill, tmp, sprintf(tmp, "%p", v));
 }
 
 /* ?put@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@DPBX at Z */
@@ -5606,8 +5688,13 @@ DEFINE_THISCALL_WRAPPER(num_put_char_do_put_int64, 32)
 ostreambuf_iterator_char* __thiscall num_put_char_do_put_int64(const num_put *this, ostreambuf_iterator_char *ret,
         ostreambuf_iterator_char dest, ios_base *base, char fill, __int64 v)
 {
-    FIXME("(%p %p %p %d) stub\n", this, ret, base, fill);
-    return NULL;
+    char tmp[48]; /* 22(8^22>2^64)*2(separators beetwen every digit) + 3(strlen("+0x"))+1 */
+    char fmt[7]; /* strlen("%+#lld")+1 */
+
+    TRACE("(%p %p %p %d)\n", this, ret, base, fill);
+
+    return num_put_char__Iput(this, ret, dest, base, fill, tmp,
+            sprintf(tmp, num_put_char__Ifmt(this, fmt, "lld", base->fmtfl), v));
 }
 
 /* ?put@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@D_J at Z */
@@ -5629,8 +5716,13 @@ DEFINE_THISCALL_WRAPPER(num_put_char_do_put_uint64, 32)
 ostreambuf_iterator_char* __thiscall num_put_char_do_put_uint64(const num_put *this, ostreambuf_iterator_char *ret,
         ostreambuf_iterator_char dest, ios_base *base, char fill, unsigned __int64 v)
 {
-    FIXME("(%p %p %p %d) stub\n", this, ret, base, fill);
-    return NULL;
+    char tmp[48]; /* 22(8^22>2^64)*2(separators beetwen every digit) + 3(strlen("+0x"))+1 */
+    char fmt[7]; /* strlen("%+#lld")+1 */
+
+    TRACE("(%p %p %p %d)\n", this, ret, base, fill);
+
+    return num_put_char__Iput(this, ret, dest, base, fill, tmp,
+            sprintf(tmp, num_put_char__Ifmt(this, fmt, "llu", base->fmtfl), v));
 }
 
 /* ?put@?$num_put at DV?$ostreambuf_iterator at DU?$char_traits at D@std@@@std@@@std@@QBE?AV?$ostreambuf_iterator at DU?$char_traits at D@std@@@2 at V32@AAVios_base at 2@D_K at Z */




More information about the wine-cvs mailing list