VarRound implementation

chmorgan at charter.net chmorgan at charter.net
Thu Feb 19 14:39:21 CST 2004


Without a test how can you know if this implementation produces the correct values?  What about variant type conversions?  It seems silly to send a patch without testing it...

Chris


> 
> From: Fabian Cenedese <Cenedese at indel.ch>
> Date: 2004/02/19 Thu AM 08:20:21 EST
> To: wine-patches at winehq.org
> Subject: VarRound implementation
> 
> 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