Piotr Caban : msvcrt: Added _atodbl_l implementation.

Alexandre Julliard julliard at winehq.org
Mon Dec 17 13:58:23 CST 2012


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Mon Dec 17 15:19:07 2012 +0100

msvcrt: Added _atodbl_l implementation.

---

 dlls/msvcrt/msvcrt.h    |    6 ++++++
 dlls/msvcrt/msvcrt.spec |    4 ++--
 dlls/msvcrt/string.c    |   23 +++++++++++++++++++++++
 3 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h
index ea31b3c..bdd5933 100644
--- a/dlls/msvcrt/msvcrt.h
+++ b/dlls/msvcrt/msvcrt.h
@@ -986,6 +986,7 @@ int pf_printf_w(puts_clbk_w, void*, const MSVCRT_wchar_t*, MSVCRT__locale_t,
 printf_arg arg_clbk_valist(void*, int, int, __ms_va_list*) DECLSPEC_HIDDEN;
 
 #define MSVCRT_FLT_MIN 1.175494351e-38F
+#define MSVCRT_DBL_MIN 2.2250738585072014e-308
 #define MSVCRT__OVERFLOW  3
 #define MSVCRT__UNDERFLOW 4
 
@@ -994,4 +995,9 @@ typedef struct
     float f;
 } MSVCRT__CRT_FLOAT;
 
+typedef struct
+{
+    double x;
+} MSVCRT__CRT_DOUBLE;
+
 #endif /* __WINE_MSVCRT_H */
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 274554b..79f6511 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -300,8 +300,8 @@
 # stub _aligned_realloc_dbg(ptr long long str long)
 @ cdecl _amsg_exit(long)
 @ cdecl _assert(str str long) MSVCRT__assert
-@ stub _atodbl(ptr str)
-# stub _atodbl_l(ptr str ptr)
+@ cdecl _atodbl(ptr str) MSVCRT__atodbl
+@ cdecl _atodbl_l(ptr str ptr) MSVCRT__atodbl_l
 @ cdecl _atof_l(str ptr) MSVCRT__atof_l
 @ cdecl _atoflt_l(ptr str ptr) MSVCRT__atoflt_l
 @ cdecl -ret64 _atoi64(str) ntdll._atoi64
diff --git a/dlls/msvcrt/string.c b/dlls/msvcrt/string.c
index 90518bc..f166865 100644
--- a/dlls/msvcrt/string.c
+++ b/dlls/msvcrt/string.c
@@ -455,6 +455,29 @@ int CDECL MSVCRT__atoflt_l( MSVCRT__CRT_FLOAT *value, char *str, MSVCRT__locale_
 }
 
 /*********************************************************************
+ *              _atodbl_l  (MSVCRT.@)
+ */
+int CDECL MSVCRT__atodbl_l(MSVCRT__CRT_DOUBLE *value, char *str, MSVCRT__locale_t locale)
+{
+    int err;
+
+    value->x = strtod_helper(str, NULL, locale, &err);
+    if(isinf(value->x))
+        return MSVCRT__OVERFLOW;
+    if((value->x!=0 || err) && value->x>-MSVCRT_DBL_MIN && value->x<MSVCRT_DBL_MIN)
+        return MSVCRT__UNDERFLOW;
+    return 0;
+}
+
+/*********************************************************************
+ *              _atodbl  (MSVCRT.@)
+ */
+int CDECL MSVCRT__atodbl(MSVCRT__CRT_DOUBLE *value, char *str)
+{
+    return MSVCRT__atodbl_l(value, str, NULL);
+}
+
+/*********************************************************************
  *		_strcoll_l (MSVCRT.@)
  */
 int CDECL MSVCRT_strcoll_l( const char* str1, const char* str2, MSVCRT__locale_t locale )




More information about the wine-cvs mailing list