VarDecFromStr

Stefan Leichter Stefan.Leichter at camLine.com
Wed May 14 16:14:49 CDT 2003


Changelog
------------
	partly implementation of VarDecFromStr



-------------- next part --------------
--- ../wine/dlls/oleaut32/oleaut32.spec	Sun May 11 10:05:54 2003
+++ dlls/oleaut32/oleaut32.spec	Fri May  2 10:32:48 2003
@@ -192,7 +192,7 @@
 194 stub VarDecFromR8
 195 stub VarDecFromDate
 196 stub VarDecFromCy
-197 stub VarDecFromStr
+197 stdcall VarDecFromStr(wstr long long ptr)
 198 stub VarDecFromDisp
 199 stub VarDecFromBool
 200 stdcall GetErrorInfo(long ptr) ole32.GetErrorInfo
--- ../wine/dlls/oleaut32/variant.c	Thu Mar  6 23:42:28 2003
+++ dlls/oleaut32/variant.c	Wed May 14 23:03:10 2003
@@ -4573,6 +4573,54 @@
    return S_OK;
 }
 
+/**********************************************************************
+ *              VarDecFromStr [OLEAUT32.@]
+ */
+HRESULT WINAPI VarDecFromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags,
+                             DECIMAL* pdecOut)
+{   WCHAR *p=strIn;
+    ULONGLONG t;
+    ULONG  cy;
+#ifdef FIXIT
+    DECIMAL_SETZERO(pdecOut);
+#else
+    pdecOut->u.s.sign = pdecOut->u.s.scale = UI1_MIN;
+    pdecOut->Hi32 = pdecOut->u1.s1.Mid32 = pdecOut->u1.s1.Lo32 = UI4_MIN;
+#endif
+    if(*p == (WCHAR)'-')pdecOut->u.s.sign= DECIMAL_NEG;
+    if((*p == (WCHAR)'-') || (*p == (WCHAR)'+')) p++;
+    for(;*p != (WCHAR)0; p++) {
+        if((*p < (WCHAR)'0')||(*p > (WCHAR)'9')) goto error ;
+        t = (ULONGLONG)pdecOut->u1.s1.Lo32 *(ULONGLONG)10
+          + (ULONGLONG)(*p -(WCHAR)'0');
+        cy = (ULONG)(t >> 32);
+        pdecOut->u1.s1.Lo32 = (ULONG)(t & (ULONGLONG)UI4_MAX);
+        t = (ULONGLONG)pdecOut->u1.s1.Mid32 * (ULONGLONG)10
+          + (ULONGLONG)cy;
+        cy = (ULONG)(t >> 32);
+        pdecOut->u1.s1.Mid32 = (ULONG)(t & (ULONGLONG)UI4_MAX);
+        t = (ULONGLONG)pdecOut->Hi32 * (ULONGLONG)10
+          + (ULONGLONG)cy;
+        cy = (ULONG)(t >> 32);
+        pdecOut->Hi32 = (ULONG)(t & (ULONGLONG)UI4_MAX);
+        if(cy) goto overflow ;
+    }
+    TRACE("(4) %s -> sign %02x,hi %08lx,mid %08lx, lo%08lx, scale %08x\n",
+          debugstr_w(strIn),
+          pdecOut->u.s.sign, pdecOut->Hi32, pdecOut->u1.s1.Mid32,
+          pdecOut->u1.s1.Lo32, pdecOut->u.s.scale);
+    return S_OK;
+
+overflow:
+    /* like NT4 SP5 */
+    pdecOut->Hi32 = pdecOut->u1.s1.Mid32 = pdecOut->u1.s1.Lo32 = 0xffffffff;
+    return DISP_E_OVERFLOW;
+
+error:
+    ERR("%s: unknown char at pos %d\n",
+              debugstr_w(strIn),  p - strIn + 1);
+    return DISP_E_TYPEMISMATCH;
+}
 
 /**********************************************************************
  *              DosDateTimeToVariantTime [OLEAUT32.14]


More information about the wine-patches mailing list