A first stab at wcstod().
diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec
index 69b4c10..e12201e 100644
--- a/dlls/msvcrt/msvcrt.spec
+++ b/dlls/msvcrt/msvcrt.spec
@@ -753,7 +753,7 @@
@ cdecl wcsrchr(wstr long) ntdll.wcsrchr
@ cdecl wcsspn(wstr wstr) ntdll.wcsspn
@ cdecl wcsstr(wstr wstr) ntdll.wcsstr
-@ stub wcstod #(wstr ptr)
+@ cdecl wcstod(wstr ptr) MSVCRT_wcstod
@ cdecl wcstok(wstr wstr) ntdll.wcstok
@ cdecl wcstol(wstr ptr long) ntdll.wcstol
@ cdecl wcstombs(ptr ptr long) ntdll.wcstombs
diff --git a/dlls/msvcrt/wcs.c b/dlls/msvcrt/wcs.c
index 6246276..3ea853c 100644
--- a/dlls/msvcrt/wcs.c
+++ b/dlls/msvcrt/wcs.c
@@ -112,6 +112,52 @@
}
/*********************************************************************
+ * wcstod (MSVCRT.@)
+ */
+double MSVCRT_wcstod(const MSVCRT_wchar_t* lpszStr, MSVCRT_wchar_t** end)
+{
+ const MSVCRT_wchar_t* str = lpszStr;
+ int negative = 0;
+ double ret = 0, divisor = 10.0;
+
+ TRACE("(%s,%p) semi-stub\n", debugstr_w(lpszStr), end);
+
+ /* FIXME:
+ * - Should set errno on failure
+ * - Should fail on overflow
+ * - Need to check which input formats are allowed
+ */
+ while (isspaceW(*str))
+ str++;
+
+ if (*str == '-')
+ {
+ negative = 1;
+ str++;
+ }
+
+ while (isdigitW(*str))
+ {
+ ret = ret * 10.0 + (*str - '0');
+ str++;
+ }
+ if (*str == '.')
+ str++;
+ while (isdigitW(*str))
+ {
+ ret = ret + (*str - '0') / divisor;
+ divisor *= 10;
+ str++;
+ }
+
+ if (end)
+ *end = (MSVCRT_wchar_t*)str;
+
+ TRACE("returning %g\n", ret);
+ return ret;
+}
+
+/*********************************************************************
* _vsnwprintf (MSVCRT.@)
*/
int _vsnwprintf(MSVCRT_wchar_t *str, unsigned int len,