Piotr Caban : msvcrt: Added _wcstoi64 and _wcstoui64 implementation.

Alexandre Julliard julliard at winehq.org
Tue Apr 27 16:59:32 CDT 2010


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Apr 27 08:42:32 2010 +0200

msvcrt: Added _wcstoi64 and _wcstoui64 implementation.

---

 dlls/msvcr80/msvcr80.spec |    8 +-
 dlls/msvcr90/msvcr90.spec |    8 +-
 dlls/msvcrt/msvcrt.spec   |    8 +-
 dlls/msvcrt/string.c      |    6 +-
 dlls/msvcrt/wcs.c         |  158 +++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 173 insertions(+), 15 deletions(-)

diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec
index 3cc641e..6ead0a7 100644
--- a/dlls/msvcr80/msvcr80.spec
+++ b/dlls/msvcr80/msvcr80.spec
@@ -1106,13 +1106,13 @@
 @ cdecl _wcsset(wstr long) msvcrt._wcsset
 @ stub _wcsset_s
 @ cdecl _wcstod_l(wstr ptr) msvcrt._wcstod_l
-@ stub _wcstoi64
-@ stub _wcstoi64_l
+@ cdecl _wcstoi64(wstr ptr long) msvcrt._wcstoi64
+@ cdecl _wcstoi64_l(wstr ptr long ptr) msvcrt._wcstoi64_l
 @ stub _wcstol_l
 @ stub _wcstombs_l
 @ stub _wcstombs_s_l
-@ stub _wcstoui64
-@ stub _wcstoui64_l
+@ cdecl _wcstoui64(wstr ptr long) msvcrt._wcstoui64
+@ cdecl _wcstoui64_l(wstr ptr long ptr) msvcrt._wcstoui64_l
 @ stub _wcstoul_l
 @ cdecl _wcsupr(wstr) msvcrt._wcsupr
 @ stub _wcsupr_l
diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec
index 59a71ba..72dff79 100644
--- a/dlls/msvcr90/msvcr90.spec
+++ b/dlls/msvcr90/msvcr90.spec
@@ -1093,13 +1093,13 @@
 @ cdecl _wcsset(wstr long) msvcrt._wcsset
 @ stub _wcsset_s
 @ cdecl _wcstod_l(wstr ptr) msvcrt._wcstod_l
-@ stub _wcstoi64
-@ stub _wcstoi64_l
+@ cdecl _wcstoi64(wstr ptr long) msvcrt._wcstoi64
+@ cdecl _wcstoi64_l(wstr ptr long ptr) msvcrt._wcstoi64_l
 @ stub _wcstol_l
 @ stub _wcstombs_l
 @ stub _wcstombs_s_l
-@ stub _wcstoui64
-@ stub _wcstoui64_l
+@ cdecl _wcstoui64(wstr ptr long) msvcrt._wcstoui64
+@ cdecl _wcstoui64_l(wstr ptr long ptr) msvcrt._wcstoui64_l
 @ stub _wcstoul_l
 @ cdecl _wcsupr(wstr) msvcrt._wcsupr
 @ stub _wcsupr_l
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index e5bbaf4..5f82cf1 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -1035,13 +1035,13 @@
 @ cdecl _wcsrev(wstr)
 @ cdecl _wcsset(wstr long)
 # stub _wcsset_s
-# stub _wcstoi64
-# stub _wcstoi64_l
+@ cdecl _wcstoi64(wstr ptr long) MSVCRT__wcstoi64
+@ cdecl _wcstoi64_l(wstr ptr long ptr) MSVCRT__wcstoi64_l
 # stub _wcstol_l
 # stub _wcstombs_l
 # stub _wcstombs_s_l
-# stub _wcstoui64
-# stub _wcstoui64_l
+@ cdecl _wcstoui64(wstr ptr long) MSVCRT__wcstoui64
+@ cdecl _wcstoui64_l(wstr ptr long ptr) MSVCRT__wcstoui64_l
 # stub _wcstoul_l
 @ cdecl _wcsupr(wstr) ntdll._wcsupr
 # stub _wcsupr_l
diff --git a/dlls/msvcrt/string.c b/dlls/msvcrt/string.c
index 459d1a1..7d578a3 100644
--- a/dlls/msvcrt/string.c
+++ b/dlls/msvcrt/string.c
@@ -529,10 +529,10 @@ __int64 CDECL MSVCRT_strtoi64_l(const char *nptr, char **endptr, int base, MSVCR
 
         if(!negative && (ret>MSVCRT_I64_MAX/base || ret*base>MSVCRT_I64_MAX-v)) {
             ret = MSVCRT_I64_MAX;
-            *MSVCRT__errno() = ERANGE;
+            *MSVCRT__errno() = MSVCRT_ERANGE;
         } else if(negative && (ret<MSVCRT_I64_MIN/base || ret*base<MSVCRT_I64_MIN-v)) {
             ret = MSVCRT_I64_MIN;
-            *MSVCRT__errno() = ERANGE;
+            *MSVCRT__errno() = MSVCRT_ERANGE;
         } else
             ret = ret*base + v;
     }
@@ -606,7 +606,7 @@ unsigned __int64 CDECL MSVCRT_strtoui64_l(const char *nptr, char **endptr, int b
 
         if(ret>MSVCRT_UI64_MAX/base || ret*base>MSVCRT_UI64_MAX-v) {
             ret = MSVCRT_UI64_MAX;
-            *MSVCRT__errno() = ERANGE;
+            *MSVCRT__errno() = MSVCRT_ERANGE;
         } else
             ret = ret*base + v;
     }
