VarRound implementation
Fabian Cenedese
Cenedese at indel.ch
Thu Feb 19 07:20:21 CST 2004
Hi
This is the implementation of the Variant Round function. I tried to also create a test
function. But I didn't manage to.
Changelog:
Fabian Cenedese <Cenedese at indel.ch>
Implementation of Variant Round function.
Index: wine/dlls/oleaut32/oleaut32.spec
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/oleaut32.spec,v
retrieving revision 1.64
diff -u -r1.64 oleaut32.spec
--- wine/dlls/oleaut32/oleaut32.spec 21 Jan 2004 22:24:08 -0000 1.64
+++ wine/dlls/oleaut32/oleaut32.spec 19 Feb 2004 13:09:04 -0000
@@ -170,7 +170,7 @@
172 stdcall VarInt(ptr ptr)
173 stdcall VarNeg(ptr ptr)
174 stdcall VarNot(ptr ptr)
-175 stub VarRound # stdcall (ptr long ptr)
+175 stdcall VarRound(ptr long ptr)
176 stdcall VarCmp(ptr ptr long long)
177 stdcall VarDecAdd(ptr ptr ptr)
178 stdcall VarDecDiv(ptr ptr ptr)
Index: wine/dlls/oleaut32/variant.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/variant.c,v
retrieving revision 1.87
diff -u -r1.87 variant.c
--- wine/dlls/oleaut32/variant.c 17 Feb 2004 20:25:41 -0000 1.87
+++ wine/dlls/oleaut32/variant.c 19 Feb 2004 13:09:04 -0000
@@ -3437,6 +3437,94 @@
return hRet;
}
+
+/**********************************************************************
+ * VarRound [OLEAUT32.175]
+ *
+ * Perform a round operation on a variant.
+ *
+ * PARAMS
+ * pVarIn [I] Source variant
+ * deci [I] Number of decimals to round to
+ * pVarOut [O] Destination for converted value
+ *
+ * RETURNS
+ * Success: S_OK. pVarOut contains the converted value.
+ * Failure: An HRESULT error code indicating the error.
+ *
+ * NOTES
+ * - Floating point values are rounded to the desired number of decimals.
+ * - Negative values are rounded nearer to zero (and not bigger in absolute).
+ * - Some integer types are just copied to the return variable.
+ * - Some other integer types are not handled and fail.
+ */
+HRESULT WINAPI VarRound(LPVARIANT pVarIn, int deci, LPVARIANT pVarOut)
+{
+ HRESULT hRet = S_OK;
+
+wine_dbg_printf("FABI: VARIANT: VarRound1\n");
+
+ TRACE("(%p->(%s%s),%d)\n", pVarIn, debugstr_VT(pVarIn), debugstr_VF(pVarIn), deci);
+
+ switch (V_VT(pVarIn))
+ {
+ /* cases that fail on windows */
+ case VT_I1:
+ case VT_UI2:
+ case VT_UI4:
+ hRet = DISP_E_BADVARTYPE;
+ break;
+
+ /* cases just copying in to out */
+ case VT_UI1:
+ V_VT(pVarOut) = V_VT(pVarIn);
+ V_UI1(pVarOut) = V_UI1(pVarIn);
+ break;
+ case VT_I2:
+ V_VT(pVarOut) = V_VT(pVarIn);
+ V_I2(pVarOut) = V_I2(pVarIn);
+ break;
+ case VT_I4:
+ V_VT(pVarOut) = V_VT(pVarIn);
+ V_I4(pVarOut) = V_I4(pVarIn);
+ break;
+
+ /* cases we need to do math */
+ case VT_R4:
+ if (V_R4(pVarIn)>0) {
+ V_R4(pVarOut)=floor(V_R4(pVarIn)*pow(10, deci))/pow(10, deci);
+ } else {
+ V_R4(pVarOut)=ceil(V_R4(pVarIn)*pow(10, deci))/pow(10, deci);
+ }
+ V_VT(pVarOut) = V_VT(pVarIn);
+ break;
+
+ case VT_R8:
+ if (V_R8(pVarIn)>0) {
+ V_R8(pVarOut)=floor(V_R8(pVarIn)*pow(10, deci))/pow(10, deci);
+ } else {
+ V_R8(pVarOut)=ceil(V_R8(pVarIn)*pow(10, deci))/pow(10, deci);
+ }
+ V_VT(pVarOut) = V_VT(pVarIn);
+ break;
+
+ /* cases we don't know yet */
+ default:
+ FIXME("Not yet implemented, V_VT(pVarIn) = 0x%X, deci = %d\n",
+ V_VT(pVarIn) & VT_TYPEMASK, deci);
+ hRet = DISP_E_BADVARTYPE;
+ }
+
+ if (FAILED(hRet))
+ V_VT(pVarOut) = VT_EMPTY;
+
+ TRACE("returning 0x%08lx (%s%s),%f\n", hRet, debugstr_VT(pVarOut),
+ debugstr_VF(pVarOut), V_VT(pVarOut) == VT_R4 ? V_R4(pVarOut):-1);
+
+ return hRet;
+}
+
+
/**********************************************************************
* VarMod [OLEAUT32.154]
*
More information about the wine-patches
mailing list