Partial implementation of VarDecFromStr.

This commit is contained in:
Stefan Leichter 2003-05-15 04:15:25 +00:00 committed by Alexandre Julliard
parent eb359e26ca
commit 39aab38006
2 changed files with 49 additions and 1 deletions

View File

@ -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

View File

@ -4573,6 +4573,54 @@ HRESULT WINAPI VarCyFromUI4(ULONG ulIn, CY* pcyOut) {
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]