diff --git a/dlls/msvcrt/wcs.c b/dlls/msvcrt/wcs.c
index 44a3b4d..04d90de 100644
--- a/dlls/msvcrt/wcs.c
+++ b/dlls/msvcrt/wcs.c
@@ -1408,3 +1408,161 @@ INT CDECL MSVCRT_wcscat_s(MSVCRT_wchar_t* dst, MSVCRT_size_t elem, const MSVCRT_
     dst[0] = '\0';
     return MSVCRT_ERANGE;
 }
+
+/*********************************************************************
+ *  _wctoi64_l (MSVCR90.@)
+ *
+ * FIXME: locale parameter is ignored
+ */
+__int64 CDECL MSVCRT__wcstoi64_l(const MSVCRT_wchar_t *nptr,
+        MSVCRT_wchar_t **endptr, int base, MSVCRT__locale_t locale)
+{
+    BOOL negative = FALSE;
+    __int64 ret = 0;
+
+    TRACE("(%s %p %d %p)\n", debugstr_w(nptr), endptr, base, locale);
+
+    if(!nptr || base<0 || base>36 || base==1) {
+        MSVCRT__invalid_parameter(NULL, NULL, NULL, 0, 0);
+        return 0;
+    }
+
+    while(isspaceW(*nptr)) nptr++;
+
+    if(*nptr == '-') {
+        negative = TRUE;
+        nptr++;
+    } else if(*nptr == '+')
+        nptr++;
+
+    if((base==0 || base==16) && *nptr=='0' && tolowerW(*(nptr+1))=='x') {
+        base = 16;
+        nptr += 2;
+    }
+
+    if(base == 0) {
+        if(*nptr=='0')
+            base = 8;
+        else
+            base = 10;
+    }
+
+    while(*nptr) {
+        char cur = tolowerW(*nptr);
+        int v;
+
+        if(isdigitW(cur)) {
+            if(cur >= '0'+base)
+                break;
+            v = cur-'0';
+        } else {
+            if(cur<'a' || cur>='a'+base-10)
+                break;
+            v = cur-'a'+10;
+        }
+
+        if(negative)
+            v = -v;
+
+        nptr++;
+
+        if(!negative && (ret>MSVCRT_I64_MAX/base || ret*base>MSVCRT_I64_MAX-v)) {
+            ret = MSVCRT_I64_MAX;
+            *MSVCRT__errno() = MSVCRT_ERANGE;
+        } else if(negative && (ret<MSVCRT_I64_MIN/base || ret*base<MSVCRT_I64_MIN-v)) {
+            ret = MSVCRT_I64_MIN;
+            *MSVCRT__errno() = MSVCRT_ERANGE;
+        } else
+            ret = ret*base + v;
+    }
+
+    if(endptr)
+        *endptr = (MSVCRT_wchar_t*)nptr;
+
+    return ret;
+}
+
+/*********************************************************************
+ *  _wcstoi64 (MSVCR90.@)
+ */
+__int64 CDECL MSVCRT__wcstoi64(const MSVCRT_wchar_t *nptr,
+        MSVCRT_wchar_t **endptr, int base)
+{
+    return MSVCRT__wcstoi64_l(nptr, endptr, base, NULL);
+}
+
+/*********************************************************************
+ *  _wcstoui64_l (MSVCR90.@)
+ *
+ * FIXME: locale parameter is ignored
+ */
+unsigned __int64 CDECL MSVCRT__wcstoui64_l(const MSVCRT_wchar_t *nptr,
+        MSVCRT_wchar_t **endptr, int base, MSVCRT__locale_t locale)
+{
+    BOOL negative = FALSE;
+    unsigned __int64 ret = 0;
+
+    TRACE("(%s %p %d %p)\n", debugstr_w(nptr), endptr, base, locale);
+
+    if(!nptr || base<0 || base>36 || base==1) {
+        MSVCRT__invalid_parameter(NULL, NULL, NULL, 0, 0);
+        return 0;
+    }
+
+    while(isspaceW(*nptr)) nptr++;
+
+    if(*nptr == '-') {
+        negative = TRUE;
+        nptr++;
+    } else if(*nptr == '+')
+        nptr++;
+
+    if((base==0 || base==16) && *nptr=='0' && tolowerW(*(nptr+1))=='x') {
+        base = 16;
+        nptr += 2;
+    }
+
+    if(base == 0) {
+        if(*nptr=='0')
+            base = 8;
+        else
+            base = 10;
+    }
+
+    while(*nptr) {
+        char cur = tolowerW(*nptr);
+        int v;
+
+        if(isdigit(cur)) {
+            if(cur >= '0'+base)
+                break;
+            v = *nptr-'0';
+        } else {
+            if(cur<'a' || cur>='a'+base-10)
+                break;
+            v = cur-'a'+10;
+        }
+
+        nptr++;
+
+        if(ret>MSVCRT_UI64_MAX/base || ret*base>MSVCRT_UI64_MAX-v) {
+            ret = MSVCRT_UI64_MAX;
+            *MSVCRT__errno() = MSVCRT_ERANGE;
+        } else
+            ret = ret*base + v;
+    }
+
+    if(endptr)
+        *endptr = (MSVCRT_wchar_t*)nptr;
+
+    return negative ? -ret : ret;
+}
+
+/*********************************************************************
+ *  _wcstoui64 (MSVCR90.@)
+ */
+unsigned __int64 CDECL MSVCRT__wcstoui64(const MSVCRT_wchar_t *nptr,
+        MSVCRT_wchar_t **endptr, int base)
+{
+    return MSVCRT__wcstoui64_l(nptr, endptr, base, NULL);
+}




More information about the wine-cvs mailing list