ReactOS 0.4.17-dev-540-g8f54750
vartype.c File Reference
#include "wine/debug.h"
#include "winbase.h"
#include "winuser.h"
#include "winnt.h"
#include "variant.h"
#include "resource.h"
#include "locale.h"
Include dependency graph for vartype.c:

Go to the source code of this file.

Classes

struct  DECIMAL_internal
 
union  R4_FIELDS
 
union  R8_FIELDS
 
struct  tagDATEPARSE
 

Macros

#define COBJMACROS
 
#define CY_MULTIPLIER   10000 /* 4 dp of precision */
 
#define CY_MULTIPLIER_F   10000.0
 
#define CY_HALF   (CY_MULTIPLIER/2) /* 0.5 */
 
#define CY_HALF_F   (CY_MULTIPLIER_F/2.0)
 
#define VARIANT_DutchRound(typ, value, res)
 
#define RETTYP   static inline HRESULT
 
#define SIMPLE(dest, src, func)
 
#define NEGTST(dest, src, func)
 
#define POSTST(dest, src, func, tst)
 
#define BOTHTST(dest, src, func, lo, hi)
 
#define DP_TIMESEP   0x01 /* Time separator ( _must_ remain 0x1, used as a bitmask) */
 
#define DP_DATESEP   0x02 /* Date separator */
 
#define DP_MONTH   0x04 /* Month name */
 
#define DP_AM   0x08 /* AM */
 
#define DP_PM   0x10 /* PM */
 
#define TIMEFLAG(i)   ((dp.dwFlags[i] & DP_TIMESEP) << i)
 
#define IsLeapYear(y)   (((y % 4) == 0) && (((y % 100) != 0) || ((y % 400) == 0)))
 
#define ORDER_MDY   0x01
 
#define ORDER_YMD   0x02
 
#define ORDER_YDM   0x04
 
#define ORDER_DMY   0x08
 
#define ORDER_MYD   0x10 /* Synthetic order, used only for funky 2 digit dates */
 
#define DATE_SWAP(x, y)   do { dwTemp = x; x = y; y = dwTemp; } while (0)
 

Typedefs

typedef struct DECIMAL_internal VARIANT_DI
 
typedef struct tagDATEPARSE DATEPARSE
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (variant)
 
static void VARIANT_CopyData (const VARIANT *srcVar, VARTYPE vt, void *pOut)
 
static HRESULT VARIANT_NumberFromBstr (const OLECHAR *pStrIn, LCID lcid, ULONG ulFlags, void *pOut, VARTYPE vt)
 
static HRESULT VARIANT_FromDisp (IDispatch *pdispIn, LCID lcid, void *pOut, VARTYPE vt, DWORD dwFlags)
 
RETTYP _VarR8FromCy (CY i, double *o)
 
HRESULT WINAPI VarI1FromUI1 (BYTE bIn, signed char *pcOut)
 
HRESULT WINAPI VarI1FromI2 (SHORT sIn, signed char *pcOut)
 
HRESULT WINAPI VarI1FromI4 (LONG iIn, signed char *pcOut)
 
HRESULT WINAPI VarI1FromR4 (FLOAT fltIn, signed char *pcOut)
 
HRESULT WINAPI VarI1FromR8 (double dblIn, signed char *pcOut)
 
HRESULT WINAPI VarI1FromDate (DATE dateIn, signed char *pcOut)
 
HRESULT WINAPI VarI1FromCy (CY cyIn, signed char *pcOut)
 
HRESULT WINAPI VarI1FromStr (const OLECHAR *strIn, LCID lcid, ULONG dwFlags, signed char *pcOut)
 
HRESULT WINAPI VarI1FromDisp (IDispatch *pdispIn, LCID lcid, signed char *pcOut)
 
HRESULT WINAPI VarI1FromBool (VARIANT_BOOL boolIn, signed char *pcOut)
 
HRESULT WINAPI VarI1FromUI2 (USHORT usIn, signed char *pcOut)
 
HRESULT WINAPI VarI1FromUI4 (ULONG ulIn, signed char *pcOut)
 
HRESULT WINAPI VarI1FromDec (const DECIMAL *pdecIn, signed char *pcOut)
 
HRESULT WINAPI VarI1FromI8 (LONG64 llIn, signed char *pcOut)
 
HRESULT WINAPI VarI1FromUI8 (ULONG64 ullIn, signed char *pcOut)
 
HRESULT WINAPI VarUI1FromI2 (SHORT sIn, BYTE *pbOut)
 
HRESULT WINAPI VarUI1FromI4 (LONG iIn, BYTE *pbOut)
 
HRESULT WINAPI VarUI1FromR4 (FLOAT fltIn, BYTE *pbOut)
 
HRESULT WINAPI VarUI1FromR8 (double dblIn, BYTE *pbOut)
 
HRESULT WINAPI VarUI1FromCy (CY cyIn, BYTE *pbOut)
 
HRESULT WINAPI VarUI1FromDate (DATE dateIn, BYTE *pbOut)
 
HRESULT WINAPI VarUI1FromStr (const OLECHAR *strIn, LCID lcid, ULONG dwFlags, BYTE *pbOut)
 
HRESULT WINAPI VarUI1FromDisp (IDispatch *pdispIn, LCID lcid, BYTE *pbOut)
 
HRESULT WINAPI VarUI1FromBool (VARIANT_BOOL boolIn, BYTE *pbOut)
 
HRESULT WINAPI VarUI1FromI1 (signed char cIn, BYTE *pbOut)
 
HRESULT WINAPI VarUI1FromUI2 (USHORT usIn, BYTE *pbOut)
 
HRESULT WINAPI VarUI1FromUI4 (ULONG ulIn, BYTE *pbOut)
 
HRESULT WINAPI VarUI1FromDec (const DECIMAL *pdecIn, BYTE *pbOut)
 
HRESULT WINAPI VarUI1FromI8 (LONG64 llIn, BYTE *pbOut)
 
HRESULT WINAPI VarUI1FromUI8 (ULONG64 ullIn, BYTE *pbOut)
 
HRESULT WINAPI VarI2FromUI1 (BYTE bIn, SHORT *psOut)
 
HRESULT WINAPI VarI2FromI4 (LONG iIn, SHORT *psOut)
 
HRESULT WINAPI VarI2FromR4 (FLOAT fltIn, SHORT *psOut)
 
HRESULT WINAPI VarI2FromR8 (double dblIn, SHORT *psOut)
 
HRESULT WINAPI VarI2FromCy (CY cyIn, SHORT *psOut)
 
HRESULT WINAPI VarI2FromDate (DATE dateIn, SHORT *psOut)
 
HRESULT WINAPI VarI2FromStr (const OLECHAR *strIn, LCID lcid, ULONG dwFlags, SHORT *psOut)
 
HRESULT WINAPI VarI2FromDisp (IDispatch *pdispIn, LCID lcid, SHORT *psOut)
 
HRESULT WINAPI VarI2FromBool (VARIANT_BOOL boolIn, SHORT *psOut)
 
HRESULT WINAPI VarI2FromI1 (signed char cIn, SHORT *psOut)
 
HRESULT WINAPI VarI2FromUI2 (USHORT usIn, SHORT *psOut)
 
HRESULT WINAPI VarI2FromUI4 (ULONG ulIn, SHORT *psOut)
 
HRESULT WINAPI VarI2FromDec (const DECIMAL *pdecIn, SHORT *psOut)
 
HRESULT WINAPI VarI2FromI8 (LONG64 llIn, SHORT *psOut)
 
HRESULT WINAPI VarI2FromUI8 (ULONG64 ullIn, SHORT *psOut)
 
HRESULT WINAPI VarUI2FromUI1 (BYTE bIn, USHORT *pusOut)
 
HRESULT WINAPI VarUI2FromI2 (SHORT sIn, USHORT *pusOut)
 
HRESULT WINAPI VarUI2FromI4 (LONG iIn, USHORT *pusOut)
 
HRESULT WINAPI VarUI2FromR4 (FLOAT fltIn, USHORT *pusOut)
 
HRESULT WINAPI VarUI2FromR8 (double dblIn, USHORT *pusOut)
 
HRESULT WINAPI VarUI2FromDate (DATE dateIn, USHORT *pusOut)
 
HRESULT WINAPI VarUI2FromCy (CY cyIn, USHORT *pusOut)
 
HRESULT WINAPI VarUI2FromStr (const OLECHAR *strIn, LCID lcid, ULONG dwFlags, USHORT *pusOut)
 
HRESULT WINAPI VarUI2FromDisp (IDispatch *pdispIn, LCID lcid, USHORT *pusOut)
 
HRESULT WINAPI VarUI2FromBool (VARIANT_BOOL boolIn, USHORT *pusOut)
 
HRESULT WINAPI VarUI2FromI1 (signed char cIn, USHORT *pusOut)
 
HRESULT WINAPI VarUI2FromUI4 (ULONG ulIn, USHORT *pusOut)
 
HRESULT WINAPI VarUI2FromDec (const DECIMAL *pdecIn, USHORT *pusOut)
 
HRESULT WINAPI VarUI2FromI8 (LONG64 llIn, USHORT *pusOut)
 
HRESULT WINAPI VarUI2FromUI8 (ULONG64 ullIn, USHORT *pusOut)
 
HRESULT WINAPI VarI4FromUI1 (BYTE bIn, LONG *piOut)
 
HRESULT WINAPI VarI4FromI2 (SHORT sIn, LONG *piOut)
 
HRESULT WINAPI VarI4FromR4 (FLOAT fltIn, LONG *piOut)
 
HRESULT WINAPI VarI4FromR8 (double dblIn, LONG *piOut)
 
HRESULT WINAPI VarI4FromCy (CY cyIn, LONG *piOut)
 
HRESULT WINAPI VarI4FromDate (DATE dateIn, LONG *piOut)
 
HRESULT WINAPI VarI4FromStr (const OLECHAR *strIn, LCID lcid, ULONG dwFlags, LONG *piOut)
 
HRESULT WINAPI VarI4FromDisp (IDispatch *pdispIn, LCID lcid, LONG *piOut)
 
HRESULT WINAPI VarI4FromBool (VARIANT_BOOL boolIn, LONG *piOut)
 
HRESULT WINAPI VarI4FromI1 (signed char cIn, LONG *piOut)
 
HRESULT WINAPI VarI4FromUI2 (USHORT usIn, LONG *piOut)
 
HRESULT WINAPI VarI4FromUI4 (ULONG ulIn, LONG *piOut)
 
HRESULT WINAPI VarI4FromDec (const DECIMAL *pdecIn, LONG *piOut)
 
HRESULT WINAPI VarI4FromI8 (LONG64 llIn, LONG *piOut)
 
HRESULT WINAPI VarI4FromUI8 (ULONG64 ullIn, LONG *piOut)
 
HRESULT WINAPI VarUI4FromUI1 (BYTE bIn, ULONG *pulOut)
 
HRESULT WINAPI VarUI4FromI2 (SHORT sIn, ULONG *pulOut)
 
HRESULT WINAPI VarUI4FromI4 (LONG iIn, ULONG *pulOut)
 
HRESULT WINAPI VarUI4FromR4 (FLOAT fltIn, ULONG *pulOut)
 
HRESULT WINAPI VarUI4FromR8 (double dblIn, ULONG *pulOut)
 
HRESULT WINAPI VarUI4FromDate (DATE dateIn, ULONG *pulOut)
 
HRESULT WINAPI VarUI4FromCy (CY cyIn, ULONG *pulOut)
 
HRESULT WINAPI VarUI4FromStr (const OLECHAR *strIn, LCID lcid, ULONG dwFlags, ULONG *pulOut)
 
HRESULT WINAPI VarUI4FromDisp (IDispatch *pdispIn, LCID lcid, ULONG *pulOut)
 
HRESULT WINAPI VarUI4FromBool (VARIANT_BOOL boolIn, ULONG *pulOut)
 
HRESULT WINAPI VarUI4FromI1 (signed char cIn, ULONG *pulOut)
 
HRESULT WINAPI VarUI4FromUI2 (USHORT usIn, ULONG *pulOut)
 
HRESULT WINAPI VarUI4FromDec (const DECIMAL *pdecIn, ULONG *pulOut)
 
HRESULT WINAPI VarUI4FromI8 (LONG64 llIn, ULONG *pulOut)
 
HRESULT WINAPI VarUI4FromUI8 (ULONG64 ullIn, ULONG *pulOut)
 
HRESULT WINAPI VarI8FromUI1 (BYTE bIn, LONG64 *pi64Out)
 
HRESULT WINAPI VarI8FromI2 (SHORT sIn, LONG64 *pi64Out)
 
HRESULT WINAPI VarI8FromR4 (FLOAT fltIn, LONG64 *pi64Out)
 
HRESULT WINAPI VarI8FromR8 (double dblIn, LONG64 *pi64Out)
 
HRESULT WINAPI VarI8FromCy (CY cyIn, LONG64 *pi64Out)
 
HRESULT WINAPI VarI8FromDate (DATE dateIn, LONG64 *pi64Out)
 
HRESULT WINAPI VarI8FromStr (const OLECHAR *strIn, LCID lcid, ULONG dwFlags, LONG64 *pi64Out)
 
HRESULT WINAPI VarI8FromDisp (IDispatch *pdispIn, LCID lcid, LONG64 *pi64Out)
 
HRESULT WINAPI VarI8FromBool (VARIANT_BOOL boolIn, LONG64 *pi64Out)
 
HRESULT WINAPI VarI8FromI1 (signed char cIn, LONG64 *pi64Out)
 
HRESULT WINAPI VarI8FromUI2 (USHORT usIn, LONG64 *pi64Out)
 
HRESULT WINAPI VarI8FromUI4 (ULONG ulIn, LONG64 *pi64Out)
 
HRESULT WINAPI VarI8FromDec (const DECIMAL *pdecIn, LONG64 *pi64Out)
 
HRESULT WINAPI VarI8FromUI8 (ULONG64 ullIn, LONG64 *pi64Out)
 
HRESULT WINAPI VarUI8FromI8 (LONG64 llIn, ULONG64 *pui64Out)
 
HRESULT WINAPI VarUI8FromUI1 (BYTE bIn, ULONG64 *pui64Out)
 
HRESULT WINAPI VarUI8FromI2 (SHORT sIn, ULONG64 *pui64Out)
 
HRESULT WINAPI VarUI8FromR4 (FLOAT fltIn, ULONG64 *pui64Out)
 
HRESULT WINAPI VarUI8FromR8 (double dblIn, ULONG64 *pui64Out)
 
HRESULT WINAPI VarUI8FromCy (CY cyIn, ULONG64 *pui64Out)
 
HRESULT WINAPI VarUI8FromDate (DATE dateIn, ULONG64 *pui64Out)
 
HRESULT WINAPI VarUI8FromStr (const OLECHAR *strIn, LCID lcid, ULONG dwFlags, ULONG64 *pui64Out)
 
HRESULT WINAPI VarUI8FromDisp (IDispatch *pdispIn, LCID lcid, ULONG64 *pui64Out)
 
HRESULT WINAPI VarUI8FromBool (VARIANT_BOOL boolIn, ULONG64 *pui64Out)
 
HRESULT WINAPI VarUI8FromI1 (signed char cIn, ULONG64 *pui64Out)
 
HRESULT WINAPI VarUI8FromUI2 (USHORT usIn, ULONG64 *pui64Out)
 
HRESULT WINAPI VarUI8FromUI4 (ULONG ulIn, ULONG64 *pui64Out)
 
HRESULT WINAPI VarUI8FromDec (const DECIMAL *pdecIn, ULONG64 *pui64Out)
 
HRESULT WINAPI VarR4FromUI1 (BYTE bIn, float *pFltOut)
 
HRESULT WINAPI VarR4FromI2 (SHORT sIn, float *pFltOut)
 
HRESULT WINAPI VarR4FromI4 (LONG lIn, float *pFltOut)
 
HRESULT WINAPI VarR4FromR8 (double dblIn, float *pFltOut)
 
HRESULT WINAPI VarR4FromCy (CY cyIn, float *pFltOut)
 
HRESULT WINAPI VarR4FromDate (DATE dateIn, float *pFltOut)
 
HRESULT WINAPI VarR4FromStr (const OLECHAR *strIn, LCID lcid, ULONG dwFlags, float *pFltOut)
 
HRESULT WINAPI VarR4FromDisp (IDispatch *pdispIn, LCID lcid, float *pFltOut)
 
HRESULT WINAPI VarR4FromBool (VARIANT_BOOL boolIn, float *pFltOut)
 
HRESULT WINAPI VarR4FromI1 (signed char cIn, float *pFltOut)
 
HRESULT WINAPI VarR4FromUI2 (USHORT usIn, float *pFltOut)
 
HRESULT WINAPI VarR4FromUI4 (ULONG ulIn, float *pFltOut)
 
HRESULT WINAPI VarR4FromDec (const DECIMAL *pDecIn, float *pFltOut)
 
HRESULT WINAPI VarR4FromI8 (LONG64 llIn, float *pFltOut)
 
HRESULT WINAPI VarR4FromUI8 (ULONG64 ullIn, float *pFltOut)
 
HRESULT WINAPI VarR4CmpR8 (float fltLeft, double dblRight)
 
HRESULT WINAPI VarR8FromUI1 (BYTE bIn, double *pDblOut)
 
HRESULT WINAPI VarR8FromI2 (SHORT sIn, double *pDblOut)
 
HRESULT WINAPI VarR8FromI4 (LONG lIn, double *pDblOut)
 
HRESULT WINAPI VarR8FromR4 (FLOAT fltIn, double *pDblOut)
 
HRESULT WINAPI VarR8FromCy (CY cyIn, double *pDblOut)
 
HRESULT WINAPI VarR8FromDate (DATE dateIn, double *pDblOut)
 
HRESULT WINAPI VarR8FromStr (const OLECHAR *strIn, LCID lcid, ULONG dwFlags, double *pDblOut)
 
HRESULT WINAPI VarR8FromDisp (IDispatch *pdispIn, LCID lcid, double *pDblOut)
 
HRESULT WINAPI VarR8FromBool (VARIANT_BOOL boolIn, double *pDblOut)
 
HRESULT WINAPI VarR8FromI1 (signed char cIn, double *pDblOut)
 
HRESULT WINAPI VarR8FromUI2 (USHORT usIn, double *pDblOut)
 
HRESULT WINAPI VarR8FromUI4 (ULONG ulIn, double *pDblOut)
 
HRESULT WINAPI VarR8FromDec (const DECIMAL *pDecIn, double *pDblOut)
 
HRESULT WINAPI VarR8FromI8 (LONG64 llIn, double *pDblOut)
 
HRESULT WINAPI VarR8FromUI8 (ULONG64 ullIn, double *pDblOut)
 
HRESULT WINAPI VarR8Pow (double dblLeft, double dblPow, double *pDblOut)
 
HRESULT WINAPI VarR8Round (double dblIn, int nDig, double *pDblOut)
 
HRESULT WINAPI VarCyFromUI1 (BYTE bIn, CY *pCyOut)
 
HRESULT WINAPI VarCyFromI2 (SHORT sIn, CY *pCyOut)
 
HRESULT WINAPI VarCyFromI4 (LONG lIn, CY *pCyOut)
 
HRESULT WINAPI VarCyFromR4 (FLOAT fltIn, CY *pCyOut)
 
HRESULT WINAPI VarCyFromR8 (double dblIn, CY *pCyOut)
 
HRESULT WINAPI VarCyFromDate (DATE dateIn, CY *pCyOut)
 
HRESULT WINAPI VarCyFromStr (const OLECHAR *strIn, LCID lcid, ULONG dwFlags, CY *pCyOut)
 
HRESULT WINAPI VarCyFromDisp (IDispatch *pdispIn, LCID lcid, CY *pCyOut)
 
HRESULT WINAPI VarCyFromBool (VARIANT_BOOL boolIn, CY *pCyOut)
 
HRESULT WINAPI VarCyFromI1 (signed char cIn, CY *pCyOut)
 
HRESULT WINAPI VarCyFromUI2 (USHORT usIn, CY *pCyOut)
 
HRESULT WINAPI VarCyFromUI4 (ULONG ulIn, CY *pCyOut)
 
HRESULT WINAPI VarCyFromDec (const DECIMAL *pdecIn, CY *pCyOut)
 
HRESULT WINAPI VarCyFromI8 (LONG64 llIn, CY *pCyOut)
 
HRESULT WINAPI VarCyFromUI8 (ULONG64 ullIn, CY *pCyOut)
 
HRESULT WINAPI VarCyAdd (CY cyLeft, CY cyRight, CY *pCyOut)
 
HRESULT WINAPI VarCyMul (CY cyLeft, CY cyRight, CY *pCyOut)
 
HRESULT WINAPI VarCyMulI4 (CY cyLeft, LONG lRight, CY *pCyOut)
 
HRESULT WINAPI VarCySub (CY cyLeft, CY cyRight, CY *pCyOut)
 
HRESULT WINAPI VarCyAbs (CY cyIn, CY *pCyOut)
 
HRESULT WINAPI VarCyFix (CY cyIn, CY *pCyOut)
 
HRESULT WINAPI VarCyInt (CY cyIn, CY *pCyOut)
 
HRESULT WINAPI VarCyNeg (CY cyIn, CY *pCyOut)
 
HRESULT WINAPI VarCyRound (CY cyIn, int cDecimals, CY *pCyOut)
 
HRESULT WINAPI VarCyCmp (CY cyLeft, CY cyRight)
 
HRESULT WINAPI VarCyCmpR8 (CY cyLeft, double dblRight)
 
HRESULT WINAPI VarCyMulI8 (CY cyLeft, LONG64 llRight, CY *pCyOut)
 
HRESULT WINAPI VarDecFromUI1 (BYTE bIn, DECIMAL *pDecOut)
 
HRESULT WINAPI VarDecFromI2 (SHORT sIn, DECIMAL *pDecOut)
 
HRESULT WINAPI VarDecFromI4 (LONG lIn, DECIMAL *pDecOut)
 
static HRESULT VARIANT_DI_FromR4 (float source, VARIANT_DI *dest)
 
static HRESULT VARIANT_DI_FromR8 (double source, VARIANT_DI *dest)
 
static void VARIANT_DIFromDec (const DECIMAL *from, VARIANT_DI *to)
 
static void VARIANT_DecFromDI (const VARIANT_DI *from, DECIMAL *to)
 
static unsigned char VARIANT_int_divbychar (DWORD *p, unsigned int n, unsigned char divisor)
 
static BOOL VARIANT_int_iszero (const DWORD *p, unsigned int n)
 
HRESULT WINAPI VarDecFromR4 (FLOAT fltIn, DECIMAL *pDecOut)
 
HRESULT WINAPI VarDecFromR8 (double dblIn, DECIMAL *pDecOut)
 
HRESULT WINAPI VarDecFromDate (DATE dateIn, DECIMAL *pDecOut)
 
HRESULT WINAPI VarDecFromCy (CY cyIn, DECIMAL *pDecOut)
 
HRESULT WINAPI VarDecFromStr (const OLECHAR *strIn, LCID lcid, ULONG dwFlags, DECIMAL *pDecOut)
 
HRESULT WINAPI VarDecFromDisp (IDispatch *pdispIn, LCID lcid, DECIMAL *pDecOut)
 
HRESULT WINAPI VarDecFromBool (VARIANT_BOOL bIn, DECIMAL *pDecOut)
 
HRESULT WINAPI VarDecFromI1 (signed char cIn, DECIMAL *pDecOut)
 
HRESULT WINAPI VarDecFromUI2 (USHORT usIn, DECIMAL *pDecOut)
 
HRESULT WINAPI VarDecFromUI4 (ULONG ulIn, DECIMAL *pDecOut)
 
HRESULT WINAPI VarDecFromI8 (LONG64 llIn, DECIMAL *pDecOut)
 
HRESULT WINAPI VarDecFromUI8 (ULONG64 ullIn, DECIMAL *pDecOut)
 
static HRESULT VARIANT_DecScale (const DECIMAL **ppDecLeft, const DECIMAL **ppDecRight, DECIMAL pDecOut[2])
 
static ULONG VARIANT_Add (ULONG ulLeft, ULONG ulRight, ULONG *pulHigh)
 
static ULONG VARIANT_Sub (ULONG ulLeft, ULONG ulRight, ULONG *pulHigh)
 
static ULONG VARIANT_Mul (ULONG ulLeft, ULONG ulRight, ULONG *pulHigh)
 
static int VARIANT_DecCmp (const DECIMAL *pDecLeft, const DECIMAL *pDecRight)
 
HRESULT WINAPI VarDecAdd (const DECIMAL *pDecLeft, const DECIMAL *pDecRight, DECIMAL *pDecOut)
 
static void VARIANT_DI_clear (VARIANT_DI *i)
 
static int VARIANT_DI_mul (const VARIANT_DI *a, const VARIANT_DI *b, VARIANT_DI *result)
 
static BOOL VARIANT_DI_tostringW (const VARIANT_DI *a, WCHAR *s, unsigned int n)
 
static void VARIANT_int_shiftleft (DWORD *p, unsigned int n, unsigned int shift)
 
static unsigned char VARIANT_int_add (DWORD *v, unsigned int nv, const DWORD *p, unsigned int np)
 
static void VARIANT_int_div (DWORD *p, unsigned int n, const DWORD *divisor, unsigned int dn)
 
static unsigned char VARIANT_int_mulbychar (DWORD *p, unsigned int n, unsigned char m)
 
static int VARIANT_int_addlossy (DWORD *a, int *ascale, unsigned int an, DWORD *b, int *bscale, unsigned int bn)
 
static HRESULT VARIANT_DI_div (const VARIANT_DI *dividend, const VARIANT_DI *divisor, VARIANT_DI *quotient, BOOL round_remainder)
 
static HRESULT VARIANT_DI_normalize (VARIANT_DI *val, int exponent2, BOOL isDouble)
 
static HRESULT VARIANT_do_division (const DECIMAL *pDecLeft, const DECIMAL *pDecRight, DECIMAL *pDecOut, BOOL round)
 
HRESULT WINAPI VarDecDiv (const DECIMAL *pDecLeft, const DECIMAL *pDecRight, DECIMAL *pDecOut)
 
HRESULT WINAPI VarDecMul (const DECIMAL *pDecLeft, const DECIMAL *pDecRight, DECIMAL *pDecOut)
 
HRESULT WINAPI VarDecSub (const DECIMAL *pDecLeft, const DECIMAL *pDecRight, DECIMAL *pDecOut)
 
HRESULT WINAPI VarDecAbs (const DECIMAL *pDecIn, DECIMAL *pDecOut)
 
HRESULT WINAPI VarDecFix (const DECIMAL *pDecIn, DECIMAL *pDecOut)
 
HRESULT WINAPI VarDecInt (const DECIMAL *pDecIn, DECIMAL *pDecOut)
 
HRESULT WINAPI VarDecNeg (const DECIMAL *pDecIn, DECIMAL *pDecOut)
 
HRESULT WINAPI VarDecRound (const DECIMAL *pDecIn, int cDecimals, DECIMAL *pDecOut)
 
HRESULT WINAPI VarDecCmp (const DECIMAL *pDecLeft, const DECIMAL *pDecRight)
 
HRESULT WINAPI VarDecCmpR8 (const DECIMAL *pDecLeft, double dblRight)
 
HRESULT WINAPI VarBoolFromUI1 (BYTE bIn, VARIANT_BOOL *pBoolOut)
 
HRESULT WINAPI VarBoolFromI2 (SHORT sIn, VARIANT_BOOL *pBoolOut)
 
HRESULT WINAPI VarBoolFromI4 (LONG lIn, VARIANT_BOOL *pBoolOut)
 
HRESULT WINAPI VarBoolFromR4 (FLOAT fltIn, VARIANT_BOOL *pBoolOut)
 
HRESULT WINAPI VarBoolFromR8 (double dblIn, VARIANT_BOOL *pBoolOut)
 
HRESULT WINAPI VarBoolFromDate (DATE dateIn, VARIANT_BOOL *pBoolOut)
 
HRESULT WINAPI VarBoolFromCy (CY cyIn, VARIANT_BOOL *pBoolOut)
 
static BOOL VARIANT_GetLocalisedText (LANGID langId, DWORD dwId, WCHAR *lpszDest)
 
HRESULT WINAPI VarBoolFromStr (const OLECHAR *strIn, LCID lcid, ULONG dwFlags, VARIANT_BOOL *pBoolOut)
 
HRESULT WINAPI VarBoolFromDisp (IDispatch *pdispIn, LCID lcid, VARIANT_BOOL *pBoolOut)
 
HRESULT WINAPI VarBoolFromI1 (signed char cIn, VARIANT_BOOL *pBoolOut)
 
HRESULT WINAPI VarBoolFromUI2 (USHORT usIn, VARIANT_BOOL *pBoolOut)
 
HRESULT WINAPI VarBoolFromUI4 (ULONG ulIn, VARIANT_BOOL *pBoolOut)
 
HRESULT WINAPI VarBoolFromDec (const DECIMAL *pDecIn, VARIANT_BOOL *pBoolOut)
 
HRESULT WINAPI VarBoolFromI8 (LONG64 llIn, VARIANT_BOOL *pBoolOut)
 
HRESULT WINAPI VarBoolFromUI8 (ULONG64 ullIn, VARIANT_BOOL *pBoolOut)
 
static WCHARVARIANT_WriteNumber (ULONG64 ulVal, WCHAR *szOut)
 
static BSTR VARIANT_MakeBstr (LCID lcid, DWORD dwFlags, WCHAR *szOut)
 
static HRESULT VARIANT_BstrFromUInt (ULONG64 ulVal, LCID lcid, DWORD dwFlags, BSTR *pbstrOut)
 
HRESULT WINAPI VarBstrFromUI1 (BYTE bIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut)
 
HRESULT WINAPI VarBstrFromI2 (short sIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut)
 
HRESULT WINAPI VarBstrFromI4 (LONG lIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut)
 
static BSTR VARIANT_BstrReplaceDecimal (const WCHAR *buff, LCID lcid, ULONG dwFlags)
 
static HRESULT VARIANT_BstrFromReal (DOUBLE dblIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut, int ndigits)
 
HRESULT WINAPI VarBstrFromR4 (FLOAT fltIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut)
 
HRESULT WINAPI VarBstrFromR8 (double dblIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut)
 
HRESULT WINAPI VarBstrFromCy (CY cyIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut)
 
static int output_int_len (int o, int min_len, WCHAR *date, int date_len)
 
BOOL get_date_format (LCID lcid, DWORD flags, const SYSTEMTIME *st, const WCHAR *fmt, WCHAR *date, int date_len)
 
HRESULT WINAPI VarBstrFromDate (DATE dateIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut)
 
HRESULT WINAPI VarBstrFromBool (VARIANT_BOOL boolIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut)
 
HRESULT WINAPI VarBstrFromI1 (signed char cIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut)
 
HRESULT WINAPI VarBstrFromUI2 (USHORT usIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut)
 
HRESULT WINAPI VarBstrFromUI4 (ULONG ulIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut)
 
HRESULT WINAPI VarBstrFromDec (const DECIMAL *pDecIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut)
 
HRESULT WINAPI VarBstrFromI8 (LONG64 llIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut)
 
HRESULT WINAPI VarBstrFromUI8 (ULONG64 ullIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut)
 
HRESULT WINAPI VarBstrFromDisp (IDispatch *pdispIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut)
 
HRESULT WINAPI VarBstrCat (BSTR pbstrLeft, BSTR pbstrRight, BSTR *pbstrOut)
 
HRESULT WINAPI VarBstrCmp (BSTR pbstrLeft, BSTR pbstrRight, LCID lcid, DWORD dwFlags)
 
HRESULT WINAPI VarDateFromUI1 (BYTE bIn, DATE *pdateOut)
 
HRESULT WINAPI VarDateFromI2 (short sIn, DATE *pdateOut)
 
HRESULT WINAPI VarDateFromI4 (LONG lIn, DATE *pdateOut)
 
HRESULT WINAPI VarDateFromR4 (FLOAT fltIn, DATE *pdateOut)
 
HRESULT WINAPI VarDateFromR8 (double dblIn, DATE *pdateOut)
 
HRESULT WINAPI VarDateFromDisp (IDispatch *pdispIn, LCID lcid, DATE *pdateOut)
 
HRESULT WINAPI VarDateFromBool (VARIANT_BOOL boolIn, DATE *pdateOut)
 
HRESULT WINAPI VarDateFromCy (CY cyIn, DATE *pdateOut)
 
static BOOL VARIANT_IsValidMonthDay (DWORD day, DWORD month, DWORD year)
 
static HRESULT VARIANT_MakeDate (DATEPARSE *dp, DWORD iDate, DWORD offset, SYSTEMTIME *st)
 
HRESULT WINAPI VarDateFromStr (const OLECHAR *strIn, LCID lcid, ULONG dwFlags, DATE *pdateOut)
 
HRESULT WINAPI VarDateFromI1 (signed char cIn, DATE *pdateOut)
 
HRESULT WINAPI VarDateFromUI2 (USHORT uiIn, DATE *pdateOut)
 
HRESULT WINAPI VarDateFromUI4 (ULONG ulIn, DATE *pdateOut)
 
HRESULT WINAPI VarDateFromDec (const DECIMAL *pdecIn, DATE *pdateOut)
 
HRESULT WINAPI VarDateFromI8 (LONG64 llIn, DATE *pdateOut)
 
HRESULT WINAPI VarDateFromUI8 (ULONG64 ullIn, DATE *pdateOut)
 

Variables

HMODULE hProxyDll
 
static const int CY_Divisors [5]
 

Macro Definition Documentation

◆ BOTHTST

#define BOTHTST (   dest,
  src,
  func,
  lo,
  hi 
)
Value:
if (in < (dest)lo || in > hi) { return DISP_E_OVERFLOW; } *out = in; return S_OK; }
#define RETTYP
Definition: vartype.c:140
#define _(op)
Definition: opcodes.c:24
GLenum func
Definition: glext.h:6028
GLenum src
Definition: glext.h:6340
GLuint in
Definition: glext.h:9616
#define S_OK
Definition: intsafe.h:52
static char * dest
Definition: rtl.c:149
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
#define DISP_E_OVERFLOW
Definition: winerror.h:3622

Definition at line 156 of file vartype.c.

◆ COBJMACROS

#define COBJMACROS

Definition at line 21 of file vartype.c.

◆ CY_HALF

#define CY_HALF   (CY_MULTIPLIER/2) /* 0.5 */

Definition at line 37 of file vartype.c.

◆ CY_HALF_F

#define CY_HALF_F   (CY_MULTIPLIER_F/2.0)

Definition at line 38 of file vartype.c.

◆ CY_MULTIPLIER

#define CY_MULTIPLIER   10000 /* 4 dp of precision */

Definition at line 35 of file vartype.c.

◆ CY_MULTIPLIER_F

#define CY_MULTIPLIER_F   10000.0

Definition at line 36 of file vartype.c.

◆ DATE_SWAP

#define DATE_SWAP (   x,
  y 
)    do { dwTemp = x; x = y; y = dwTemp; } while (0)

◆ DP_AM

#define DP_AM   0x08 /* AM */

Definition at line 7419 of file vartype.c.

◆ DP_DATESEP

#define DP_DATESEP   0x02 /* Date separator */

Definition at line 7417 of file vartype.c.

◆ DP_MONTH

#define DP_MONTH   0x04 /* Month name */

Definition at line 7418 of file vartype.c.

◆ DP_PM

#define DP_PM   0x10 /* PM */

Definition at line 7420 of file vartype.c.

◆ DP_TIMESEP

#define DP_TIMESEP   0x01 /* Time separator ( _must_ remain 0x1, used as a bitmask) */

Definition at line 7416 of file vartype.c.

◆ IsLeapYear

#define IsLeapYear (   y)    (((y % 4) == 0) && (((y % 100) != 0) || ((y % 400) == 0)))

Definition at line 7432 of file vartype.c.

◆ NEGTST

#define NEGTST (   dest,
  src,
  func 
)
Value:
if (in < 0) { return DISP_E_OVERFLOW; } *out = in; return S_OK; }

Definition at line 148 of file vartype.c.

◆ ORDER_DMY

#define ORDER_DMY   0x08

Definition at line 7451 of file vartype.c.

◆ ORDER_MDY

#define ORDER_MDY   0x01

Definition at line 7448 of file vartype.c.

◆ ORDER_MYD

#define ORDER_MYD   0x10 /* Synthetic order, used only for funky 2 digit dates */

Definition at line 7452 of file vartype.c.

◆ ORDER_YDM

#define ORDER_YDM   0x04

Definition at line 7450 of file vartype.c.

◆ ORDER_YMD

#define ORDER_YMD   0x02

Definition at line 7449 of file vartype.c.

◆ POSTST

#define POSTST (   dest,
  src,
  func,
  tst 
)
Value:
if (in > (dest)tst) { return DISP_E_OVERFLOW; } *out = in; return S_OK; }

Definition at line 152 of file vartype.c.

◆ RETTYP

#define RETTYP   static inline HRESULT

Definition at line 140 of file vartype.c.

◆ SIMPLE

#define SIMPLE (   dest,
  src,
  func 
)
Value:
*out = in; return S_OK; }

Definition at line 144 of file vartype.c.

◆ TIMEFLAG

#define TIMEFLAG (   i)    ((dp.dwFlags[i] & DP_TIMESEP) << i)

Definition at line 7430 of file vartype.c.

◆ VARIANT_DutchRound

#define VARIANT_DutchRound (   typ,
  value,
  res 
)
Value:
do { \
double whole = value < 0 ? ceil(value) : floor(value); \
double fract = value - whole; \
if (fract > 0.5) res = (typ)whole + (typ)1; \
else if (fract == 0.5) { typ is_odd = (typ)whole & 1; res = whole + is_odd; } \
else if (fract >= 0.0) res = (typ)whole; \
else if (fract == -0.5) { typ is_odd = (typ)whole & 1; res = whole - is_odd; } \
else if (fract > -0.5) res = (typ)whole; \
else res = (typ)whole - (typ)1; \
} while(0)
_ACRTIMP double __cdecl ceil(double)
Definition: ceil.c:18
_ACRTIMP double __cdecl floor(double)
Definition: floor.c:18
GLuint res
Definition: glext.h:9613
if(dx< 0)
Definition: linetemp.h:194
else
Definition: tritemp.h:161
Definition: pdh_main.c:96

Definition at line 71 of file vartype.c.

Typedef Documentation

◆ DATEPARSE

◆ VARIANT_DI

Function Documentation

◆ _VarR8FromCy()

RETTYP _VarR8FromCy ( CY  i,
double o 
)

Definition at line 249 of file vartype.c.

249{ *o = (double)i.int64 / CY_MULTIPLIER_F; return S_OK; }
#define CY_MULTIPLIER_F
Definition: vartype.c:36
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static const char mbstate_t *static wchar_t const char mbstate_t *static const wchar_t int *static double
Definition: string.c:91

Referenced by VarCyAdd(), VarCyMul(), VarCyMulI4(), VarCyMulI8(), VarCyRound(), VarCySub(), and VarR8FromCy().

◆ get_date_format()

BOOL get_date_format ( LCID  lcid,
DWORD  flags,
const SYSTEMTIME st,
const WCHAR fmt,
WCHAR date,
int  date_len 
)

Definition at line 6729 of file vartype.c.

6731{
6732 static const LCTYPE dayname[] = {
6735 };
6736 static const LCTYPE sdayname[] = {
6740 };
6741 static const LCTYPE monthname[] = {
6745 };
6746 static const LCTYPE smonthname[] = {
6751 };
6752
6754 FIXME("ignoring flags %lx\n", flags);
6756
6757 while(*fmt && date_len) {
6758 int count = 1;
6759
6760 switch(*fmt) {
6761 case 'd':
6762 case 'M':
6763 case 'y':
6764 case 'g':
6765 while(*fmt == *(fmt+count))
6766 count++;
6767 fmt += count-1;
6768 }
6769
6770 switch(*fmt) {
6771 case 'd':
6772 if(count >= 4)
6773 count = GetLocaleInfoW(lcid, dayname[st->wDayOfWeek] | flags, date, date_len)-1;
6774 else if(count == 3)
6775 count = GetLocaleInfoW(lcid, sdayname[st->wDayOfWeek] | flags, date, date_len)-1;
6776 else
6777 count = output_int_len(st->wDay, count, date, date_len);
6778 break;
6779 case 'M':
6780 if(count >= 4)
6781 count = GetLocaleInfoW(lcid, monthname[st->wMonth-1] | flags, date, date_len)-1;
6782 else if(count == 3)
6783 count = GetLocaleInfoW(lcid, smonthname[st->wMonth-1] | flags, date, date_len)-1;
6784 else
6785 count = output_int_len(st->wMonth, count, date, date_len);
6786 break;
6787 case 'y':
6788 if(count >= 3)
6789 count = output_int_len(st->wYear, 0, date, date_len);
6790 else
6791 count = output_int_len(st->wYear%100, count, date, date_len);
6792 break;
6793 case 'g':
6794 if(count == 2) {
6795 FIXME("Should be using GetCalendarInfo(CAL_SERASTRING), defaulting to 'AD'\n");
6796
6797 *date++ = 'A';
6798 date_len--;
6799 if(date_len)
6800 *date = 'D';
6801 else
6802 count = -1;
6803 break;
6804 }
6805 /* fall through */
6806 default:
6807 *date = *fmt;
6808 }
6809
6810 if(count < 0)
6811 break;
6812 fmt++;
6813 date += count;
6814 date_len -= count;
6815 }
6816
6817 if(!date_len)
6818 return FALSE;
6819 *date++ = 0;
6820 return TRUE;
6821}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
INT WINAPI GetLocaleInfoW(LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len)
Definition: locale.c:1675
LCID lcid
Definition: locale.c:5660
static int output_int_len(int o, int min_len, WCHAR *date, int date_len)
Definition: vartype.c:6709
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLbitfield flags
Definition: glext.h:7161
__u16 date
Definition: mkdosfs.c:8
#define VAR_DATEVALUEONLY
Definition: oleauto.h:327
WORD wDayOfWeek
Definition: minwinbase.h:258
Definition: dsound.c:943
#define LOCALE_SABBREVMONTHNAME10
Definition: winnls.h:123
#define LOCALE_SMONTHNAME12
Definition: winnls.h:112
#define LOCALE_SMONTHNAME5
Definition: winnls.h:105
#define LOCALE_SDAYNAME5
Definition: winnls.h:91
#define LOCALE_SABBREVMONTHNAME9
Definition: winnls.h:122
#define LOCALE_SABBREVMONTHNAME11
Definition: winnls.h:124
#define LOCALE_SABBREVDAYNAME5
Definition: winnls.h:98
#define LOCALE_SABBREVDAYNAME2
Definition: winnls.h:95
#define LOCALE_SABBREVMONTHNAME2
Definition: winnls.h:115
#define LOCALE_SMONTHNAME3
Definition: winnls.h:103
#define LOCALE_SMONTHNAME11
Definition: winnls.h:111
#define LOCALE_SMONTHNAME8
Definition: winnls.h:108
#define LOCALE_SMONTHNAME4
Definition: winnls.h:104
#define LOCALE_SDAYNAME1
Definition: winnls.h:87
#define LOCALE_SMONTHNAME7
Definition: winnls.h:107
#define LOCALE_SABBREVMONTHNAME4
Definition: winnls.h:117
#define LOCALE_SABBREVDAYNAME4
Definition: winnls.h:97
#define LOCALE_SMONTHNAME1
Definition: winnls.h:101
#define LOCALE_SABBREVMONTHNAME3
Definition: winnls.h:116
#define LOCALE_SDAYNAME7
Definition: winnls.h:93
#define LOCALE_SDAYNAME2
Definition: winnls.h:88
#define LOCALE_SABBREVMONTHNAME1
Definition: winnls.h:114
#define LOCALE_NOUSEROVERRIDE
Definition: winnls.h:19
#define LOCALE_SABBREVDAYNAME6
Definition: winnls.h:99
#define LOCALE_SMONTHNAME2
Definition: winnls.h:102
#define LOCALE_SABBREVDAYNAME1
Definition: winnls.h:94
#define LOCALE_SABBREVMONTHNAME6
Definition: winnls.h:119
#define LOCALE_SMONTHNAME6
Definition: winnls.h:106
DWORD LCTYPE
Definition: winnls.h:592
#define LOCALE_SDAYNAME3
Definition: winnls.h:89
#define LOCALE_SABBREVDAYNAME3
Definition: winnls.h:96
#define LOCALE_SABBREVMONTHNAME5
Definition: winnls.h:118
#define LOCALE_SABBREVMONTHNAME7
Definition: winnls.h:120
#define LOCALE_SABBREVMONTHNAME8
Definition: winnls.h:121
#define LOCALE_SDAYNAME4
Definition: winnls.h:90
#define LOCALE_SMONTHNAME10
Definition: winnls.h:110
#define LOCALE_SMONTHNAME9
Definition: winnls.h:109
#define LOCALE_SABBREVMONTHNAME12
Definition: winnls.h:125
#define LOCALE_SDAYNAME6
Definition: winnls.h:92
#define LOCALE_SABBREVDAYNAME7
Definition: winnls.h:100

Referenced by VarBstrFromDate().

◆ output_int_len()

static int output_int_len ( int  o,
int  min_len,
WCHAR date,
int  date_len 
)
inlinestatic

Definition at line 6709 of file vartype.c.

6710{
6711 int len, tmp;
6712
6713 if(min_len >= date_len)
6714 return -1;
6715
6716 for(len=0, tmp=o; tmp; tmp/=10) len++;
6717 if(!len) len++;
6718 if(len >= date_len)
6719 return -1;
6720
6721 for(tmp=min_len-len; tmp>0; tmp--)
6722 *date++ = '0';
6723 for(tmp=len; tmp>0; tmp--, o/=10)
6724 date[tmp-1] = '0' + o%10;
6725 return min_len>len ? min_len : len;
6726}
GLenum GLsizei len
Definition: glext.h:6722

Referenced by get_date_format().

◆ VarBoolFromCy()

HRESULT WINAPI VarBoolFromCy ( CY  cyIn,
VARIANT_BOOL pBoolOut 
)

Definition at line 6073 of file vartype.c.

6074{
6075 *pBoolOut = cyIn.int64 ? VARIANT_TRUE : VARIANT_FALSE;
6076 return S_OK;
6077}
LONGLONG int64
Definition: compat.h:2265

Referenced by test_VarBoolFromCy(), and VARIANT_Coerce().

◆ VarBoolFromDate()

HRESULT WINAPI VarBoolFromDate ( DATE  dateIn,
VARIANT_BOOL pBoolOut 
)

Definition at line 6055 of file vartype.c.

6056{
6057 *pBoolOut = dateIn ? VARIANT_TRUE : VARIANT_FALSE;
6058 return S_OK;
6059}

Referenced by test_VarBoolFromDate(), and VARIANT_Coerce().

◆ VarBoolFromDec()

HRESULT WINAPI VarBoolFromDec ( const DECIMAL pDecIn,
VARIANT_BOOL pBoolOut 
)

Definition at line 6300 of file vartype.c.

6301{
6302 if (pDecIn->scale > DEC_MAX_SCALE || (pDecIn->sign & ~DECIMAL_NEG))
6303 return E_INVALIDARG;
6304
6305 if (pDecIn->Hi32 || pDecIn->Lo64)
6306 *pBoolOut = VARIANT_TRUE;
6307 else
6308 *pBoolOut = VARIANT_FALSE;
6309 return S_OK;
6310}
#define E_INVALIDARG
Definition: ddrawi.h:101
ULONG Hi32
Definition: compat.h:2276
BYTE sign
Definition: compat.h:2272
BYTE scale
Definition: compat.h:2271
ULONGLONG Lo64
Definition: compat.h:2287
#define DEC_MAX_SCALE
Definition: variant.h:77

Referenced by test_VarBoolFromDec(), and VARIANT_Coerce().

◆ VarBoolFromDisp()

HRESULT WINAPI VarBoolFromDisp ( IDispatch pdispIn,
LCID  lcid,
VARIANT_BOOL pBoolOut 
)

Definition at line 6228 of file vartype.c.

6229{
6230 return VARIANT_FromDisp(pdispIn, lcid, pBoolOut, VT_BOOL, 0);
6231}
@ VT_BOOL
Definition: compat.h:2306
static HRESULT VARIANT_FromDisp(IDispatch *pdispIn, LCID lcid, void *pOut, VARTYPE vt, DWORD dwFlags)
Definition: vartype.c:109

Referenced by VARIANT_Coerce().

◆ VarBoolFromI1()

HRESULT WINAPI VarBoolFromI1 ( signed char  cIn,
VARIANT_BOOL pBoolOut 
)

Definition at line 6245 of file vartype.c.

6246{
6247 *pBoolOut = cIn ? VARIANT_TRUE : VARIANT_FALSE;
6248 return S_OK;
6249}

Referenced by test_VarBoolFromI1(), and VARIANT_Coerce().

◆ VarBoolFromI2()

HRESULT WINAPI VarBoolFromI2 ( SHORT  sIn,
VARIANT_BOOL pBoolOut 
)

Definition at line 5983 of file vartype.c.

5984{
5985 *pBoolOut = sIn ? VARIANT_TRUE : VARIANT_FALSE;
5986 return S_OK;
5987}

Referenced by test_VarBoolFromI2(), and VARIANT_Coerce().

◆ VarBoolFromI4()

HRESULT WINAPI VarBoolFromI4 ( LONG  lIn,
VARIANT_BOOL pBoolOut 
)

Definition at line 6001 of file vartype.c.

6002{
6003 *pBoolOut = lIn ? VARIANT_TRUE : VARIANT_FALSE;
6004 return S_OK;
6005}

Referenced by test_VarBoolFromI4(), test_VarBoolFromUI4(), and VARIANT_Coerce().

◆ VarBoolFromI8()

HRESULT WINAPI VarBoolFromI8 ( LONG64  llIn,
VARIANT_BOOL pBoolOut 
)

Definition at line 6324 of file vartype.c.

6325{
6326 *pBoolOut = llIn ? VARIANT_TRUE : VARIANT_FALSE;
6327 return S_OK;
6328}

Referenced by test_VarBoolFromI8(), and VARIANT_Coerce().

◆ VarBoolFromR4()

HRESULT WINAPI VarBoolFromR4 ( FLOAT  fltIn,
VARIANT_BOOL pBoolOut 
)

Definition at line 6019 of file vartype.c.

6020{
6021 *pBoolOut = fltIn ? VARIANT_TRUE : VARIANT_FALSE;
6022 return S_OK;
6023}

Referenced by test_VarBoolFromR4(), and VARIANT_Coerce().

◆ VarBoolFromR8()

HRESULT WINAPI VarBoolFromR8 ( double  dblIn,
VARIANT_BOOL pBoolOut 
)

Definition at line 6037 of file vartype.c.

6038{
6039 *pBoolOut = dblIn ? VARIANT_TRUE : VARIANT_FALSE;
6040 return S_OK;
6041}

Referenced by test_VarBoolFromR8(), and VARIANT_Coerce().

◆ VarBoolFromStr()

HRESULT WINAPI VarBoolFromStr ( const OLECHAR strIn,
LCID  lcid,
ULONG  dwFlags,
VARIANT_BOOL pBoolOut 
)

Definition at line 6139 of file vartype.c.

6140{
6141 WCHAR szBuff[64];
6143 HRESULT hRes = S_OK;
6144
6145 if (!strIn || !pBoolOut)
6146 return DISP_E_TYPEMISMATCH;
6147
6148 /* Check if we should be comparing against localised text */
6149 if (dwFlags & VAR_LOCALBOOL)
6150 {
6151 /* Convert our LCID into a usable value */
6153
6154 langId = LANGIDFROMLCID(lcid);
6155
6156 if (PRIMARYLANGID(langId) == LANG_NEUTRAL)
6158
6159 /* Note: Native oleaut32 always copies strIn and maps halfwidth characters.
6160 * I don't think this is needed unless any of the localised text strings
6161 * contain characters that can be so mapped. In the event that this is
6162 * true for a given language (possibly some Asian languages), then strIn
6163 * should be mapped here _only_ if langId is an Id for which this can occur.
6164 */
6165 }
6166
6167 /* Note that if we are not comparing against localised strings, langId
6168 * will have its default value of LANG_ENGLISH. This allows us to mimic
6169 * the native behaviour of always checking against English strings even
6170 * after we've checked for localised ones.
6171 */
6172VarBoolFromStr_CheckLocalised:
6173 if (VARIANT_GetLocalisedText(langId, IDS_TRUE, szBuff))
6174 {
6175 /* Compare against localised strings, ignoring case */
6176 if (!wcsicmp(strIn, szBuff))
6177 {
6178 *pBoolOut = VARIANT_TRUE; /* Matched localised 'true' text */
6179 return hRes;
6180 }
6181 VARIANT_GetLocalisedText(langId, IDS_FALSE, szBuff);
6182 if (!wcsicmp(strIn, szBuff))
6183 {
6184 *pBoolOut = VARIANT_FALSE; /* Matched localised 'false' text */
6185 return hRes;
6186 }
6187 }
6188
6189 if (langId != MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT))
6190 {
6191 /* We have checked the localised text, now check English */
6193 goto VarBoolFromStr_CheckLocalised;
6194 }
6195
6196 /* All checks against localised text have failed, try #TRUE#/#FALSE# */
6197 if (!wcscmp(strIn, L"#FALSE#"))
6198 *pBoolOut = VARIANT_FALSE;
6199 else if (!wcscmp(strIn, L"#TRUE#"))
6200 *pBoolOut = VARIANT_TRUE;
6201 else
6202 {
6203 double d;
6204
6205 /* If this string is a number, convert it as one */
6206 hRes = VarR8FromStr(strIn, lcid, dwFlags, &d);
6207 if (SUCCEEDED(hRes)) *pBoolOut = d ? VARIANT_TRUE : VARIANT_FALSE;
6208 }
6209 return hRes;
6210}
#define wcsicmp
Definition: compat.h:15
LCID WINAPI ConvertDefaultLocale(LCID lcid)
Definition: locale.c:2879
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1977
#define IDS_TRUE
Definition: resource.h:26
#define IDS_FALSE
Definition: resource.h:27
HRESULT WINAPI VarR8FromStr(const OLECHAR *strIn, LCID lcid, ULONG dwFlags, double *pDblOut)
Definition: vartype.c:3145
static BOOL VARIANT_GetLocalisedText(LANGID langId, DWORD dwId, WCHAR *lpszDest)
Definition: vartype.c:6085
#define L(x)
Definition: resources.c:13
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define d
Definition: ke_i.h:81
USHORT LANGID
Definition: mui.h:9
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define VAR_LOCALBOOL
Definition: oleauto.h:330
short WCHAR
Definition: pedump.c:58
#define LANG_NEUTRAL
Definition: nls.h:22
#define MAKELANGID(p, s)
Definition: nls.h:15
#define LANG_ENGLISH
Definition: nls.h:52
#define LANGIDFROMLCID(l)
Definition: nls.h:18
#define SUBLANG_DEFAULT
Definition: nls.h:168
#define PRIMARYLANGID(l)
Definition: nls.h:16
#define DISP_E_TYPEMISMATCH
Definition: winerror.h:3617

Referenced by test_VarBoolFromStr(), VarAnd(), VARIANT_Coerce(), VarImp(), VarNot(), and VarOr().

◆ VarBoolFromUI1()

HRESULT WINAPI VarBoolFromUI1 ( BYTE  bIn,
VARIANT_BOOL pBoolOut 
)

Definition at line 5965 of file vartype.c.

5966{
5967 *pBoolOut = bIn ? VARIANT_TRUE : VARIANT_FALSE;
5968 return S_OK;
5969}

Referenced by test_VarBoolFromUI1(), and VARIANT_Coerce().

◆ VarBoolFromUI2()

HRESULT WINAPI VarBoolFromUI2 ( USHORT  usIn,
VARIANT_BOOL pBoolOut 
)

Definition at line 6263 of file vartype.c.

6264{
6265 *pBoolOut = usIn ? VARIANT_TRUE : VARIANT_FALSE;
6266 return S_OK;
6267}

Referenced by test_VarBoolFromUI2(), and VARIANT_Coerce().

◆ VarBoolFromUI4()

HRESULT WINAPI VarBoolFromUI4 ( ULONG  ulIn,
VARIANT_BOOL pBoolOut 
)

Definition at line 6281 of file vartype.c.

6282{
6283 *pBoolOut = ulIn ? VARIANT_TRUE : VARIANT_FALSE;
6284 return S_OK;
6285}

Referenced by VARIANT_Coerce().

◆ VarBoolFromUI8()

HRESULT WINAPI VarBoolFromUI8 ( ULONG64  ullIn,
VARIANT_BOOL pBoolOut 
)

Definition at line 6342 of file vartype.c.

6343{
6344 *pBoolOut = ullIn ? VARIANT_TRUE : VARIANT_FALSE;
6345 return S_OK;
6346}

Referenced by test_VarBoolFromUI8(), and VARIANT_Coerce().

◆ VarBstrCat()

HRESULT WINAPI VarBstrCat ( BSTR  pbstrLeft,
BSTR  pbstrRight,
BSTR pbstrOut 
)

Definition at line 7168 of file vartype.c.

7169{
7170 unsigned int lenLeft, lenRight;
7171
7172 TRACE("%s,%s,%p\n",
7173 debugstr_wn(pbstrLeft, SysStringLen(pbstrLeft)),
7174 debugstr_wn(pbstrRight, SysStringLen(pbstrRight)), pbstrOut);
7175
7176 if (!pbstrOut)
7177 return E_INVALIDARG;
7178
7179 /* use byte length here to properly handle ansi-allocated BSTRs */
7180 lenLeft = pbstrLeft ? SysStringByteLen(pbstrLeft) : 0;
7181 lenRight = pbstrRight ? SysStringByteLen(pbstrRight) : 0;
7182
7183 *pbstrOut = SysAllocStringByteLen(NULL, lenLeft + lenRight);
7184 if (!*pbstrOut)
7185 return E_OUTOFMEMORY;
7186
7187 (*pbstrOut)[0] = '\0';
7188
7189 if (pbstrLeft)
7190 memcpy(*pbstrOut, pbstrLeft, lenLeft);
7191
7192 if (pbstrRight)
7193 memcpy((CHAR*)*pbstrOut + lenLeft, pbstrRight, lenRight);
7194
7195 TRACE("%s\n", debugstr_wn(*pbstrOut, SysStringLen(*pbstrOut)));
7196 return S_OK;
7197}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define NULL
Definition: types.h:112
#define debugstr_wn
Definition: kernel32.h:33
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
UINT WINAPI SysStringByteLen(BSTR str)
Definition: oleaut.c:217
UINT WINAPI SysStringLen(BSTR str)
Definition: oleaut.c:198
BSTR WINAPI DECLSPEC_HOTPATCH SysAllocStringByteLen(LPCSTR str, UINT len)
Definition: oleaut.c:430
char CHAR
Definition: pedump.c:57
#define TRACE(s)
Definition: solgame.cpp:4

Referenced by test_VarBstrCat(), VarAdd(), and VarCat().

◆ VarBstrCmp()

HRESULT WINAPI VarBstrCmp ( BSTR  pbstrLeft,
BSTR  pbstrRight,
LCID  lcid,
DWORD  dwFlags 
)

Definition at line 7219 of file vartype.c.

7220{
7221 HRESULT hres;
7222 int ret;
7223
7224 TRACE("%s, %s, %#lx, %#lx.\n",
7225 debugstr_wn(pbstrLeft, SysStringLen(pbstrLeft)),
7226 debugstr_wn(pbstrRight, SysStringLen(pbstrRight)), lcid, dwFlags);
7227
7228 if (!pbstrLeft || !*pbstrLeft)
7229 {
7230 if (pbstrRight && *pbstrRight)
7231 return VARCMP_LT;
7232 }
7233 else if (!pbstrRight || !*pbstrRight)
7234 return VARCMP_GT;
7235
7236 if (lcid == 0)
7237 {
7238 unsigned int lenLeft = SysStringByteLen(pbstrLeft);
7239 unsigned int lenRight = SysStringByteLen(pbstrRight);
7240 ret = memcmp(pbstrLeft, pbstrRight, min(lenLeft, lenRight));
7241 if (ret < 0)
7242 return VARCMP_LT;
7243 if (ret > 0)
7244 return VARCMP_GT;
7245 if (lenLeft < lenRight)
7246 return VARCMP_LT;
7247 if (lenLeft > lenRight)
7248 return VARCMP_GT;
7249 return VARCMP_EQ;
7250 }
7251 else
7252 {
7253 unsigned int lenLeft = SysStringLen(pbstrLeft);
7254 unsigned int lenRight = SysStringLen(pbstrRight);
7255
7256 if (lenLeft == 0 || lenRight == 0)
7257 {
7258 if (lenLeft == 0 && lenRight == 0) return VARCMP_EQ;
7259 return lenLeft < lenRight ? VARCMP_LT : VARCMP_GT;
7260 }
7261
7262 hres = CompareStringW(lcid, dwFlags, pbstrLeft, lenLeft,
7263 pbstrRight, lenRight) - CSTR_LESS_THAN;
7264 TRACE("%ld\n", hres);
7265 return hres;
7266 }
7267}
INT WINAPI CompareStringW(LCID lcid, DWORD flags, LPCWSTR str1, INT len1, LPCWSTR str2, INT len2)
Definition: locale.c:3946
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807
return ret
Definition: mutex.c:146
HRESULT hres
Definition: protocol.c:465
#define min(a, b)
Definition: monoChain.cc:55
#define VARCMP_LT
Definition: oleauto.h:657
#define VARCMP_EQ
Definition: oleauto.h:658
#define VARCMP_GT
Definition: oleauto.h:659
#define CSTR_LESS_THAN
Definition: winnls.h:507

Referenced by test_marshal_LPSAFEARRAY(), test_VarWeekdayName(), and VarCmp().

◆ VarBstrFromBool()

HRESULT WINAPI VarBstrFromBool ( VARIANT_BOOL  boolIn,
LCID  lcid,
ULONG  dwFlags,
BSTR pbstrOut 
)

Definition at line 6913 of file vartype.c.

6914{
6915 WCHAR szBuff[64];
6916 DWORD dwResId = IDS_TRUE;
6917 LANGID langId;
6918
6919 TRACE("%d, %#lx, %#lx, %p.\n", boolIn, lcid, dwFlags, pbstrOut);
6920
6921 if (!pbstrOut)
6922 return E_INVALIDARG;
6923
6924 /* VAR_BOOLONOFF and VAR_BOOLYESNO are internal flags used
6925 * for variant formatting */
6927 {
6928 case VAR_BOOLONOFF:
6929 dwResId = IDS_ON;
6930 break;
6931 case VAR_BOOLYESNO:
6932 dwResId = IDS_YES;
6933 break;
6934 case VAR_LOCALBOOL:
6935 break;
6936 default:
6938 }
6939
6941 langId = LANGIDFROMLCID(lcid);
6942 if (PRIMARYLANGID(langId) == LANG_NEUTRAL)
6944
6945 if (boolIn == VARIANT_FALSE)
6946 dwResId++; /* Use negative form */
6947
6948VarBstrFromBool_GetLocalised:
6949 if (VARIANT_GetLocalisedText(langId, dwResId, szBuff))
6950 {
6951 *pbstrOut = SysAllocString(szBuff);
6952 return *pbstrOut ? S_OK : E_OUTOFMEMORY;
6953 }
6954
6955 if (langId != MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT))
6956 {
6958 goto VarBstrFromBool_GetLocalised;
6959 }
6960
6961 /* Should never get here */
6962 WARN("Failed to load bool text!\n");
6963 return E_OUTOFMEMORY;
6964}
#define IDS_YES
Definition: resource.h:16
#define WARN(fmt,...)
Definition: precomp.h:61
#define IDS_ON
Definition: resource.h:30
unsigned long DWORD
Definition: ntddk_ex.h:95
#define SORT_DEFAULT
#define MAKELCID(lgid, srtid)
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:240
#define VAR_BOOLONOFF
Definition: variant.h:80
#define VAR_BOOLYESNO
Definition: variant.h:81

Referenced by init(), VARIANT_Coerce(), and VARIANT_FormatNumber().

◆ VarBstrFromCy()

HRESULT WINAPI VarBstrFromCy ( CY  cyIn,
LCID  lcid,
ULONG  dwFlags,
BSTR pbstrOut 
)

Definition at line 6669 of file vartype.c.

6670{
6671 WCHAR buff[256];
6672 VARIANT_DI decVal;
6673
6674 if (!pbstrOut)
6675 return E_INVALIDARG;
6676
6677 decVal.scale = 4;
6678 decVal.sign = 0;
6679 decVal.bitsnum[0] = cyIn.Lo;
6680 decVal.bitsnum[1] = cyIn.Hi;
6681 if (cyIn.Hi & 0x80000000UL) {
6682 DWORD one = 1;
6683
6684 /* Negative number! */
6685 decVal.sign = 1;
6686 decVal.bitsnum[0] = ~decVal.bitsnum[0];
6687 decVal.bitsnum[1] = ~decVal.bitsnum[1];
6688 VARIANT_int_add(decVal.bitsnum, 3, &one, 1);
6689 }
6690 decVal.bitsnum[2] = 0;
6692
6693 if (dwFlags & LOCALE_USE_NLS)
6694 {
6695 WCHAR cybuff[256];
6696
6697 /* Format the currency for the locale */
6698 cybuff[0] = '\0';
6700 buff, NULL, cybuff, ARRAY_SIZE(cybuff));
6701 *pbstrOut = SysAllocString(cybuff);
6702 }
6703 else
6705
6706 return *pbstrOut ? S_OK : E_OUTOFMEMORY;
6707}
#define ARRAY_SIZE(A)
Definition: main.h:20
static BSTR VARIANT_BstrReplaceDecimal(const WCHAR *buff, LCID lcid, ULONG dwFlags)
Definition: vartype.c:6479
static unsigned char VARIANT_int_add(DWORD *v, unsigned int nv, const DWORD *p, unsigned int np)
Definition: vartype.c:4957
static BOOL VARIANT_DI_tostringW(const VARIANT_DI *a, WCHAR *s, unsigned int n)
Definition: vartype.c:4850
INT WINAPI GetCurrencyFormatW(LCID lcid, DWORD dwFlags, LPCWSTR lpszValue, const CURRENCYFMTW *lpFormat, LPWSTR lpCurrencyStr, int cchOut)
Definition: lcformat.c:1401
#define LOCALE_USE_NLS
Definition: oleauto.h:338
int one
Definition: sehframes.cpp:28
static const char *static const char const char DWORD void DWORD *static const char const char DWORD void DWORD *static const char DWORD DWORD void * buff
Definition: shcore.c:41
unsigned int sign
Definition: vartype.c:4151
DWORD bitsnum[3]
Definition: vartype.c:4149
unsigned char scale
Definition: vartype.c:4150
ULONG Lo
Definition: compat.h:2261
LONG Hi
Definition: compat.h:2262

Referenced by _BSTR_CY(), and VARIANT_Coerce().

◆ VarBstrFromDate()

HRESULT WINAPI VarBstrFromDate ( DATE  dateIn,
LCID  lcid,
ULONG  dwFlags,
BSTR pbstrOut 
)

Definition at line 6839 of file vartype.c.

6840{
6841 SYSTEMTIME st;
6843 WCHAR date[128], fmt_buff[80], *time;
6844
6845 TRACE("%g, %#lx, %#lx, %p.\n", dateIn, lcid, dwFlags, pbstrOut);
6846
6847 if (!pbstrOut || !VariantTimeToSystemTime(dateIn, &st))
6848 return E_INVALIDARG;
6849
6850 *pbstrOut = NULL;
6851
6853 st.wYear += 553; /* Use the Thai buddhist calendar year */
6855 FIXME("VAR_CALENDAR_HIJRI/VAR_CALENDAR_GREGORIAN not handled\n");
6856
6857 if (dwFlags & LOCALE_USE_NLS)
6859 else
6860 {
6861 double whole = dateIn < 0 ? ceil(dateIn) : floor(dateIn);
6862 double partial = dateIn - whole;
6863
6864 if (whole == 0.0)
6866 else if (partial > -1e-12 && partial < 1e-12)
6868 }
6869
6871 date[0] = '\0';
6872 else
6873 if (!GetLocaleInfoW(lcid, LOCALE_SSHORTDATE, fmt_buff, ARRAY_SIZE(fmt_buff)) ||
6874 !get_date_format(lcid, dwFlags, &st, fmt_buff, date, ARRAY_SIZE(date)))
6875 return E_INVALIDARG;
6876
6877 if (!(dwFlags & VAR_DATEVALUEONLY))
6878 {
6879 time = date + lstrlenW(date);
6880 if (time != date)
6881 *time++ = ' ';
6883 return E_INVALIDARG;
6884 }
6885
6886 *pbstrOut = SysAllocString(date);
6887 if (*pbstrOut)
6888 TRACE("returning %s\n", debugstr_w(*pbstrOut));
6889 return *pbstrOut ? S_OK : E_OUTOFMEMORY;
6890}
#define lstrlenW
Definition: compat.h:750
BOOL get_date_format(LCID lcid, DWORD flags, const SYSTEMTIME *st, const WCHAR *fmt, WCHAR *date, int date_len)
Definition: vartype.c:6729
#define e
Definition: ke_i.h:82
#define debugstr_w
Definition: kernel32.h:32
INT WINAPI GetTimeFormatW(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCWSTR lpFormat, LPWSTR lpTimeStr, INT cchOut)
Definition: lcformat.c:1101
__u16 time
Definition: mkdosfs.c:8
#define VAR_CALENDAR_GREGORIAN
Definition: oleauto.h:334
#define VAR_CALENDAR_THAI
Definition: oleauto.h:333
#define VAR_CALENDAR_HIJRI
Definition: oleauto.h:329
#define VAR_TIMEVALUEONLY
Definition: oleauto.h:326
DWORD dwFormatFlags
Definition: trayclock.cpp:31
INT WINAPI VariantTimeToSystemTime(double dateIn, LPSYSTEMTIME lpSt)
Definition: variant.c:1294
#define LOCALE_SSHORTDATE
Definition: winnls.h:70

Referenced by _BSTR_DATE(), VARIANT_Coerce(), and VARIANT_FormatDate().

◆ VarBstrFromDec()

HRESULT WINAPI VarBstrFromDec ( const DECIMAL pDecIn,
LCID  lcid,
ULONG  dwFlags,
BSTR pbstrOut 
)

Definition at line 7052 of file vartype.c.

7053{
7054 WCHAR buff[256];
7056
7057 if (!pbstrOut)
7058 return E_INVALIDARG;
7059
7060 VARIANT_DIFromDec(pDecIn, &temp);
7062
7063 if (dwFlags & LOCALE_USE_NLS)
7064 {
7065 WCHAR numbuff[256];
7066
7067 /* Format the number for the locale */
7068 numbuff[0] = '\0';
7070 buff, NULL, numbuff, ARRAY_SIZE(numbuff));
7071 TRACE("created NLS string %s\n", debugstr_w(numbuff));
7072 *pbstrOut = SysAllocString(numbuff);
7073 }
7074 else
7075 {
7077 }
7078
7079 TRACE("returning %s\n", debugstr_w(*pbstrOut));
7080 return *pbstrOut ? S_OK : E_OUTOFMEMORY;
7081}
static void VARIANT_DIFromDec(const DECIMAL *from, VARIANT_DI *to)
Definition: vartype.c:4690
INT WINAPI GetNumberFormatW(LCID lcid, DWORD dwFlags, LPCWSTR lpszValue, const NUMBERFMTW *lpFormat, LPWSTR lpNumberStr, int cchOut)
Definition: lcformat.c:1130
static calc_node_t temp
Definition: rpn_ieee.c:38

Referenced by _BSTR_DEC(), and VARIANT_Coerce().

◆ VarBstrFromDisp()

HRESULT WINAPI VarBstrFromDisp ( IDispatch pdispIn,
LCID  lcid,
ULONG  dwFlags,
BSTR pbstrOut 
)

Definition at line 7148 of file vartype.c.

7149{
7150 return VARIANT_FromDisp(pdispIn, lcid, pbstrOut, VT_BSTR, dwFlags);
7151}
@ VT_BSTR
Definition: compat.h:2303

Referenced by VARIANT_Coerce().

◆ VarBstrFromI1()

HRESULT WINAPI VarBstrFromI1 ( signed char  cIn,
LCID  lcid,
ULONG  dwFlags,
BSTR pbstrOut 
)

Definition at line 6982 of file vartype.c.

6983{
6984 ULONG64 ul64 = cIn;
6985
6986 if (cIn < 0)
6987 {
6988 ul64 = -cIn;
6990 }
6991 return VARIANT_BstrFromUInt(ul64, lcid, dwFlags, pbstrOut);
6992}
static HRESULT VARIANT_BstrFromUInt(ULONG64 ulVal, LCID lcid, DWORD dwFlags, BSTR *pbstrOut)
Definition: vartype.c:6386
unsigned __int64 ULONG64
Definition: imports.h:198
#define VAR_NEGATIVE
Definition: variant.h:82

Referenced by VARIANT_Coerce().

◆ VarBstrFromI2()

HRESULT WINAPI VarBstrFromI2 ( short  sIn,
LCID  lcid,
ULONG  dwFlags,
BSTR pbstrOut 
)

Definition at line 6439 of file vartype.c.

6440{
6441 ULONG64 ul64 = sIn;
6442
6443 if (sIn < 0)
6444 {
6445 ul64 = -sIn;
6447 }
6448 return VARIANT_BstrFromUInt(ul64, lcid, dwFlags, pbstrOut);
6449}

Referenced by VARIANT_Coerce().

◆ VarBstrFromI4()

HRESULT WINAPI VarBstrFromI4 ( LONG  lIn,
LCID  lcid,
ULONG  dwFlags,
BSTR pbstrOut 
)

Definition at line 6467 of file vartype.c.

6468{
6469 ULONG64 ul64 = lIn;
6470
6471 if (lIn < 0)
6472 {
6473 ul64 = -(LONG64)lIn;
6475 }
6476 return VARIANT_BstrFromUInt(ul64, lcid, dwFlags, pbstrOut);
6477}
int64_t LONG64
Definition: typedefs.h:68

Referenced by test_VarBstrFromI4(), var2str(), and VARIANT_Coerce().

◆ VarBstrFromI8()

HRESULT WINAPI VarBstrFromI8 ( LONG64  llIn,
LCID  lcid,
ULONG  dwFlags,
BSTR pbstrOut 
)

Definition at line 7099 of file vartype.c.

7100{
7101 ULONG64 ul64 = llIn;
7102
7103 if (llIn < 0)
7104 {
7105 ul64 = -llIn;
7107 }
7108 return VARIANT_BstrFromUInt(ul64, lcid, dwFlags, pbstrOut);
7109}

Referenced by VARIANT_Coerce().

◆ VarBstrFromR4()

HRESULT WINAPI VarBstrFromR4 ( FLOAT  fltIn,
LCID  lcid,
ULONG  dwFlags,
BSTR pbstrOut 
)

Definition at line 6627 of file vartype.c.

6628{
6629 return VARIANT_BstrFromReal(fltIn, lcid, dwFlags, pbstrOut, 7);
6630}
static HRESULT VARIANT_BstrFromReal(DOUBLE dblIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut, int ndigits)
Definition: vartype.c:6540

Referenced by test_VarBstrFromR4(), var2str(), and VARIANT_Coerce().

◆ VarBstrFromR8()

HRESULT WINAPI VarBstrFromR8 ( double  dblIn,
LCID  lcid,
ULONG  dwFlags,
BSTR pbstrOut 
)

Definition at line 6648 of file vartype.c.

6649{
6650 return VARIANT_BstrFromReal(dblIn, lcid, dwFlags, pbstrOut, 15);
6651}

Referenced by Global_InvokeEx(), test_VarBstrFromR8(), var2str(), and VARIANT_Coerce().

◆ VarBstrFromUI1()

HRESULT WINAPI VarBstrFromUI1 ( BYTE  bIn,
LCID  lcid,
ULONG  dwFlags,
BSTR pbstrOut 
)

Definition at line 6418 of file vartype.c.

6419{
6420 return VARIANT_BstrFromUInt(bIn, lcid, dwFlags, pbstrOut);
6421}

Referenced by VARIANT_Coerce().

◆ VarBstrFromUI2()

HRESULT WINAPI VarBstrFromUI2 ( USHORT  usIn,
LCID  lcid,
ULONG  dwFlags,
BSTR pbstrOut 
)

Definition at line 7010 of file vartype.c.

7011{
7012 return VARIANT_BstrFromUInt(usIn, lcid, dwFlags, pbstrOut);
7013}

Referenced by VARIANT_Coerce().

◆ VarBstrFromUI4()

HRESULT WINAPI VarBstrFromUI4 ( ULONG  ulIn,
LCID  lcid,
ULONG  dwFlags,
BSTR pbstrOut 
)

Definition at line 7031 of file vartype.c.

7032{
7033 return VARIANT_BstrFromUInt(ulIn, lcid, dwFlags, pbstrOut);
7034}

Referenced by VARIANT_Coerce().

◆ VarBstrFromUI8()

HRESULT WINAPI VarBstrFromUI8 ( ULONG64  ullIn,
LCID  lcid,
ULONG  dwFlags,
BSTR pbstrOut 
)

Definition at line 7127 of file vartype.c.

7128{
7129 return VARIANT_BstrFromUInt(ullIn, lcid, dwFlags, pbstrOut);
7130}

Referenced by VARIANT_Coerce().

◆ VarCyAbs()

HRESULT WINAPI VarCyAbs ( CY  cyIn,
CY pCyOut 
)

Definition at line 3870 of file vartype.c.

3871{
3872 if (cyIn.Hi == 0x80000000 && !cyIn.Lo)
3873 return DISP_E_OVERFLOW;
3874
3875 pCyOut->int64 = cyIn.int64 < 0 ? -cyIn.int64 : cyIn.int64;
3876 return S_OK;
3877}

Referenced by test_VarCyAbs(), and VarAbs().

◆ VarCyAdd()

HRESULT WINAPI VarCyAdd ( CY  cyLeft,
CY  cyRight,
CY pCyOut 
)

Definition at line 3779 of file vartype.c.

3780{
3781 double l,r;
3782 _VarR8FromCy(cyLeft, &l);
3783 _VarR8FromCy(cyRight, &r);
3784 l = l + r;
3785 return VarCyFromR8(l, pCyOut);
3786}
r l[0]
Definition: byte_order.h:168
HRESULT WINAPI VarCyFromR8(double dblIn, CY *pCyOut)
Definition: vartype.c:3497
RETTYP _VarR8FromCy(CY i, double *o)
Definition: vartype.c:249
GLdouble GLdouble GLdouble r
Definition: gl.h:2055

Referenced by test_VarCyAdd(), and VarAdd().

◆ VarCyCmp()

HRESULT WINAPI VarCyCmp ( CY  cyLeft,
CY  cyRight 
)

Definition at line 4006 of file vartype.c.

4007{
4008 HRESULT hRet;
4009 CY result;
4010
4011 /* Subtract right from left, and compare the result to 0 */
4012 hRet = VarCySub(cyLeft, cyRight, &result);
4013
4014 if (SUCCEEDED(hRet))
4015 {
4016 if (result.int64 < 0)
4017 hRet = (HRESULT)VARCMP_LT;
4018 else if (result.int64 > 0)
4019 hRet = (HRESULT)VARCMP_GT;
4020 else
4021 hRet = (HRESULT)VARCMP_EQ;
4022 }
4023 return hRet;
4024}
HRESULT WINAPI VarCySub(CY cyLeft, CY cyRight, CY *pCyOut)
Definition: vartype.c:3848
GLuint64EXT * result
Definition: glext.h:11304
Definition: compat.h:2255
#define HRESULT
Definition: msvc.h:7

Referenced by VarCmp(), and VarCyCmpR8().

◆ VarCyCmpR8()

HRESULT WINAPI VarCyCmpR8 ( CY  cyLeft,
double  dblRight 
)

Definition at line 4040 of file vartype.c.

4041{
4042 HRESULT hRet;
4043 CY cyRight;
4044
4045 hRet = VarCyFromR8(dblRight, &cyRight);
4046
4047 if (SUCCEEDED(hRet))
4048 hRet = VarCyCmp(cyLeft, cyRight);
4049
4050 return hRet;
4051}
HRESULT WINAPI VarCyCmp(CY cyLeft, CY cyRight)
Definition: vartype.c:4006

◆ VarCyFix()

HRESULT WINAPI VarCyFix ( CY  cyIn,
CY pCyOut 
)

Definition at line 3896 of file vartype.c.

3897{
3898 pCyOut->int64 = cyIn.int64 / CY_MULTIPLIER;
3899 pCyOut->int64 *= CY_MULTIPLIER;
3900 return S_OK;
3901}
#define CY_MULTIPLIER
Definition: vartype.c:35

Referenced by VarFix().

◆ VarCyFromBool()

HRESULT WINAPI VarCyFromBool ( VARIANT_BOOL  boolIn,
CY pCyOut 
)

Definition at line 3614 of file vartype.c.

3615{
3616 pCyOut->int64 = (LONG64)boolIn * CY_MULTIPLIER;
3617 return S_OK;
3618}

Referenced by test_VarCyFromBool(), and VARIANT_Coerce().

◆ VarCyFromDate()

HRESULT WINAPI VarCyFromDate ( DATE  dateIn,
CY pCyOut 
)

Definition at line 3547 of file vartype.c.

3548{
3549 return VarCyFromR8(dateIn, pCyOut);
3550}

Referenced by test_VarCyFromDate(), and VARIANT_Coerce().

◆ VarCyFromDec()

HRESULT WINAPI VarCyFromDec ( const DECIMAL pdecIn,
CY pCyOut 
)

Definition at line 3698 of file vartype.c.

3699{
3700 DECIMAL rounded;
3701 HRESULT hRet;
3702
3703 hRet = VarDecRound(pdecIn, 4, &rounded);
3704
3705 if (SUCCEEDED(hRet))
3706 {
3707 double d;
3708
3709 if (rounded.Hi32)
3710 return DISP_E_OVERFLOW;
3711
3712 /* Note: Without the casts this promotes to int64 which loses precision */
3713 d = (double)rounded.Lo64 / (double)CY_Divisors[rounded.scale];
3714 if (rounded.sign)
3715 d = -d;
3716 return VarCyFromR8(d, pCyOut);
3717 }
3718 return hRet;
3719}
HRESULT WINAPI VarDecRound(const DECIMAL *pDecIn, int cDecimals, DECIMAL *pDecOut)
Definition: vartype.c:5840
static const int CY_Divisors[5]
Definition: vartype.c:3396

Referenced by test_VarCyFromDec(), and VARIANT_Coerce().

◆ VarCyFromDisp()

HRESULT WINAPI VarCyFromDisp ( IDispatch pdispIn,
LCID  lcid,
CY pCyOut 
)

Definition at line 3590 of file vartype.c.

3591{
3592 return VARIANT_FromDisp(pdispIn, lcid, pCyOut, VT_CY, 0);
3593}
@ VT_CY
Definition: compat.h:2301

Referenced by VARIANT_Coerce().

◆ VarCyFromI1()

HRESULT WINAPI VarCyFromI1 ( signed char  cIn,
CY pCyOut 
)

Definition at line 3635 of file vartype.c.

3636{
3637 pCyOut->int64 = (LONG64)cIn * CY_MULTIPLIER;
3638 return S_OK;
3639}

Referenced by test_VarCyFromI1(), and VARIANT_Coerce().

◆ VarCyFromI2()

HRESULT WINAPI VarCyFromI2 ( SHORT  sIn,
CY pCyOut 
)

Definition at line 3435 of file vartype.c.

3436{
3437 pCyOut->int64 = (LONG64)sIn * CY_MULTIPLIER;
3438 return S_OK;
3439}

Referenced by test_VarCyFromI2(), and VARIANT_Coerce().

◆ VarCyFromI4()

HRESULT WINAPI VarCyFromI4 ( LONG  lIn,
CY pCyOut 
)

Definition at line 3456 of file vartype.c.

3457{
3458 pCyOut->int64 = (LONG64)lIn * CY_MULTIPLIER;
3459 return S_OK;
3460}

Referenced by test_VarAdd(), test_VarCyFromI4(), test_VarDiv(), test_VarIdiv(), test_VarImp(), test_VarMul(), test_VarPow(), test_VarSub(), and VARIANT_Coerce().

◆ VarCyFromI8()

HRESULT WINAPI VarCyFromI8 ( LONG64  llIn,
CY pCyOut 
)

Definition at line 3736 of file vartype.c.

3737{
3738 if (llIn <= (I8_MIN/CY_MULTIPLIER) || llIn >= (I8_MAX/CY_MULTIPLIER)) return DISP_E_OVERFLOW;
3739 pCyOut->int64 = llIn * CY_MULTIPLIER;
3740 return S_OK;
3741}
#define I8_MAX
Definition: variant.h:63
#define I8_MIN
Definition: variant.h:64

Referenced by test_VarCyFromI8(), and VARIANT_Coerce().

◆ VarCyFromR4()

HRESULT WINAPI VarCyFromR4 ( FLOAT  fltIn,
CY pCyOut 
)

Definition at line 3477 of file vartype.c.

3478{
3479 return VarCyFromR8(fltIn, pCyOut);
3480}

Referenced by test_VarCyFromR4(), and VARIANT_Coerce().

◆ VarCyFromR8()

HRESULT WINAPI VarCyFromR8 ( double  dblIn,
CY pCyOut 
)

Definition at line 3497 of file vartype.c.

3498{
3499#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
3500 /* This code gives identical results to Win32 on Intel.
3501 * Here we use fp exceptions to catch overflows when storing the value.
3502 */
3503 static const unsigned short r8_fpcontrol = 0x137f;
3504 static const double r8_multiplier = CY_MULTIPLIER_F;
3505 unsigned short old_fpcontrol, result_fpstatus;
3506
3507 /* Clear exceptions, save the old fp state and load the new state */
3508 __asm__ __volatile__( "fnclex" );
3509 __asm__ __volatile__( "fstcw %0" : "=m" (old_fpcontrol) : );
3510 __asm__ __volatile__( "fldcw %0" : : "m" (r8_fpcontrol) );
3511 /* Perform the conversion. */
3512 __asm__ __volatile__( "fldl %0" : : "m" (dblIn) );
3513 __asm__ __volatile__( "fmull %0" : : "m" (r8_multiplier) );
3514 __asm__ __volatile__( "fistpll %0" : : "m" (*pCyOut) );
3515 /* Save the resulting fp state, load the old state and clear exceptions */
3516 __asm__ __volatile__( "fstsw %0" : "=m" (result_fpstatus) : );
3517 __asm__ __volatile__( "fnclex" );
3518 __asm__ __volatile__( "fldcw %0" : : "m" (old_fpcontrol) );
3519
3520 if (result_fpstatus & 0x9) /* Overflow | Invalid */
3521 return DISP_E_OVERFLOW;
3522#else
3523 /* This version produces slightly different results for boundary cases */
3524 if (dblIn < -922337203685477.5807 || dblIn >= 922337203685477.5807)
3525 return DISP_E_OVERFLOW;
3526 dblIn *= CY_MULTIPLIER_F;
3527 VARIANT_DutchRound(LONG64, dblIn, pCyOut->int64);
3528#endif
3529 return S_OK;
3530}
#define VARIANT_DutchRound(typ, value, res)
Definition: vartype.c:71
__asm__(".p2align 4, 0x90\n" ".seh_proc __seh2_global_filter_func\n" "__seh2_global_filter_func:\n" "\tsub %rbp, %rax\n" "\tpush %rbp\n" "\t.seh_pushreg %rbp\n" "\tpush %rbx\n" "\t.seh_pushreg %rbx\n" "\tpush %rdi\n" "\t.seh_pushreg %rdi\n" "\tpush %rsi\n" "\t.seh_pushreg %rsi\n" "\tpush %r12\n" "\t.seh_pushreg %r12\n" "\tpush %r13\n" "\t.seh_pushreg %r13\n" "\tpush %r14\n" "\t.seh_pushreg %r14\n" "\tpush %r15\n" "\t.seh_pushreg %r15\n" "\tsub $40, %rsp\n" "\t.seh_stackalloc 40\n" "\t.seh_endprologue\n" "\tsub %rax, %rdx\n" "\tmov %rdx, %rbp\n" "\tjmp *%r8\n" "__seh2_global_filter_func_exit:\n" "\t.p2align 4\n" "\tadd $40, %rsp\n" "\tpop %r15\n" "\tpop %r14\n" "\tpop %r13\n" "\tpop %r12\n" "\tpop %rsi\n" "\tpop %rdi\n" "\tpop %rbx\n" "\tpop %rbp\n" "\tret\n" "\t.seh_endproc")

Referenced by test_VarCyFromDate(), test_VarCyFromR8(), VarCyAdd(), VarCyCmpR8(), VarCyFromDate(), VarCyFromDec(), VarCyFromR4(), VarCyMul(), VarCyMulI4(), VarCyMulI8(), VarCySub(), VARIANT_Coerce(), and VarNumFromParseNum().

◆ VarCyFromStr()

HRESULT WINAPI VarCyFromStr ( const OLECHAR strIn,
LCID  lcid,
ULONG  dwFlags,
CY pCyOut 
)

Definition at line 3569 of file vartype.c.

3570{
3571 return VARIANT_NumberFromBstr(strIn, lcid, dwFlags, pCyOut, VT_CY);
3572}
static HRESULT VARIANT_NumberFromBstr(const OLECHAR *pStrIn, LCID lcid, ULONG ulFlags, void *pOut, VARTYPE vt)
Definition: vartype.c:84

Referenced by VarFormatCurrency(), and VARIANT_Coerce().

◆ VarCyFromUI1()

HRESULT WINAPI VarCyFromUI1 ( BYTE  bIn,
CY pCyOut 
)

Definition at line 3414 of file vartype.c.

3415{
3416 pCyOut->int64 = (ULONG64)bIn * CY_MULTIPLIER;
3417 return S_OK;
3418}

Referenced by test_VarCyFromUI1(), and VARIANT_Coerce().

◆ VarCyFromUI2()

HRESULT WINAPI VarCyFromUI2 ( USHORT  usIn,
CY pCyOut 
)

Definition at line 3656 of file vartype.c.

3657{
3658 pCyOut->int64 = (ULONG64)usIn * CY_MULTIPLIER;
3659 return S_OK;
3660}

Referenced by test_VarCyFromUI2(), and VARIANT_Coerce().

◆ VarCyFromUI4()

HRESULT WINAPI VarCyFromUI4 ( ULONG  ulIn,
CY pCyOut 
)

Definition at line 3677 of file vartype.c.

3678{
3679 pCyOut->int64 = (ULONG64)ulIn * CY_MULTIPLIER;
3680 return S_OK;
3681}

Referenced by test_VarCyFromUI4(), and VARIANT_Coerce().

◆ VarCyFromUI8()

HRESULT WINAPI VarCyFromUI8 ( ULONG64  ullIn,
CY pCyOut 
)

Definition at line 3758 of file vartype.c.

3759{
3760 if (ullIn > (I8_MAX/CY_MULTIPLIER)) return DISP_E_OVERFLOW;
3761 pCyOut->int64 = ullIn * CY_MULTIPLIER;
3762 return S_OK;
3763}

Referenced by test_VarCyFromUI8(), and VARIANT_Coerce().

◆ VarCyInt()

HRESULT WINAPI VarCyInt ( CY  cyIn,
CY pCyOut 
)

Definition at line 3920 of file vartype.c.

3921{
3922 pCyOut->int64 = cyIn.int64 / CY_MULTIPLIER;
3923 pCyOut->int64 *= CY_MULTIPLIER;
3924
3925 if (cyIn.int64 < 0 && cyIn.int64 % CY_MULTIPLIER != 0)
3926 {
3927 pCyOut->int64 -= CY_MULTIPLIER;
3928 }
3929 return S_OK;
3930}

Referenced by VarInt().

◆ VarCyMul()

HRESULT WINAPI VarCyMul ( CY  cyLeft,
CY  cyRight,
CY pCyOut 
)

Definition at line 3802 of file vartype.c.

3803{
3804 double l,r;
3805 _VarR8FromCy(cyLeft, &l);
3806 _VarR8FromCy(cyRight, &r);
3807 l = l * r;
3808 return VarCyFromR8(l, pCyOut);
3809}

Referenced by test_VarCyMul(), and VarMul().

◆ VarCyMulI4()

HRESULT WINAPI VarCyMulI4 ( CY  cyLeft,
LONG  lRight,
CY pCyOut 
)

Definition at line 3825 of file vartype.c.

3826{
3827 double d;
3828
3829 _VarR8FromCy(cyLeft, &d);
3830 d = d * lRight;
3831 return VarCyFromR8(d, pCyOut);
3832}

◆ VarCyMulI8()

HRESULT WINAPI VarCyMulI8 ( CY  cyLeft,
LONG64  llRight,
CY pCyOut 
)

Definition at line 4067 of file vartype.c.

4068{
4069 double d;
4070
4071 _VarR8FromCy(cyLeft, &d);
4072 d = d * (double)llRight;
4073 return VarCyFromR8(d, pCyOut);
4074}

◆ VarCyNeg()

HRESULT WINAPI VarCyNeg ( CY  cyIn,
CY pCyOut 
)

Definition at line 3945 of file vartype.c.

3946{
3947 if (cyIn.Hi == 0x80000000 && !cyIn.Lo)
3948 return DISP_E_OVERFLOW;
3949
3950 pCyOut->int64 = -cyIn.int64;
3951 return S_OK;
3952}

Referenced by test_VarCyNeg(), and VarNeg().

◆ VarCyRound()

HRESULT WINAPI VarCyRound ( CY  cyIn,
int  cDecimals,
CY pCyOut 
)

Definition at line 3968 of file vartype.c.

3969{
3970 if (cDecimals < 0)
3971 return E_INVALIDARG;
3972
3973 if (cDecimals > 3)
3974 {
3975 /* Rounding to more precision than we have */
3976 *pCyOut = cyIn;
3977 return S_OK;
3978 }
3979 else
3980 {
3981 double d, div = CY_Divisors[cDecimals];
3982
3983 _VarR8FromCy(cyIn, &d);
3984 d = d * div;
3986 d = (double)pCyOut->int64 / div * CY_MULTIPLIER_F;
3988 return S_OK;
3989 }
3990}
_ACRTIMP div_t __cdecl div(int, int)
Definition: math.c:2081
int64_t LONGLONG
Definition: typedefs.h:68

◆ VarCySub()

HRESULT WINAPI VarCySub ( CY  cyLeft,
CY  cyRight,
CY pCyOut 
)

Definition at line 3848 of file vartype.c.

3849{
3850 double l,r;
3851 _VarR8FromCy(cyLeft, &l);
3852 _VarR8FromCy(cyRight, &r);
3853 l = l - r;
3854 return VarCyFromR8(l, pCyOut);
3855}

Referenced by test_VarCySub(), VarCyCmp(), and VarSub().

◆ VarDateFromBool()

HRESULT WINAPI VarDateFromBool ( VARIANT_BOOL  boolIn,
DATE pdateOut 
)

Definition at line 7393 of file vartype.c.

7394{
7395 return VarR8FromBool(boolIn, pdateOut);
7396}
HRESULT WINAPI VarR8FromBool(VARIANT_BOOL boolIn, double *pDblOut)
Definition: vartype.c:3183

Referenced by test_VarDateFromBool(), and VARIANT_Coerce().

◆ VarDateFromCy()

HRESULT WINAPI VarDateFromCy ( CY  cyIn,
DATE pdateOut 
)

Definition at line 7410 of file vartype.c.

7411{
7412 return VarR8FromCy(cyIn, pdateOut);
7413}
HRESULT WINAPI VarR8FromCy(CY cyIn, double *pDblOut)
Definition: vartype.c:3107

Referenced by test_VarDateFromCy(), and VARIANT_Coerce().

◆ VarDateFromDec()

HRESULT WINAPI VarDateFromDec ( const DECIMAL pdecIn,
DATE pdateOut 
)

Definition at line 8074 of file vartype.c.

8075{
8076 return VarR8FromDec(pdecIn, pdateOut);
8077}
HRESULT WINAPI VarR8FromDec(const DECIMAL *pDecIn, double *pDblOut)
Definition: vartype.c:3261

Referenced by test_VarDateFromDec(), and VARIANT_Coerce().

◆ VarDateFromDisp()

HRESULT WINAPI VarDateFromDisp ( IDispatch pdispIn,
LCID  lcid,
DATE pdateOut 
)

Definition at line 7376 of file vartype.c.

7377{
7378 return VARIANT_FromDisp(pdispIn, lcid, pdateOut, VT_DATE, 0);
7379}
@ VT_DATE
Definition: compat.h:2302

Referenced by VARIANT_Coerce().

◆ VarDateFromI1()

HRESULT WINAPI VarDateFromI1 ( signed char  cIn,
DATE pdateOut 
)

Definition at line 8023 of file vartype.c.

8024{
8025 return VarR8FromI1(cIn, pdateOut);
8026}
HRESULT WINAPI VarR8FromI1(signed char cIn, double *pDblOut)
Definition: vartype.c:3203

Referenced by test_VarDateFromI1(), and VARIANT_Coerce().

◆ VarDateFromI2()

HRESULT WINAPI VarDateFromI2 ( short  sIn,
DATE pdateOut 
)

Definition at line 7302 of file vartype.c.

7303{
7304 return VarR8FromI2(sIn, pdateOut);
7305}
HRESULT WINAPI VarR8FromI2(SHORT sIn, double *pDblOut)
Definition: vartype.c:3056

Referenced by test_VarDateFromI2(), and VARIANT_Coerce().

◆ VarDateFromI4()

HRESULT WINAPI VarDateFromI4 ( LONG  lIn,
DATE pdateOut 
)

Definition at line 7319 of file vartype.c.

7320{
7321 return VarDateFromR8(lIn, pdateOut);
7322}
HRESULT WINAPI VarDateFromR8(double dblIn, DATE *pdateOut)
Definition: vartype.c:7353

Referenced by test_VarDateFromI4(), and VARIANT_Coerce().

◆ VarDateFromI8()

HRESULT WINAPI VarDateFromI8 ( LONG64  llIn,
DATE pdateOut 
)

Definition at line 8092 of file vartype.c.

8093{
8094 if (llIn < DATE_MIN || llIn > DATE_MAX) return DISP_E_OVERFLOW;
8095 *pdateOut = (DATE)llIn;
8096 return S_OK;
8097}
double DATE
Definition: compat.h:2253
#define DATE_MAX
Definition: variant.h:67

Referenced by test_VarDateFromI8(), and VARIANT_Coerce().

◆ VarDateFromR4()

HRESULT WINAPI VarDateFromR4 ( FLOAT  fltIn,
DATE pdateOut 
)

Definition at line 7336 of file vartype.c.

7337{
7338 return VarR8FromR4(fltIn, pdateOut);
7339}
HRESULT WINAPI VarR8FromR4(FLOAT fltIn, double *pDblOut)
Definition: vartype.c:3090

Referenced by test_VarDateFromR4(), and VARIANT_Coerce().

◆ VarDateFromR8()

HRESULT WINAPI VarDateFromR8 ( double  dblIn,
DATE pdateOut 
)

Definition at line 7353 of file vartype.c.

7354{
7355 if (dblIn <= (DATE_MIN - 1.0) || dblIn >= (DATE_MAX + 1.0)) return DISP_E_OVERFLOW;
7356 *pdateOut = (DATE)dblIn;
7357 return S_OK;
7358}
#define DATE_MIN
Definition: variant.h:68

Referenced by test_VarDateFromR8(), VarDateFromI4(), VarDateFromUI4(), VARIANT_Coerce(), and VARIANT_FormatDate().

◆ VarDateFromStr()

HRESULT WINAPI VarDateFromStr ( const OLECHAR strIn,
LCID  lcid,
ULONG  dwFlags,
DATE pdateOut 
)

Definition at line 7663 of file vartype.c.

7664{
7665 static const USHORT ParseDateTokens[] =
7666 {
7683 };
7684 static const BYTE ParseDateMonths[] =
7685 {
7686 1,2,3,4,5,6,7,8,9,10,11,12,13,
7687 1,2,3,4,5,6,7,8,9,10,11,12,13
7688 };
7689 unsigned int i;
7690 BSTR tokens[ARRAY_SIZE(ParseDateTokens)];
7691 DATEPARSE dp;
7692 DWORD dwDateSeps = 0, iDate = 0;
7693 HRESULT hRet = S_OK;
7694
7697 return E_INVALIDARG;
7698
7699 if (!strIn)
7700 return DISP_E_TYPEMISMATCH;
7701
7702 *pdateOut = 0.0;
7703
7704 TRACE("%s, %#lx, %#lx, %p.\n", debugstr_w(strIn), lcid, dwFlags, pdateOut);
7705
7706 memset(&dp, 0, sizeof(dp));
7707
7709 (LPWSTR)&iDate, sizeof(iDate)/sizeof(WCHAR));
7710 TRACE("iDate is %ld\n", iDate);
7711
7712 /* Get the month/day/am/pm tokens for this locale */
7713 for (i = 0; i < ARRAY_SIZE(tokens); i++)
7714 {
7715 WCHAR buff[128];
7716 LCTYPE lctype = ParseDateTokens[i] | (dwFlags & LOCALE_NOUSEROVERRIDE);
7717
7718 /* FIXME: Alternate calendars - should use GetCalendarInfo() and/or
7719 * GetAltMonthNames(). We should really cache these strings too.
7720 */
7721 buff[0] = '\0';
7723 tokens[i] = SysAllocString(buff);
7724 TRACE("token %d is %s\n", i, debugstr_w(tokens[i]));
7725 }
7726
7727 /* Parse the string into our structure */
7728 while (*strIn)
7729 {
7730 if ('0' <= *strIn && *strIn <= '9')
7731 {
7732 OLECHAR* end;
7733 if (dp.dwCount >= 6)
7734 {
7735 hRet = DISP_E_TYPEMISMATCH;
7736 break;
7737 }
7738 dp.dwValues[dp.dwCount] = wcstoul(strIn, &end, 10);
7739 dp.dwCount++;
7740 strIn = end - 1;
7741 }
7742 else if (iswalpha(*strIn))
7743 {
7744 BOOL bFound = FALSE;
7745
7746 for (i = 0; i < ARRAY_SIZE(tokens); i++)
7747 {
7748 DWORD dwLen = lstrlenW(tokens[i]);
7749 if (dwLen && !wcsnicmp(strIn, tokens[i], dwLen))
7750 {
7751 if (i <= 25)
7752 {
7753 if (dp.dwCount >= 6)
7754 hRet = DISP_E_TYPEMISMATCH;
7755 else
7756 {
7757 dp.dwValues[dp.dwCount] = ParseDateMonths[i];
7758 dp.dwFlags[dp.dwCount] |= (DP_MONTH|DP_DATESEP);
7759 dp.dwCount++;
7760 }
7761 }
7762 else if (i > 39 && i < 42)
7763 {
7764 if (!dp.dwCount || dp.dwParseFlags & (DP_AM|DP_PM))
7765 hRet = DISP_E_TYPEMISMATCH;
7766 else
7767 {
7768 dp.dwFlags[dp.dwCount - 1] |= (i == 40 ? DP_AM : DP_PM);
7769 dp.dwParseFlags |= (i == 40 ? DP_AM : DP_PM);
7770 }
7771 }
7772 strIn += (dwLen - 1);
7773 bFound = TRUE;
7774 break;
7775 }
7776 }
7777
7778 if (!bFound)
7779 {
7780 if ((*strIn == 'a' || *strIn == 'A' || *strIn == 'p' || *strIn == 'P') &&
7781 (dp.dwCount && !(dp.dwParseFlags & (DP_AM|DP_PM))))
7782 {
7783 /* Special case - 'a' and 'p' are recognised as short for am/pm */
7784 if (*strIn == 'a' || *strIn == 'A')
7785 {
7786 dp.dwFlags[dp.dwCount - 1] |= DP_AM;
7787 dp.dwParseFlags |= DP_AM;
7788 }
7789 else
7790 {
7791 dp.dwFlags[dp.dwCount - 1] |= DP_PM;
7792 dp.dwParseFlags |= DP_PM;
7793 }
7794 strIn++;
7795 }
7796 else
7797 {
7798 TRACE("No matching token for %s\n", debugstr_w(strIn));
7799 hRet = DISP_E_TYPEMISMATCH;
7800 break;
7801 }
7802 }
7803 }
7804 else if (*strIn == ':' || *strIn == '.')
7805 {
7806 if (!dp.dwCount || !strIn[1])
7807 hRet = DISP_E_TYPEMISMATCH;
7808 else
7809 if (tokens[42][0] == *strIn)
7810 {
7811 dwDateSeps++;
7812 if (dwDateSeps > 2)
7813 hRet = DISP_E_TYPEMISMATCH;
7814 else
7815 dp.dwFlags[dp.dwCount - 1] |= DP_DATESEP;
7816 }
7817 else
7818 dp.dwFlags[dp.dwCount - 1] |= DP_TIMESEP;
7819 }
7820 else if (*strIn == '-' || *strIn == '/')
7821 {
7822 dwDateSeps++;
7823 if (dwDateSeps > 2 || !dp.dwCount || !strIn[1])
7824 hRet = DISP_E_TYPEMISMATCH;
7825 else
7826 dp.dwFlags[dp.dwCount - 1] |= DP_DATESEP;
7827 }
7828 else if (*strIn == ',' || iswspace(*strIn))
7829 {
7830 if (*strIn == ',' && !strIn[1])
7831 hRet = DISP_E_TYPEMISMATCH;
7832 }
7833 else
7834 {
7835 hRet = DISP_E_TYPEMISMATCH;
7836 }
7837 strIn++;
7838 }
7839
7840 if (!dp.dwCount || dp.dwCount > 6 ||
7841 (dp.dwCount == 1 && !(dp.dwParseFlags & (DP_AM|DP_PM))))
7842 hRet = DISP_E_TYPEMISMATCH;
7843
7844 if (SUCCEEDED(hRet))
7845 {
7846 SYSTEMTIME st;
7847 DWORD dwOffset = 0; /* Start of date fields in dp.dwValues */
7848
7849 st.wDayOfWeek = st.wHour = st.wMinute = st.wSecond = st.wMilliseconds = 0;
7850
7851 /* Figure out which numbers correspond to which fields.
7852 *
7853 * This switch statement works based on the fact that native interprets any
7854 * fields that are not joined with a time separator ('.' or ':') as date
7855 * fields. Thus we construct a value from 0-32 where each set bit indicates
7856 * a time field. This encapsulates the hundreds of permutations of 2-6 fields.
7857 * For valid permutations, we set dwOffset to point to the first date field
7858 * and shorten dp.dwCount by the number of time fields found. The real
7859 * magic here occurs in VARIANT_MakeDate() above, where we determine what
7860 * each date number must represent in the context of iDate.
7861 */
7862 TRACE("%#lx\n", TIMEFLAG(0)|TIMEFLAG(1)|TIMEFLAG(2)|TIMEFLAG(3)|TIMEFLAG(4));
7863
7864 switch (TIMEFLAG(0)|TIMEFLAG(1)|TIMEFLAG(2)|TIMEFLAG(3)|TIMEFLAG(4))
7865 {
7866 case 0x1: /* TT TTDD TTDDD */
7867 if (dp.dwCount > 3 &&
7868 ((dp.dwFlags[2] & (DP_AM|DP_PM)) || (dp.dwFlags[3] & (DP_AM|DP_PM)) ||
7869 (dp.dwFlags[4] & (DP_AM|DP_PM))))
7870 hRet = DISP_E_TYPEMISMATCH;
7871 else if (dp.dwCount != 2 && dp.dwCount != 4 && dp.dwCount != 5)
7872 hRet = DISP_E_TYPEMISMATCH;
7873 st.wHour = dp.dwValues[0];
7874 st.wMinute = dp.dwValues[1];
7875 dp.dwCount -= 2;
7876 dwOffset = 2;
7877 break;
7878
7879 case 0x3: /* TTT TTTDD TTTDDD */
7880 if (dp.dwCount > 4 &&
7881 ((dp.dwFlags[3] & (DP_AM|DP_PM)) || (dp.dwFlags[4] & (DP_AM|DP_PM)) ||
7882 (dp.dwFlags[5] & (DP_AM|DP_PM))))
7883 hRet = DISP_E_TYPEMISMATCH;
7884 else if (dp.dwCount != 3 && dp.dwCount != 5 && dp.dwCount != 6)
7885 hRet = DISP_E_TYPEMISMATCH;
7886 st.wHour = dp.dwValues[0];
7887 st.wMinute = dp.dwValues[1];
7888 st.wSecond = dp.dwValues[2];
7889 dwOffset = 3;
7890 dp.dwCount -= 3;
7891 break;
7892
7893 case 0x4: /* DDTT */
7894 if (dp.dwCount != 4 ||
7895 (dp.dwFlags[0] & (DP_AM|DP_PM)) || (dp.dwFlags[1] & (DP_AM|DP_PM)))
7896 hRet = DISP_E_TYPEMISMATCH;
7897
7898 st.wHour = dp.dwValues[2];
7899 st.wMinute = dp.dwValues[3];
7900 dp.dwCount -= 2;
7901 break;
7902
7903 case 0x0: /* T DD DDD TDDD TDDD */
7904 if (dp.dwCount == 1 && (dp.dwParseFlags & (DP_AM|DP_PM)))
7905 {
7906 st.wHour = dp.dwValues[0]; /* T */
7907 dp.dwCount = 0;
7908 break;
7909 }
7910 else if (dp.dwCount > 4 || (dp.dwCount < 3 && dp.dwParseFlags & (DP_AM|DP_PM)))
7911 {
7912 hRet = DISP_E_TYPEMISMATCH;
7913 }
7914 else if (dp.dwCount == 3)
7915 {
7916 if (dp.dwFlags[0] & (DP_AM|DP_PM)) /* TDD */
7917 {
7918 dp.dwCount = 2;
7919 st.wHour = dp.dwValues[0];
7920 dwOffset = 1;
7921 break;
7922 }
7923 if (dp.dwFlags[2] & (DP_AM|DP_PM)) /* DDT */
7924 {
7925 dp.dwCount = 2;
7926 st.wHour = dp.dwValues[2];
7927 break;
7928 }
7929 else if (dp.dwParseFlags & (DP_AM|DP_PM))
7930 hRet = DISP_E_TYPEMISMATCH;
7931 }
7932 else if (dp.dwCount == 4)
7933 {
7934 dp.dwCount = 3;
7935 if (dp.dwFlags[0] & (DP_AM|DP_PM)) /* TDDD */
7936 {
7937 st.wHour = dp.dwValues[0];
7938 dwOffset = 1;
7939 }
7940 else if (dp.dwFlags[3] & (DP_AM|DP_PM)) /* DDDT */
7941 {
7942 st.wHour = dp.dwValues[3];
7943 }
7944 else
7945 hRet = DISP_E_TYPEMISMATCH;
7946 break;
7947 }
7948 /* .. fall through .. */
7949
7950 case 0x8: /* DDDTT */
7951 if ((dp.dwCount == 2 && (dp.dwParseFlags & (DP_AM|DP_PM))) ||
7952 (dp.dwCount == 5 && ((dp.dwFlags[0] & (DP_AM|DP_PM)) ||
7953 (dp.dwFlags[1] & (DP_AM|DP_PM)) || (dp.dwFlags[2] & (DP_AM|DP_PM)))) ||
7954 dp.dwCount == 4 || dp.dwCount == 6)
7955 hRet = DISP_E_TYPEMISMATCH;
7956 st.wHour = dp.dwValues[3];
7957 st.wMinute = dp.dwValues[4];
7958 if (dp.dwCount == 5)
7959 dp.dwCount -= 2;
7960 break;
7961
7962 case 0xC: /* DDTTT */
7963 if (dp.dwCount != 5 ||
7964 (dp.dwFlags[0] & (DP_AM|DP_PM)) || (dp.dwFlags[1] & (DP_AM|DP_PM)))
7965 hRet = DISP_E_TYPEMISMATCH;
7966 st.wHour = dp.dwValues[2];
7967 st.wMinute = dp.dwValues[3];
7968 st.wSecond = dp.dwValues[4];
7969 dp.dwCount -= 3;
7970 break;
7971
7972 case 0x18: /* DDDTTT */
7973 if ((dp.dwFlags[0] & (DP_AM|DP_PM)) || (dp.dwFlags[1] & (DP_AM|DP_PM)) ||
7974 (dp.dwFlags[2] & (DP_AM|DP_PM)))
7975 hRet = DISP_E_TYPEMISMATCH;
7976 st.wHour = dp.dwValues[3];
7977 st.wMinute = dp.dwValues[4];
7978 st.wSecond = dp.dwValues[5];
7979 dp.dwCount -= 3;
7980 break;
7981
7982 default:
7983 hRet = DISP_E_TYPEMISMATCH;
7984 break;
7985 }
7986
7987 if (SUCCEEDED(hRet))
7988 {
7989 hRet = VARIANT_MakeDate(&dp, iDate, dwOffset, &st);
7990
7992 {
7993 st.wYear = 1899;
7994 st.wMonth = 12;
7995 st.wDay = 30;
7996 }
7997 else if (dwFlags & VAR_DATEVALUEONLY)
7998 st.wHour = st.wMinute = st.wSecond = 0;
7999
8000 /* Finally, convert the value to a VT_DATE */
8001 if (SUCCEEDED(hRet))
8002 hRet = SystemTimeToVariantTime(&st, pdateOut) ? S_OK : DISP_E_TYPEMISMATCH;
8003 }
8004 }
8005
8006 for (i = 0; i < ARRAY_SIZE(tokens); i++)
8007 SysFreeString(tokens[i]);
8008 return hRet;
8009}
#define wcsnicmp
Definition: compat.h:14
WCHAR OLECHAR
Definition: compat.h:2292
OLECHAR * BSTR
Definition: compat.h:2293
_ACRTIMP __msvcrt_ulong __cdecl wcstoul(const wchar_t *, wchar_t **, int)
Definition: wcs.c:2917
#define DP_TIMESEP
Definition: vartype.c:7416
#define DP_DATESEP
Definition: vartype.c:7417
#define DP_AM
Definition: vartype.c:7419
static HRESULT VARIANT_MakeDate(DATEPARSE *dp, DWORD iDate, DWORD offset, SYSTEMTIME *st)
Definition: vartype.c:7455
#define DP_PM
Definition: vartype.c:7420
#define TIMEFLAG(i)
Definition: vartype.c:7430
#define DP_MONTH
Definition: vartype.c:7418
unsigned int BOOL
Definition: ntddk_ex.h:94
GLuint GLuint end
Definition: gl.h:1545
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:273
unsigned short USHORT
Definition: pedump.c:61
_In_ DWORD _In_ DWORD dwOffset
Definition: ntgdi.h:2033
#define iswspace(_c)
Definition: ctype.h:669
#define iswalpha(_c)
Definition: ctype.h:664
#define memset(x, y, z)
Definition: compat.h:39
WORD wMilliseconds
Definition: minwinbase.h:263
WORD wSecond
Definition: minwinbase.h:262
WORD wMinute
Definition: minwinbase.h:261
DWORD dwParseFlags
Definition: vartype.c:7425
DWORD dwCount
Definition: vartype.c:7424
DWORD dwFlags[6]
Definition: vartype.c:7426
DWORD dwValues[6]
Definition: vartype.c:7427
uint16_t * LPWSTR
Definition: typedefs.h:56
INT WINAPI SystemTimeToVariantTime(LPSYSTEMTIME lpSt, double *pDateOut)
Definition: variant.c:1263
#define LOCALE_SDATE
Definition: winnls.h:68
#define LOCALE_SMONTHNAME13
Definition: winnls.h:113
#define LOCALE_IDATE
Definition: winnls.h:73
#define LOCALE_SABBREVMONTHNAME13
Definition: winnls.h:126
#define LOCALE_S1159
Definition: winnls.h:81
#define LOCALE_S2359
Definition: winnls.h:82
unsigned char BYTE
Definition: xxhash.c:193

Referenced by parse_date_literal(), test_VarDateFromStr(), and VARIANT_Coerce().

◆ VarDateFromUI1()

HRESULT WINAPI VarDateFromUI1 ( BYTE  bIn,
DATE pdateOut 
)

Definition at line 7285 of file vartype.c.

7286{
7287 return VarR8FromUI1(bIn, pdateOut);
7288}
HRESULT WINAPI VarR8FromUI1(BYTE bIn, double *pDblOut)
Definition: vartype.c:3039

Referenced by test_VarDateFromUI1(), and VARIANT_Coerce().

◆ VarDateFromUI2()

HRESULT WINAPI VarDateFromUI2 ( USHORT  uiIn,
DATE pdateOut 
)

Definition at line 8040 of file vartype.c.

8041{
8042 return VarR8FromUI2(uiIn, pdateOut);
8043}
HRESULT WINAPI VarR8FromUI2(USHORT usIn, double *pDblOut)
Definition: vartype.c:3223

Referenced by test_VarDateFromUI2(), and VARIANT_Coerce().

◆ VarDateFromUI4()

HRESULT WINAPI VarDateFromUI4 ( ULONG  ulIn,
DATE pdateOut 
)

Definition at line 8057 of file vartype.c.

8058{
8059 return VarDateFromR8(ulIn, pdateOut);
8060}

Referenced by test_VarDateFromUI4(), and VARIANT_Coerce().

◆ VarDateFromUI8()

HRESULT WINAPI VarDateFromUI8 ( ULONG64  ullIn,
DATE pdateOut 
)

Definition at line 8112 of file vartype.c.

8113{
8114 if (ullIn > DATE_MAX) return DISP_E_OVERFLOW;
8115 *pdateOut = (DATE)ullIn;
8116 return S_OK;
8117}

Referenced by test_VarDateFromUI8(), and VARIANT_Coerce().

◆ VarDecAbs()

HRESULT WINAPI VarDecAbs ( const DECIMAL pDecIn,
DECIMAL pDecOut 
)

Definition at line 5723 of file vartype.c.

5724{
5725 *pDecOut = *pDecIn;
5726 pDecOut->sign &= ~DECIMAL_NEG;
5727 return S_OK;
5728}

Referenced by test_VarDecAbs().

◆ VarDecAdd()

HRESULT WINAPI VarDecAdd ( const DECIMAL pDecLeft,
const DECIMAL pDecRight,
DECIMAL pDecOut 
)

Definition at line 4580 of file vartype.c.

4581{
4582 HRESULT hRet;
4583 DECIMAL scaled[2];
4584
4585 hRet = VARIANT_DecScale(&pDecLeft, &pDecRight, scaled);
4586
4587 if (SUCCEEDED(hRet))
4588 {
4589 /* Our decimals now have the same scale, we can add them as 96 bit integers */
4590 ULONG overflow = 0;
4592 int cmp;
4593
4594 /* Correct for the sign of the result */
4595 if (pDecLeft->sign && pDecRight->sign)
4596 {
4597 /* -x + -y : Negative */
4598 sign = DECIMAL_NEG;
4599 goto VarDecAdd_AsPositive;
4600 }
4601 else if (pDecLeft->sign && !pDecRight->sign)
4602 {
4603 cmp = VARIANT_DecCmp(pDecLeft, pDecRight);
4604
4605 /* -x + y : Negative if x > y */
4606 if (cmp > 0)
4607 {
4608 sign = DECIMAL_NEG;
4609VarDecAdd_AsNegative:
4610 pDecOut->Lo32 = VARIANT_Sub(pDecLeft->Lo32, pDecRight->Lo32, &overflow);
4611 pDecOut->Mid32 = VARIANT_Sub(pDecLeft->Mid32, pDecRight->Mid32, &overflow);
4612 pDecOut->Hi32 = VARIANT_Sub(pDecLeft->Hi32, pDecRight->Hi32, &overflow);
4613 }
4614 else
4615 {
4616VarDecAdd_AsInvertedNegative:
4617 pDecOut->Lo32 = VARIANT_Sub(pDecRight->Lo32, pDecLeft->Lo32, &overflow);
4618 pDecOut->Mid32 = VARIANT_Sub(pDecRight->Mid32, pDecLeft->Mid32, &overflow);
4619 pDecOut->Hi32 = VARIANT_Sub(pDecRight->Hi32, pDecLeft->Hi32, &overflow);
4620 }
4621 }
4622 else if (!pDecLeft->sign && pDecRight->sign)
4623 {
4624 cmp = VARIANT_DecCmp(pDecLeft, pDecRight);
4625
4626 /* x + -y : Negative if x <= y */
4627 if (cmp <= 0)
4628 {
4629 sign = DECIMAL_NEG;
4630 goto VarDecAdd_AsInvertedNegative;
4631 }
4632 goto VarDecAdd_AsNegative;
4633 }
4634 else
4635 {
4636 /* x + y : Positive */
4637VarDecAdd_AsPositive:
4638 pDecOut->Lo32 = VARIANT_Add(pDecLeft->Lo32, pDecRight->Lo32, &overflow);
4639 pDecOut->Mid32 = VARIANT_Add(pDecLeft->Mid32, pDecRight->Mid32, &overflow);
4640 pDecOut->Hi32 = VARIANT_Add(pDecLeft->Hi32, pDecRight->Hi32, &overflow);
4641
4642 if (overflow)
4643 {
4644 int i;
4645 DWORD n[4];
4646 unsigned char remainder;
4647
4648 if (!pDecLeft->scale)
4649 return DISP_E_OVERFLOW;
4650
4651 pDecOut->scale = pDecLeft->scale - 1;
4652 pDecOut->sign = sign;
4653
4654 n[0] = pDecOut->Lo32;
4655 n[1] = pDecOut->Mid32;
4656 n[2] = pDecOut->Hi32;
4657 n[3] = overflow;
4658
4660
4661 /* round up the result */
4662 if (remainder >= 5)
4663 {
4664 for (remainder = 1, i = 0; i < ARRAY_SIZE(n) && remainder; i++)
4665 {
4666 ULONGLONG digit = n[i] + 1;
4667 remainder = (digit > 0xFFFFFFFF) ? 1 : 0;
4668 n[i] = digit & 0xFFFFFFFF;
4669 }
4670 }
4671
4672 pDecOut->Lo32 = n[0] ;
4673 pDecOut->Mid32 = n[1];
4674 pDecOut->Hi32 = n[2];
4675
4676 return S_OK;
4677 }
4678 }
4679
4680 if (overflow)
4681 return DISP_E_OVERFLOW; /* overflowed */
4682
4683 pDecOut->scale = pDecLeft->scale;
4684 pDecOut->sign = sign;
4685 }
4686 return hRet;
4687}
_ACRTIMP double __cdecl remainder(double, double)
Definition: remainder.c:75
static ULONG VARIANT_Add(ULONG ulLeft, ULONG ulRight, ULONG *pulHigh)
Definition: vartype.c:4512
static int VARIANT_DecCmp(const DECIMAL *pDecLeft, const DECIMAL *pDecRight)
Definition: vartype.c:4556
static ULONG VARIANT_Sub(ULONG ulLeft, ULONG ulRight, ULONG *pulHigh)
Definition: vartype.c:4522
static unsigned char VARIANT_int_divbychar(DWORD *p, unsigned int n, unsigned char divisor)
Definition: vartype.c:4720
static HRESULT VARIANT_DecScale(const DECIMAL **ppDecLeft, const DECIMAL **ppDecRight, DECIMAL pDecOut[2])
Definition: vartype.c:4430
GLdouble n
Definition: glext.h:7729
#define sign(x)
Definition: mapdesc.cc:613
#define cmp(status, error)
Definition: error.c:118
ULONG Lo32
Definition: compat.h:2283
ULONG Mid32
Definition: compat.h:2284
uint64_t ULONGLONG
Definition: typedefs.h:67
uint32_t ULONG
Definition: typedefs.h:59
#define DECIMAL_POS
Definition: variant.h:75

Referenced by test_VarDecAdd(), VarAdd(), and VarDecSub().

◆ VarDecCmp()

HRESULT WINAPI VarDecCmp ( const DECIMAL pDecLeft,
const DECIMAL pDecRight 
)

Definition at line 5891 of file vartype.c.

5892{
5893 HRESULT hRet;
5895
5896 if (!pDecLeft || !pDecRight)
5897 return VARCMP_NULL;
5898
5899 if ((!(pDecLeft->sign & DECIMAL_NEG)) && (pDecRight->sign & DECIMAL_NEG) &&
5900 (pDecLeft->Hi32 || pDecLeft->Lo64))
5901 return VARCMP_GT;
5902 else if ((pDecLeft->sign & DECIMAL_NEG) && (!(pDecRight->sign & DECIMAL_NEG)) &&
5903 (pDecLeft->Hi32 || pDecLeft->Lo64))
5904 return VARCMP_LT;
5905
5906 /* Subtract right from left, and compare the result to 0 */
5907 hRet = VarDecSub(pDecLeft, pDecRight, &result);
5908
5909 if (SUCCEEDED(hRet))
5910 {
5911 int non_zero = result.Hi32 || result.Lo64;
5912
5913 if ((result.sign & DECIMAL_NEG) && non_zero)
5914 hRet = (HRESULT)VARCMP_LT;
5915 else if (non_zero)
5916 hRet = (HRESULT)VARCMP_GT;
5917 else
5918 hRet = (HRESULT)VARCMP_EQ;
5919 }
5920 return hRet;
5921}
HRESULT WINAPI VarDecSub(const DECIMAL *pDecLeft, const DECIMAL *pDecRight, DECIMAL *pDecOut)
Definition: vartype.c:5702
#define VARCMP_NULL
Definition: oleauto.h:660

Referenced by test_VarDecCmp(), VarCmp(), and VarDecCmpR8().

◆ VarDecCmpR8()

HRESULT WINAPI VarDecCmpR8 ( const DECIMAL pDecLeft,
double  dblRight 
)

Definition at line 5937 of file vartype.c.

5938{
5939 HRESULT hRet;
5940 DECIMAL decRight;
5941
5942 hRet = VarDecFromR8(dblRight, &decRight);
5943
5944 if (SUCCEEDED(hRet))
5945 hRet = VarDecCmp(pDecLeft, &decRight);
5946
5947 return hRet;
5948}
HRESULT WINAPI VarDecCmp(const DECIMAL *pDecLeft, const DECIMAL *pDecRight)
Definition: vartype.c:5891
HRESULT WINAPI VarDecFromR8(double dblIn, DECIMAL *pDecOut)
Definition: vartype.c:4195

Referenced by test_VarDecCmpR8().

◆ VarDecDiv()

HRESULT WINAPI VarDecDiv ( const DECIMAL pDecLeft,
const DECIMAL pDecRight,
DECIMAL pDecOut 
)

Definition at line 5626 of file vartype.c.

5627{
5628 if (!pDecLeft || !pDecRight || !pDecOut) return E_INVALIDARG;
5629
5630 return VARIANT_do_division(pDecLeft, pDecRight, pDecOut, FALSE);
5631}
static HRESULT VARIANT_do_division(const DECIMAL *pDecLeft, const DECIMAL *pDecRight, DECIMAL *pDecOut, BOOL round)
Definition: vartype.c:5556

Referenced by test_VarDecDiv(), and VarDiv().

◆ VarDecFix()

HRESULT WINAPI VarDecFix ( const DECIMAL pDecIn,
DECIMAL pDecOut 
)

Definition at line 5747 of file vartype.c.

5748{
5749 double dbl;
5750 HRESULT hr;
5751
5752 if (pDecIn->sign & ~DECIMAL_NEG)
5753 return E_INVALIDARG;
5754
5755 if (!pDecIn->scale)
5756 {
5757 *pDecOut = *pDecIn; /* Already an integer */
5758 return S_OK;
5759 }
5760
5761 hr = VarR8FromDec(pDecIn, &dbl);
5762 if (SUCCEEDED(hr)) {
5763 LONGLONG rounded = dbl;
5764
5765 hr = VarDecFromI8(rounded, pDecOut);
5766 }
5767 return hr;
5768}
HRESULT hr
Definition: delayimp.cpp:582
HRESULT WINAPI VarDecFromI8(LONG64 llIn, DECIMAL *pDecOut)
Definition: vartype.c:4390

Referenced by VarDecInt(), and VarFix().

◆ VarDecFromBool()

HRESULT WINAPI VarDecFromBool ( VARIANT_BOOL  bIn,
DECIMAL pDecOut 
)

Definition at line 4306 of file vartype.c.

4307{
4308 pDecOut->Hi32 = 0;
4309 pDecOut->scale = 0;
4310 if (bIn)
4311 {
4312 pDecOut->sign = DECIMAL_NEG;
4313 pDecOut->Lo64 = 1;
4314 }
4315 else
4316 {
4317 pDecOut->sign = DECIMAL_POS;
4318 pDecOut->Lo64 = 0;
4319 }
4320 return S_OK;
4321}

Referenced by test_VarDecFromBool().

◆ VarDecFromCy()

HRESULT WINAPI VarDecFromCy ( CY  cyIn,
DECIMAL pDecOut 
)

Definition at line 4234 of file vartype.c.

4235{
4236 pDecOut->Hi32 = 0;
4237 pDecOut->scale = 4;
4238
4239 if (cyIn.int64 < 0)
4240 {
4241 pDecOut->sign = DECIMAL_NEG;
4242 pDecOut->Lo64 = -cyIn.int64;
4243 }
4244 else
4245 {
4246 pDecOut->sign = DECIMAL_POS;
4247 pDecOut->Lo64 = cyIn.int64;
4248 }
4249 return S_OK;
4250}

Referenced by test_VarDecFromCy(), and VARIANT_Coerce().

◆ VarDecFromDate()

HRESULT WINAPI VarDecFromDate ( DATE  dateIn,
DECIMAL pDecOut 
)

Definition at line 4217 of file vartype.c.

4218{
4219 return VarDecFromR8(dateIn, pDecOut);
4220}

Referenced by test_VarDecFromDate(), and VARIANT_Coerce().

◆ VarDecFromDisp()

HRESULT WINAPI VarDecFromDisp ( IDispatch pdispIn,
LCID  lcid,
DECIMAL pDecOut 
)

Definition at line 4286 of file vartype.c.

4287{
4288 return VARIANT_FromDisp(pdispIn, lcid, pDecOut, VT_DECIMAL, 0);
4289}
@ VT_DECIMAL
Definition: compat.h:2309

Referenced by VARIANT_Coerce().

◆ VarDecFromI1()

HRESULT WINAPI VarDecFromI1 ( signed char  cIn,
DECIMAL pDecOut 
)

Definition at line 4335 of file vartype.c.

4336{
4337 return VarDecFromI4(cIn, pDecOut);
4338}
HRESULT WINAPI VarDecFromI4(LONG lIn, DECIMAL *pDecOut)
Definition: vartype.c:4125

Referenced by test_VarDecFromI1(), and VARIANT_Coerce().

◆ VarDecFromI2()

HRESULT WINAPI VarDecFromI2 ( SHORT  sIn,
DECIMAL pDecOut 
)

Definition at line 4108 of file vartype.c.

4109{
4110 return VarDecFromI4(sIn, pDecOut);
4111}

Referenced by test_VarDecFromI2(), and VARIANT_Coerce().

◆ VarDecFromI4()

HRESULT WINAPI VarDecFromI4 ( LONG  lIn,
DECIMAL pDecOut 
)

Definition at line 4125 of file vartype.c.

4126{
4127 pDecOut->Hi32 = 0;
4128 pDecOut->Mid32 = 0;
4129 pDecOut->scale = 0;
4130
4131 if (lIn < 0)
4132 {
4133 pDecOut->sign = DECIMAL_NEG;
4134 pDecOut->Lo32 = -lIn;
4135 }
4136 else
4137 {
4138 pDecOut->sign = DECIMAL_POS;
4139 pDecOut->Lo32 = lIn;
4140 }
4141 return S_OK;
4142}

Referenced by test_marshal_VARIANT(), test_VarDecFromI4(), test_VarMod(), VarDecFromI1(), VarDecFromI2(), and VARIANT_Coerce().

◆ VarDecFromI8()

HRESULT WINAPI VarDecFromI8 ( LONG64  llIn,
DECIMAL pDecOut 
)

Definition at line 4390 of file vartype.c.

4391{
4392 pDecOut->Hi32 = 0;
4393 pDecOut->scale = 0;
4394
4395 if (llIn < 0)
4396 {
4397 pDecOut->sign = DECIMAL_NEG;
4398 pDecOut->Lo64 = -llIn;
4399 }
4400 else
4401 {
4402 pDecOut->sign = DECIMAL_POS;
4403 pDecOut->Lo64 = llIn;
4404 }
4405 return S_OK;
4406}

Referenced by test_VarDecFromI8(), VarDecFix(), VarDecInt(), and VARIANT_Coerce().

◆ VarDecFromR4()

HRESULT WINAPI VarDecFromR4 ( FLOAT  fltIn,
DECIMAL pDecOut 
)

Definition at line 4173 of file vartype.c.

4174{
4175 VARIANT_DI di;
4176 HRESULT hres;
4177
4178 hres = VARIANT_DI_FromR4(fltIn, &di);
4179 if (hres == S_OK) VARIANT_DecFromDI(&di, pDecOut);
4180 return hres;
4181}
static HRESULT VARIANT_DI_FromR4(float source, VARIANT_DI *dest)
Definition: vartype.c:5449
static void VARIANT_DecFromDI(const VARIANT_DI *from, DECIMAL *to)
Definition: vartype.c:4700

Referenced by test_VarDecFromR4(), and VARIANT_Coerce().

◆ VarDecFromR8()

HRESULT WINAPI VarDecFromR8 ( double  dblIn,
DECIMAL pDecOut 
)

Definition at line 4195 of file vartype.c.

4196{
4197 VARIANT_DI di;
4198 HRESULT hres;
4199
4200 hres = VARIANT_DI_FromR8(dblIn, &di);
4201 if (hres == S_OK) VARIANT_DecFromDI(&di, pDecOut);
4202 return hres;
4203}
static HRESULT VARIANT_DI_FromR8(double source, VARIANT_DI *dest)
Definition: vartype.c:5509

Referenced by test_VarAdd(), test_VarCat(), test_VarDecFromR8(), test_VarDiv(), test_VarIdiv(), test_VarImp(), test_VarMul(), test_VarPow(), test_VarSub(), VarDecCmpR8(), VarDecFromDate(), VARIANT_Coerce(), and VarRound().

◆ VarDecFromStr()

HRESULT WINAPI VarDecFromStr ( const OLECHAR strIn,
LCID  lcid,
ULONG  dwFlags,
DECIMAL pDecOut 
)

Definition at line 4267 of file vartype.c.

4268{
4269 return VARIANT_NumberFromBstr(strIn, lcid, dwFlags, pDecOut, VT_DECIMAL);
4270}

Referenced by test_VarDecFromStr(), and VARIANT_Coerce().

◆ VarDecFromUI1()

HRESULT WINAPI VarDecFromUI1 ( BYTE  bIn,
DECIMAL pDecOut 
)

Definition at line 4091 of file vartype.c.

4092{
4093 return VarDecFromUI4(bIn, pDecOut);
4094}
HRESULT WINAPI VarDecFromUI4(ULONG ulIn, DECIMAL *pDecOut)
Definition: vartype.c:4369

Referenced by test_VarDecFromUI1(), and VARIANT_Coerce().

◆ VarDecFromUI2()

HRESULT WINAPI VarDecFromUI2 ( USHORT  usIn,
DECIMAL pDecOut 
)

Definition at line 4352 of file vartype.c.

4353{
4354 return VarDecFromUI4(usIn, pDecOut);
4355}

Referenced by test_VarDecFromUI2(), and VARIANT_Coerce().

◆ VarDecFromUI4()

HRESULT WINAPI VarDecFromUI4 ( ULONG  ulIn,
DECIMAL pDecOut 
)

Definition at line 4369 of file vartype.c.

4370{
4371 pDecOut->sign = DECIMAL_POS;
4372 pDecOut->scale = 0;
4373 pDecOut->Hi32 = 0;
4374 pDecOut->Lo64 = ulIn;
4375 return S_OK;
4376}

Referenced by test_VarDecFromUI4(), VarDecFromUI1(), VarDecFromUI2(), and VARIANT_Coerce().

◆ VarDecFromUI8()

HRESULT WINAPI VarDecFromUI8 ( ULONG64  ullIn,
DECIMAL pDecOut 
)

Definition at line 4420 of file vartype.c.

4421{
4422 pDecOut->sign = DECIMAL_POS;
4423 pDecOut->scale = 0;
4424 pDecOut->Hi32 = 0;
4425 pDecOut->Lo64 = ullIn;
4426 return S_OK;
4427}

Referenced by test_VarDecFromUI8(), and VARIANT_Coerce().

◆ VarDecInt()

HRESULT WINAPI VarDecInt ( const DECIMAL pDecIn,
DECIMAL pDecOut 
)

Definition at line 5787 of file vartype.c.

5788{
5789 double dbl;
5790 HRESULT hr;
5791
5792 if (pDecIn->sign & ~DECIMAL_NEG)
5793 return E_INVALIDARG;
5794
5795 if (!(pDecIn->sign & DECIMAL_NEG) || !pDecIn->scale)
5796 return VarDecFix(pDecIn, pDecOut); /* The same, if +ve or no fractionals */
5797
5798 hr = VarR8FromDec(pDecIn, &dbl);
5799 if (SUCCEEDED(hr)) {
5800 LONGLONG rounded = dbl >= 0.0 ? dbl + 0.5 : dbl - 0.5;
5801
5802 hr = VarDecFromI8(rounded, pDecOut);
5803 }
5804 return hr;
5805}
HRESULT WINAPI VarDecFix(const DECIMAL *pDecIn, DECIMAL *pDecOut)
Definition: vartype.c:5747

Referenced by VarInt().

◆ VarDecMul()

HRESULT WINAPI VarDecMul ( const DECIMAL pDecLeft,
const DECIMAL pDecRight,
DECIMAL pDecOut 
)

Definition at line 5647 of file vartype.c.

5648{
5649 HRESULT hRet = S_OK;
5650 VARIANT_DI di_left, di_right, di_result;
5651 int mulresult;
5652
5653 VARIANT_DIFromDec(pDecLeft, &di_left);
5654 VARIANT_DIFromDec(pDecRight, &di_right);
5655 mulresult = VARIANT_DI_mul(&di_left, &di_right, &di_result);
5656 if (mulresult)
5657 {
5658 /* multiplication actually overflowed */
5659 hRet = DISP_E_OVERFLOW;
5660 }
5661 else
5662 {
5663 if (di_result.scale > DEC_MAX_SCALE)
5664 {
5665 /* multiplication underflowed. In order to comply with the MSDN
5666 specifications for DECIMAL ranges, some significant digits
5667 must be removed
5668 */
5669 WARN("result scale is %u, scaling (with loss of significant digits)...\n",
5670 di_result.scale);
5671 while (di_result.scale > DEC_MAX_SCALE &&
5672 !VARIANT_int_iszero(di_result.bitsnum, ARRAY_SIZE(di_result.bitsnum)))
5673 {
5674 VARIANT_int_divbychar(di_result.bitsnum, ARRAY_SIZE(di_result.bitsnum), 10);
5675 di_result.scale--;
5676 }
5677 if (di_result.scale > DEC_MAX_SCALE)
5678 {
5679 WARN("result underflowed, setting to 0\n");
5680 di_result.scale = 0;
5681 di_result.sign = 0;
5682 }
5683 }
5684 VARIANT_DecFromDI(&di_result, pDecOut);
5685 }
5686 return hRet;
5687}
static BOOL VARIANT_int_iszero(const DWORD *p, unsigned int n)
Definition: vartype.c:4745
static int VARIANT_DI_mul(const VARIANT_DI *a, const VARIANT_DI *b, VARIANT_DI *result)
Definition: vartype.c:4756

Referenced by test_VarDecMul(), VarDecRound(), VARIANT_DecScale(), and VarMul().

◆ VarDecNeg()

HRESULT WINAPI VarDecNeg ( const DECIMAL pDecIn,
DECIMAL pDecOut 
)

Definition at line 5819 of file vartype.c.

5820{
5821 *pDecOut = *pDecIn;
5822 pDecOut->sign ^= DECIMAL_NEG;
5823 return S_OK;
5824}

Referenced by test_VarDecNeg(), VarDecSub(), and VarNeg().

◆ VarDecRound()

HRESULT WINAPI VarDecRound ( const DECIMAL pDecIn,
int  cDecimals,
DECIMAL pDecOut 
)

Definition at line 5840 of file vartype.c.

5841{
5842 DECIMAL divisor, tmp;
5843 HRESULT hr;
5844 unsigned int i;
5845
5846 if (cDecimals < 0 || (pDecIn->sign & ~DECIMAL_NEG) || pDecIn->scale > DEC_MAX_SCALE)
5847 return E_INVALIDARG;
5848
5849 if (cDecimals >= pDecIn->scale)
5850 {
5851 *pDecOut = *pDecIn; /* More precision than we have */
5852 return S_OK;
5853 }
5854
5855 /* truncate significant digits and rescale */
5856 memset(&divisor, 0, sizeof(divisor));
5857 divisor.Lo64 = 1;
5858
5859 memset(&tmp, 0, sizeof(tmp));
5860 tmp.Lo64 = 10;
5861 for (i = 0; i < pDecIn->scale - cDecimals; ++i)
5862 {
5863 hr = VarDecMul(&divisor, &tmp, &divisor);
5864 if (FAILED(hr))
5865 return hr;
5866 }
5867
5868 hr = VARIANT_do_division(pDecIn, &divisor, pDecOut, TRUE);
5869 if (FAILED(hr))
5870 return hr;
5871
5872 pDecOut->scale = cDecimals;
5873
5874 return S_OK;
5875}
HRESULT WINAPI VarDecMul(const DECIMAL *pDecLeft, const DECIMAL *pDecRight, DECIMAL *pDecOut)
Definition: vartype.c:5647
GLuint divisor
Definition: glext.h:6313
#define FAILED(hr)
Definition: intsafe.h:51

Referenced by test_VarDecRound(), and VarCyFromDec().

◆ VarDecSub()

HRESULT WINAPI VarDecSub ( const DECIMAL pDecLeft,
const DECIMAL pDecRight,
DECIMAL pDecOut 
)

Definition at line 5702 of file vartype.c.

5703{
5704 DECIMAL decRight;
5705
5706 /* Implement as addition of the negative */
5707 VarDecNeg(pDecRight, &decRight);
5708 return VarDecAdd(pDecLeft, &decRight, pDecOut);
5709}
HRESULT WINAPI VarDecAdd(const DECIMAL *pDecLeft, const DECIMAL *pDecRight, DECIMAL *pDecOut)
Definition: vartype.c:4580
HRESULT WINAPI VarDecNeg(const DECIMAL *pDecIn, DECIMAL *pDecOut)
Definition: vartype.c:5819

Referenced by test_VarDecSub(), VarDecCmp(), and VarSub().

◆ VarI1FromBool()

HRESULT WINAPI VarI1FromBool ( VARIANT_BOOL  boolIn,
signed char pcOut 
)

Definition at line 459 of file vartype.c.

460{
461 return _VarI1FromBool(boolIn, pcOut);
462}

Referenced by test_VarI1FromBool(), and VARIANT_Coerce().

◆ VarI1FromCy()

HRESULT WINAPI VarI1FromCy ( CY  cyIn,
signed char pcOut 
)

Definition at line 396 of file vartype.c.

397{
398 LONG i = I1_MAX + 1;
399
400 VarI4FromCy(cyIn, &i);
401 return _VarI1FromI4(i, pcOut);
402}
HRESULT WINAPI VarI4FromCy(CY cyIn, LONG *piOut)
Definition: vartype.c:1564
long LONG
Definition: pedump.c:60
#define I1_MAX
Definition: variant.h:51

Referenced by test_VarI1FromCy(), and VARIANT_Coerce().

◆ VarI1FromDate()

HRESULT WINAPI VarI1FromDate ( DATE  dateIn,
signed char pcOut 
)

Definition at line 377 of file vartype.c.

378{
379 return VarI1FromR8(dateIn, pcOut);
380}
HRESULT WINAPI VarI1FromR8(double dblIn, signed char *pcOut)
Definition: vartype.c:355

Referenced by test_VarI1FromDate(), and VARIANT_Coerce().

◆ VarI1FromDec()

HRESULT WINAPI VarI1FromDec ( const DECIMAL pdecIn,
signed char pcOut 
)

Definition at line 517 of file vartype.c.

518{
519 LONG64 i64;
520 HRESULT hRet;
521
522 hRet = VarI8FromDec(pdecIn, &i64);
523
524 if (SUCCEEDED(hRet))
525 hRet = _VarI1FromI8(i64, pcOut);
526 return hRet;
527}
HRESULT WINAPI VarI8FromDec(const DECIMAL *pdecIn, LONG64 *pi64Out)
Definition: vartype.c:2329

Referenced by test_VarI1FromDec(), and VARIANT_Coerce().

◆ VarI1FromDisp()

HRESULT WINAPI VarI1FromDisp ( IDispatch pdispIn,
LCID  lcid,
signed char pcOut 
)

Definition at line 442 of file vartype.c.

443{
444 return VARIANT_FromDisp(pdispIn, lcid, pcOut, VT_I1, 0);
445}
@ VT_I1
Definition: compat.h:2310

Referenced by VARIANT_Coerce().

◆ VarI1FromI2()

HRESULT WINAPI VarI1FromI2 ( SHORT  sIn,
signed char pcOut 
)

Definition at line 295 of file vartype.c.

296{
297 return _VarI1FromI2(sIn, pcOut);
298}

Referenced by test_VarI1FromI2(), and VARIANT_Coerce().

◆ VarI1FromI4()

HRESULT WINAPI VarI1FromI4 ( LONG  iIn,
signed char pcOut 
)

Definition at line 314 of file vartype.c.

315{
316 return _VarI1FromI4(iIn, pcOut);
317}

Referenced by test_VarI1FromI4(), and VARIANT_Coerce().

◆ VarI1FromI8()

HRESULT WINAPI VarI1FromI8 ( LONG64  llIn,
signed char pcOut 
)

Definition at line 543 of file vartype.c.

544{
545 return _VarI1FromI8(llIn, pcOut);
546}

Referenced by test_VarI1FromI8(), and VARIANT_Coerce().

◆ VarI1FromR4()

HRESULT WINAPI VarI1FromR4 ( FLOAT  fltIn,
signed char pcOut 
)

Definition at line 333 of file vartype.c.

334{
335 return VarI1FromR8(fltIn, pcOut);
336}

Referenced by test_VarI1FromR4(), and VARIANT_Coerce().

◆ VarI1FromR8()

HRESULT WINAPI VarI1FromR8 ( double  dblIn,
signed char pcOut 
)

Definition at line 355 of file vartype.c.

356{
357 if (dblIn < I1_MIN - 0.5 || dblIn >= I1_MAX + 0.5)
358 return DISP_E_OVERFLOW;
359 VARIANT_DutchRound(CHAR, dblIn, *pcOut);
360 return S_OK;
361}

Referenced by test_VarI1FromR8(), VarI1FromDate(), VarI1FromR4(), and VARIANT_Coerce().

◆ VarI1FromStr()

HRESULT WINAPI VarI1FromStr ( const OLECHAR strIn,
LCID  lcid,
ULONG  dwFlags,
signed char pcOut 
)

Definition at line 421 of file vartype.c.

422{
423 return VARIANT_NumberFromBstr(strIn, lcid, dwFlags, pcOut, VT_I1);
424}

Referenced by test_VarI1FromStr(), and VARIANT_Coerce().

◆ VarI1FromUI1()

HRESULT WINAPI VarI1FromUI1 ( BYTE  bIn,
signed char pcOut 
)

Definition at line 276 of file vartype.c.

277{
278 return _VarI1FromUI1(bIn, pcOut);
279}

Referenced by test_VarI1FromUI1().

◆ VarI1FromUI2()

HRESULT WINAPI VarI1FromUI2 ( USHORT  usIn,
signed char pcOut 
)

Definition at line 478 of file vartype.c.

479{
480 return _VarI1FromUI2(usIn, pcOut);
481}

Referenced by test_VarI1FromUI2(), and VARIANT_Coerce().

◆ VarI1FromUI4()

HRESULT WINAPI VarI1FromUI4 ( ULONG  ulIn,
signed char pcOut 
)

Definition at line 498 of file vartype.c.

499{
500 return _VarI1FromUI4(ulIn, pcOut);
501}

Referenced by test_VarI1FromUI4(), and VARIANT_Coerce().

◆ VarI1FromUI8()

HRESULT WINAPI VarI1FromUI8 ( ULONG64  ullIn,
signed char pcOut 
)

Definition at line 562 of file vartype.c.

563{
564 return _VarI1FromUI8(ullIn, pcOut);
565}

Referenced by test_VarI1FromUI8(), and VARIANT_Coerce().

◆ VarI2FromBool()

HRESULT WINAPI VarI2FromBool ( VARIANT_BOOL  boolIn,
SHORT psOut 
)

Definition at line 1053 of file vartype.c.

1054{
1055 return _VarI2FromBool(boolIn, psOut);
1056}

Referenced by test_VarI2FromBool(), and VARIANT_Coerce().

◆ VarI2FromCy()

HRESULT WINAPI VarI2FromCy ( CY  cyIn,
SHORT psOut 
)

Definition at line 972 of file vartype.c.

973{
974 LONG i = I2_MAX + 1;
975
976 VarI4FromCy(cyIn, &i);
977 return _VarI2FromI4(i, psOut);
978}
#define I2_MAX
Definition: variant.h:55

Referenced by test_VarI2FromCy(), and VARIANT_Coerce().

◆ VarI2FromDate()

HRESULT WINAPI VarI2FromDate ( DATE  dateIn,
SHORT psOut 
)

Definition at line 993 of file vartype.c.

994{
995 return VarI2FromR8(dateIn, psOut);
996}
HRESULT WINAPI VarI2FromR8(double dblIn, SHORT *psOut)
Definition: vartype.c:951

Referenced by test_VarI2FromDate(), and VARIANT_Coerce().

◆ VarI2FromDec()

HRESULT WINAPI VarI2FromDec ( const DECIMAL pdecIn,
SHORT psOut 
)

Definition at line 1125 of file vartype.c.

1126{
1127 LONG64 i64;
1128 HRESULT hRet;
1129
1130 hRet = VarI8FromDec(pdecIn, &i64);
1131
1132 if (SUCCEEDED(hRet))
1133 hRet = _VarI2FromI8(i64, psOut);
1134 return hRet;
1135}

Referenced by test_VarI2FromDec(), and VARIANT_Coerce().

◆ VarI2FromDisp()

HRESULT WINAPI VarI2FromDisp ( IDispatch pdispIn,
LCID  lcid,
SHORT psOut 
)

Definition at line 1036 of file vartype.c.

1037{
1038 return VARIANT_FromDisp(pdispIn, lcid, psOut, VT_I2, 0);
1039}
@ VT_I2
Definition: compat.h:2297

Referenced by VARIANT_Coerce().

◆ VarI2FromI1()

HRESULT WINAPI VarI2FromI1 ( signed char  cIn,
SHORT psOut 
)

Definition at line 1070 of file vartype.c.

1071{
1072 return _VarI2FromI1(cIn, psOut);
1073}

Referenced by test_VarI2FromI1(), and VARIANT_Coerce().

◆ VarI2FromI4()

HRESULT WINAPI VarI2FromI4 ( LONG  iIn,
SHORT psOut 
)

Definition at line 912 of file vartype.c.

913{
914 return _VarI2FromI4(iIn, psOut);
915}

Referenced by test_VarI2FromI4(), and VARIANT_Coerce().

◆ VarI2FromI8()

HRESULT WINAPI VarI2FromI8 ( LONG64  llIn,
SHORT psOut 
)

Definition at line 1150 of file vartype.c.

1151{
1152 return _VarI2FromI8(llIn, psOut);
1153}

Referenced by test_VarI2FromI8(), and VARIANT_Coerce().

◆ VarI2FromR4()

HRESULT WINAPI VarI2FromR4 ( FLOAT  fltIn,
SHORT psOut 
)

Definition at line 930 of file vartype.c.

931{
932 return VarI2FromR8(fltIn, psOut);
933}

Referenced by test_VarI2FromR4(), and VARIANT_Coerce().

◆ VarI2FromR8()

HRESULT WINAPI VarI2FromR8 ( double  dblIn,
SHORT psOut 
)

Definition at line 951 of file vartype.c.

952{
953 if (dblIn < I2_MIN - 0.5 || dblIn >= I2_MAX + 0.5)
954 return DISP_E_OVERFLOW;
955 VARIANT_DutchRound(SHORT, dblIn, *psOut);
956 return S_OK;
957}
short SHORT
Definition: pedump.c:59

Referenced by test_VarI2FromR8(), VarI2FromDate(), VarI2FromR4(), and VARIANT_Coerce().

◆ VarI2FromStr()

HRESULT WINAPI VarI2FromStr ( const OLECHAR strIn,
LCID  lcid,
ULONG  dwFlags,
SHORT psOut 
)

Definition at line 1015 of file vartype.c.

1016{
1017 return VARIANT_NumberFromBstr(strIn, lcid, dwFlags, psOut, VT_I2);
1018}

Referenced by test_VarI2FromStr(), and VARIANT_Coerce().

◆ VarI2FromUI1()

HRESULT WINAPI VarI2FromUI1 ( BYTE  bIn,
SHORT psOut 
)

Definition at line 894 of file vartype.c.

895{
896 return _VarI2FromUI1(bIn, psOut);
897}

Referenced by test_VarI2FromUI1(), and VARIANT_Coerce().

◆ VarI2FromUI2()

HRESULT WINAPI VarI2FromUI2 ( USHORT  usIn,
SHORT psOut 
)

Definition at line 1088 of file vartype.c.

1089{
1090 return _VarI2FromUI2(usIn, psOut);
1091}

Referenced by test_VarI2FromUI2().

◆ VarI2FromUI4()

HRESULT WINAPI VarI2FromUI4 ( ULONG  ulIn,
SHORT psOut 
)

Definition at line 1106 of file vartype.c.

1107{
1108 return _VarI2FromUI4(ulIn, psOut);
1109}

Referenced by test_VarI2FromUI4(), and VARIANT_Coerce().

◆ VarI2FromUI8()

HRESULT WINAPI VarI2FromUI8 ( ULONG64  ullIn,
SHORT psOut 
)

Definition at line 1168 of file vartype.c.

1169{
1170 return _VarI2FromUI8(ullIn, psOut);
1171}

Referenced by test_VarI2FromUI8(), and VARIANT_Coerce().

◆ VarI4FromBool()

HRESULT WINAPI VarI4FromBool ( VARIANT_BOOL  boolIn,
LONG piOut 
)

Definition at line 1643 of file vartype.c.

1644{
1645 return _VarI4FromBool(boolIn, piOut);
1646}

Referenced by test_VarI4FromBool(), and VARIANT_Coerce().

◆ VarI4FromCy()

HRESULT WINAPI VarI4FromCy ( CY  cyIn,
LONG piOut 
)

Definition at line 1564 of file vartype.c.

1565{
1566 double d = cyIn.int64 / CY_MULTIPLIER_F;
1567 return VarI4FromR8(d, piOut);
1568}
HRESULT WINAPI VarI4FromR8(double dblIn, LONG *piOut)
Definition: vartype.c:1543

Referenced by test_VarI4FromCy(), VarI1FromCy(), VarI2FromCy(), VARIANT_Coerce(), and VarNot().

◆ VarI4FromDate()

HRESULT WINAPI VarI4FromDate ( DATE  dateIn,
LONG piOut 
)

Definition at line 1583 of file vartype.c.

1584{
1585 return VarI4FromR8(dateIn, piOut);
1586}

Referenced by test_VarI4FromDate(), and VARIANT_Coerce().

◆ VarI4FromDec()

HRESULT WINAPI VarI4FromDec ( const DECIMAL pdecIn,
LONG piOut 
)

Definition at line 1714 of file vartype.c.

1715{
1716 LONG64 i64;
1717 HRESULT hRet;
1718
1719 hRet = VarI8FromDec(pdecIn, &i64);
1720
1721 if (SUCCEEDED(hRet))
1722 hRet = _VarI4FromI8(i64, piOut);
1723 return hRet;
1724}

Referenced by test_VarI4FromDec(), VARIANT_Coerce(), and VarNot().

◆ VarI4FromDisp()

HRESULT WINAPI VarI4FromDisp ( IDispatch pdispIn,
LCID  lcid,
LONG piOut 
)

Definition at line 1626 of file vartype.c.

1627{
1628 return VARIANT_FromDisp(pdispIn, lcid, piOut, VT_I4, 0);
1629}
@ VT_I4
Definition: compat.h:2298

Referenced by VARIANT_Coerce().

◆ VarI4FromI1()

HRESULT WINAPI VarI4FromI1 ( signed char  cIn,
LONG piOut 
)

Definition at line 1660 of file vartype.c.

1661{
1662 return _VarI4FromI1(cIn, piOut);
1663}

Referenced by test_VarI4FromI1(), and VARIANT_Coerce().

◆ VarI4FromI2()

HRESULT WINAPI VarI4FromI2 ( SHORT  sIn,
LONG piOut 
)

Definition at line 1504 of file vartype.c.

1505{
1506 return _VarI4FromI2(sIn, piOut);
1507}

Referenced by test_VarI4FromI2(), and VARIANT_Coerce().

◆ VarI4FromI8()

HRESULT WINAPI VarI4FromI8 ( LONG64  llIn,
LONG piOut 
)

Definition at line 1739 of file vartype.c.

1740{
1741 return _VarI4FromI8(llIn, piOut);
1742}

Referenced by test_VarI4FromI8(), and VARIANT_Coerce().

◆ VarI4FromR4()

HRESULT WINAPI VarI4FromR4 ( FLOAT  fltIn,
LONG piOut 
)

Definition at line 1522 of file vartype.c.

1523{
1524 return VarI4FromR8(fltIn, piOut);
1525}

Referenced by test_VarI4FromR4(), VARIANT_Coerce(), and VarNot().

◆ VarI4FromR8()

HRESULT WINAPI VarI4FromR8 ( double  dblIn,
LONG piOut 
)

Definition at line 1543 of file vartype.c.

1544{
1545 if (dblIn < I4_MIN - 0.5 || dblIn >= I4_MAX + 0.5)
1546 return DISP_E_OVERFLOW;
1547 VARIANT_DutchRound(LONG, dblIn, *piOut);
1548 return S_OK;
1549}
#define I4_MAX
Definition: variant.h:59

Referenced by test_VarI4FromR8(), VarI4FromCy(), VarI4FromDate(), VarI4FromR4(), VARIANT_Coerce(), and VarNot().

◆ VarI4FromStr()

HRESULT WINAPI VarI4FromStr ( const OLECHAR strIn,
LCID  lcid,
ULONG  dwFlags,
LONG piOut 
)

Definition at line 1605 of file vartype.c.

1606{
1607 return VARIANT_NumberFromBstr(strIn, lcid, dwFlags, piOut, VT_I4);
1608}

Referenced by test_VarI4FromStr(), var_to_size(), and VARIANT_Coerce().

◆ VarI4FromUI1()

HRESULT WINAPI VarI4FromUI1 ( BYTE  bIn,
LONG piOut 
)

Definition at line 1485 of file vartype.c.

1486{
1487 return _VarI4FromUI1(bIn, piOut);
1488}

Referenced by test_VarI4FromUI1(), and VARIANT_Coerce().

◆ VarI4FromUI2()

HRESULT WINAPI VarI4FromUI2 ( USHORT  usIn,
LONG piOut 
)

Definition at line 1677 of file vartype.c.

1678{
1679 return _VarI4FromUI2(usIn, piOut);
1680}

Referenced by test_VarI4FromUI2(), and VARIANT_Coerce().

◆ VarI4FromUI4()

HRESULT WINAPI VarI4FromUI4 ( ULONG  ulIn,
LONG piOut 
)

Definition at line 1695 of file vartype.c.

1696{
1697 return _VarI4FromUI4(ulIn, piOut);
1698}

Referenced by test_VarI4FromUI4().

◆ VarI4FromUI8()

HRESULT WINAPI VarI4FromUI8 ( ULONG64  ullIn,
LONG piOut 
)

Definition at line 1757 of file vartype.c.

1758{
1759 return _VarI4FromUI8(ullIn, piOut);
1760}

Referenced by test_VarI4FromUI8(), and VARIANT_Coerce().

◆ VarI8FromBool()

HRESULT WINAPI VarI8FromBool ( VARIANT_BOOL  boolIn,
LONG64 pi64Out 
)

Definition at line 2259 of file vartype.c.

2260{
2261 return VarI8FromI2(boolIn, pi64Out);
2262}
HRESULT WINAPI VarI8FromI2(SHORT sIn, LONG64 *pi64Out)
Definition: vartype.c:2087

Referenced by test_VarI8FromBool(), and VARIANT_Coerce().

◆ VarI8FromCy()

HRESULT WINAPI VarI8FromCy ( CY  cyIn,
LONG64 pi64Out 
)

Definition at line 2168 of file vartype.c.

2169{
2170 *pi64Out = cyIn.int64 / CY_MULTIPLIER;
2171
2172 if (cyIn.int64 < 0)
2173 (*pi64Out)--; /* Mimic Win32 bug */
2174 else
2175 {
2176 cyIn.int64 -= *pi64Out * CY_MULTIPLIER; /* cyIn.Lo now holds fractional remainder */
2177
2178 if (cyIn.Lo > CY_HALF || (cyIn.Lo == CY_HALF && (*pi64Out & 0x1)))
2179 (*pi64Out)++;
2180 }
2181 return S_OK;
2182}
#define CY_HALF
Definition: vartype.c:37

Referenced by test_VarI8FromCy(), and VARIANT_Coerce().

◆ VarI8FromDate()

HRESULT WINAPI VarI8FromDate ( DATE  dateIn,
LONG64 pi64Out 
)

Definition at line 2199 of file vartype.c.

2200{
2201 return VarI8FromR8(dateIn, pi64Out);
2202}
HRESULT WINAPI VarI8FromR8(double dblIn, LONG64 *pi64Out)
Definition: vartype.c:2142

Referenced by test_VarI8FromDate(), and VARIANT_Coerce().

◆ VarI8FromDec()

HRESULT WINAPI VarI8FromDec ( const DECIMAL pdecIn,
LONG64 pi64Out 
)

Definition at line 2329 of file vartype.c.

2330{
2331 if (!pdecIn->scale)
2332 {
2333 /* This decimal is just a 96 bit integer */
2334 if (pdecIn->sign & ~DECIMAL_NEG)
2335 return E_INVALIDARG;
2336
2337 if (pdecIn->Hi32 || pdecIn->Mid32 & 0x80000000)
2338 return DISP_E_OVERFLOW;
2339
2340 if (pdecIn->sign)
2341 *pi64Out = -pdecIn->Lo64;
2342 else
2343 *pi64Out = pdecIn->Lo64;
2344 return S_OK;
2345 }
2346 else
2347 {
2348 /* Decimal contains a floating point number */
2349 HRESULT hRet;
2350 double dbl;
2351
2352 hRet = VarR8FromDec(pdecIn, &dbl);
2353 if (SUCCEEDED(hRet))
2354 hRet = VarI8FromR8(dbl, pi64Out);
2355 return hRet;
2356 }
2357}

Referenced by test_VarI8FromDec(), VarI1FromDec(), VarI2FromDec(), VarI4FromDec(), VARIANT_Coerce(), VarUI1FromDec(), VarUI2FromDec(), and VarUI4FromDec().

◆ VarI8FromDisp()

HRESULT WINAPI VarI8FromDisp ( IDispatch pdispIn,
LCID  lcid,
LONG64 pi64Out 
)

Definition at line 2242 of file vartype.c.

2243{
2244 return VARIANT_FromDisp(pdispIn, lcid, pi64Out, VT_I8, 0);
2245}
@ VT_I8
Definition: compat.h:2314

Referenced by VARIANT_Coerce().

◆ VarI8FromI1()

HRESULT WINAPI VarI8FromI1 ( signed char  cIn,
LONG64 pi64Out 
)

Definition at line 2276 of file vartype.c.

2277{
2278 return _VarI8FromI1(cIn, pi64Out);
2279}

Referenced by test_VarI8FromI1(), and VARIANT_Coerce().

◆ VarI8FromI2()

HRESULT WINAPI VarI8FromI2 ( SHORT  sIn,
LONG64 pi64Out 
)

Definition at line 2087 of file vartype.c.

2088{
2089 return _VarI8FromI2(sIn, pi64Out);
2090}

Referenced by test_VarI8FromI2(), VarI8FromBool(), VARIANT_Coerce(), and VarUI8FromBool().

◆ VarI8FromR4()

HRESULT WINAPI VarI8FromR4 ( FLOAT  fltIn,
LONG64 pi64Out 
)

Definition at line 2106 of file vartype.c.

2107{
2108 return VarI8FromR8(fltIn, pi64Out);
2109}

Referenced by test_VarI8FromR4(), and VARIANT_Coerce().

◆ VarI8FromR8()

HRESULT WINAPI VarI8FromR8 ( double  dblIn,
LONG64 pi64Out 
)

Definition at line 2142 of file vartype.c.

2143{
2144 if ( dblIn < -4611686018427387904.0 || dblIn >= 4611686018427387904.0)
2145 return DISP_E_OVERFLOW;
2146 VARIANT_DutchRound(LONG64, dblIn, *pi64Out);
2147 return S_OK;
2148}

Referenced by test_VarI8FromR8(), VarI8FromDate(), VarI8FromDec(), VarI8FromR4(), and VARIANT_Coerce().

◆ VarI8FromStr()

HRESULT WINAPI VarI8FromStr ( const OLECHAR strIn,
LCID  lcid,
ULONG  dwFlags,
LONG64 pi64Out 
)

Definition at line 2221 of file vartype.c.

2222{
2223 return VARIANT_NumberFromBstr(strIn, lcid, dwFlags, pi64Out, VT_I8);
2224}

Referenced by test_VarI8FromStr(), and VARIANT_Coerce().

◆ VarI8FromUI1()

HRESULT WINAPI VarI8FromUI1 ( BYTE  bIn,
LONG64 pi64Out 
)

Definition at line 2069 of file vartype.c.

2070{
2071 return _VarI8FromUI1(bIn, pi64Out);
2072}

Referenced by test_VarI8FromUI1(), and VARIANT_Coerce().

◆ VarI8FromUI2()

HRESULT WINAPI VarI8FromUI2 ( USHORT  usIn,
LONG64 pi64Out 
)

Definition at line 2293 of file vartype.c.

2294{
2295 return _VarI8FromUI2(usIn, pi64Out);
2296}

Referenced by test_VarI8FromUI2(), and VARIANT_Coerce().

◆ VarI8FromUI4()

HRESULT WINAPI VarI8FromUI4 ( ULONG  ulIn,
LONG64 pi64Out 
)

Definition at line 2310 of file vartype.c.

2311{
2312 return _VarI8FromUI4(ulIn, pi64Out);
2313}

Referenced by test_VarI8FromUI4(), and VARIANT_Coerce().

◆ VarI8FromUI8()

HRESULT WINAPI VarI8FromUI8 ( ULONG64  ullIn,
LONG64 pi64Out 
)

Definition at line 2372 of file vartype.c.

2373{
2374 return _VarI8FromUI8(ullIn, pi64Out);
2375}

Referenced by test_VarI8FromUI8().

◆ VARIANT_Add()

static ULONG VARIANT_Add ( ULONG  ulLeft,
ULONG  ulRight,
ULONG pulHigh 
)
static

Definition at line 4512 of file vartype.c.

4513{
4514 ULARGE_INTEGER ul64;
4515
4516 ul64.QuadPart = (ULONG64)ulLeft + (ULONG64)ulRight + (ULONG64)*pulHigh;
4517 *pulHigh = ul64.HighPart;
4518 return ul64.LowPart;
4519}
$ULONG LowPart
Definition: ntbasedef.h:581
ULONGLONG QuadPart
Definition: ms-dtyp.idl:185
$ULONG HighPart
Definition: ntbasedef.h:582

Referenced by VarDecAdd(), and VARIANT_DI_mul().

◆ VARIANT_BstrFromReal()

static HRESULT VARIANT_BstrFromReal ( DOUBLE  dblIn,
LCID  lcid,
ULONG  dwFlags,
BSTR pbstrOut,
int  ndigits 
)
static

Definition at line 6540 of file vartype.c.

6542{
6543#ifndef __REACTOS__
6545#endif
6546 WCHAR *e, buff[256];
6547 int len;
6548
6549 if (!pbstrOut)
6550 return E_INVALIDARG;
6551
6552#ifdef __REACTOS__ /* FIXME: Inspect */
6553 len = swprintf(buff, ARRAY_SIZE(buff), L"%.*G", ndigits, dblIn);
6554#else
6555 if (!(locale = _create_locale(LC_ALL, "C"))) return E_OUTOFMEMORY;
6556 len = _swprintf_l(buff, ARRAY_SIZE(buff), L"%.*G", locale, ndigits, dblIn);
6557#endif
6558 e = wcschr(buff, 'E');
6559 if (e)
6560 {
6561 int extra_decimals;
6562 WCHAR *dot;
6563
6564 dot = wcschr(buff, '.');
6565 extra_decimals = dot ? e - dot - 2 : 0;
6566 if (labs(wcstol(e+1, NULL, 10)) + extra_decimals < ndigits)
6567 {
6568#ifdef __REACTOS__ /* FIXME: Inspect */
6569 len = swprintf(buff, ARRAY_SIZE(buff), L"%.*f", ndigits, dblIn);
6570#else
6571 len = _swprintf_l(buff, ARRAY_SIZE(buff), L"%.*f", locale, ndigits, dblIn);
6572#endif
6573 while (len > 0 && (buff[len-1] == '0')) len--;
6574 }
6575 }
6576 buff[len] = 0;
6577#ifndef __REACTOS__
6579#endif
6580
6581 /* Negative zeroes are disallowed (some applications depend on this).
6582 If buff starts with a minus, and then nothing follows but zeroes
6583 and/or a period, it is a negative zero and is replaced with a
6584 canonical zero. This duplicates native oleaut32 behavior.
6585 */
6586 if (buff[0] == '-')
6587 {
6588 if (lstrlenW(buff + 1) == wcsspn(buff + 1, L"0."))
6589 { buff[0] = '0'; buff[1] = '\0'; }
6590 }
6591
6592 TRACE("created string %s\n", debugstr_w(buff));
6593 if (dwFlags & LOCALE_USE_NLS)
6594 {
6595 WCHAR numbuff[256];
6596
6597 /* Format the number for the locale */
6598 numbuff[0] = '\0';
6600 buff, NULL, numbuff, ARRAY_SIZE(numbuff));
6601 TRACE("created NLS string %s\n", debugstr_w(numbuff));
6602 *pbstrOut = SysAllocString(numbuff);
6603 }
6604 else
6605 {
6607 }
6608 return *pbstrOut ? S_OK : E_OUTOFMEMORY;
6609}
Definition: _locale.h:75
#define wcschr
Definition: compat.h:17
_ACRTIMP __msvcrt_long __cdecl wcstol(const wchar_t *, wchar_t **, int)
Definition: wcs.c:2752
_ACRTIMP size_t __cdecl wcsspn(const wchar_t *, const wchar_t *)
Definition: wcs.c:513
_ACRTIMP void __cdecl _free_locale(_locale_t)
Definition: locale.c:1183
_ACRTIMP _locale_t __cdecl _create_locale(int, const char *)
Definition: locale.c:1981
#define LC_ALL
Definition: locale.h:25
_ACRTIMP __msvcrt_long __cdecl labs(__msvcrt_long)
Definition: math.c:680
#define swprintf
Definition: precomp.h:40
static size_t double int ndigits
Definition: printf.c:52

Referenced by VarBstrFromR4(), and VarBstrFromR8().

◆ VARIANT_BstrFromUInt()

static HRESULT VARIANT_BstrFromUInt ( ULONG64  ulVal,
LCID  lcid,
DWORD  dwFlags,
BSTR pbstrOut 
)
static

Definition at line 6386 of file vartype.c.

6387{
6388 WCHAR szBuff[64], *szOut = szBuff + ARRAY_SIZE(szBuff) - 1;
6389
6390 if (!pbstrOut)
6391 return E_INVALIDARG;
6392
6393 /* Create the basic number string */
6394 *szOut-- = '\0';
6395 szOut = VARIANT_WriteNumber(ulVal, szOut);
6396
6397 *pbstrOut = VARIANT_MakeBstr(lcid, dwFlags, szOut);
6398 TRACE("returning %s\n", debugstr_w(*pbstrOut));
6399 return *pbstrOut ? S_OK : E_OUTOFMEMORY;
6400}
static WCHAR * VARIANT_WriteNumber(ULONG64 ulVal, WCHAR *szOut)
Definition: vartype.c:6352
static BSTR VARIANT_MakeBstr(LCID lcid, DWORD dwFlags, WCHAR *szOut)
Definition: vartype.c:6367

Referenced by VarBstrFromI1(), VarBstrFromI2(), VarBstrFromI4(), VarBstrFromI8(), VarBstrFromUI1(), VarBstrFromUI2(), VarBstrFromUI4(), and VarBstrFromUI8().

◆ VARIANT_BstrReplaceDecimal()

static BSTR VARIANT_BstrReplaceDecimal ( const WCHAR buff,
LCID  lcid,
ULONG  dwFlags 
)
static

Definition at line 6479 of file vartype.c.

6480{
6481 BSTR bstrOut;
6482 WCHAR lpDecimalSep[16];
6483
6484 /* Native oleaut32 uses the locale-specific decimal separator even in the
6485 absence of the LOCALE_USE_NLS flag. For example, the Spanish/Latin
6486 American locales will see "one thousand and one tenth" as "1000,1"
6487 instead of "1000.1" (notice the comma). The following code checks for
6488 the need to replace the decimal separator, and if so, will prepare an
6489 appropriate NUMBERFMTW structure to do the job via GetNumberFormatW().
6490 */
6492 lpDecimalSep, ARRAY_SIZE(lpDecimalSep));
6493 if (lpDecimalSep[0] == '.' && lpDecimalSep[1] == '\0')
6494 {
6495 /* locale is compatible with English - return original string */
6496 bstrOut = SysAllocString(buff);
6497 }
6498 else
6499 {
6500 WCHAR *p, *e;
6501 WCHAR numbuff[256];
6502 WCHAR empty[] = L"";
6503 NUMBERFMTW minFormat;
6504
6505 minFormat.NumDigits = 0;
6506 minFormat.Grouping = 0;
6507 minFormat.lpDecimalSep = lpDecimalSep;
6508 minFormat.lpThousandSep = empty;
6509 minFormat.NegativeOrder = 1; /* NLS_NEG_LEFT */
6510
6511 GetLocaleInfoW(lcid, LOCALE_ILZERO | LOCALE_RETURN_NUMBER | (dwFlags & LOCALE_NOUSEROVERRIDE),
6512 (WCHAR *)&minFormat.LeadingZero, sizeof(DWORD)/sizeof(WCHAR) );
6513
6514 /* count number of decimal digits in string */
6515 p = wcschr(buff, '.');
6516 e = wcschr(p ? ++p : buff, 'E');
6517 if (p) minFormat.NumDigits = e ? e - p : lstrlenW(p);
6518
6519 if (e) *e = '\0';
6520 numbuff[0] = '\0';
6521 if (!GetNumberFormatW(lcid, 0, buff, &minFormat, numbuff, ARRAY_SIZE(numbuff)))
6522 {
6523 WARN("GetNumberFormatW() failed, returning raw number string instead\n");
6524 bstrOut = SysAllocString(buff);
6525 }
6526 else
6527 {
6528 if (e)
6529 {
6530 *e = 'E';
6531 wcscat(numbuff, e);
6532 }
6533 TRACE("created minimal NLS string %s\n", debugstr_w(numbuff));
6534 bstrOut = SysAllocString(numbuff);
6535 }
6536 }
6537 return bstrOut;
6538}
static const WCHAR empty[1]
Definition: string.c:47
GLfloat GLfloat p
Definition: glext.h:8902
wcscat
UINT NumDigits
Definition: winnls.h:726
LPWSTR lpDecimalSep
Definition: winnls.h:729
UINT Grouping
Definition: winnls.h:728
UINT NegativeOrder
Definition: winnls.h:731
LPWSTR lpThousandSep
Definition: winnls.h:730
UINT LeadingZero
Definition: winnls.h:727
#define LOCALE_SDECIMAL
Definition: winnls.h:52
#define LOCALE_ILZERO
Definition: winnls.h:56

Referenced by VarBstrFromCy(), VarBstrFromDec(), and VARIANT_BstrFromReal().

◆ VARIANT_CopyData()

static void VARIANT_CopyData ( const VARIANT srcVar,
VARTYPE  vt,
void pOut 
)
inlinestatic

Definition at line 41 of file vartype.c.

42{
43 switch (vt)
44 {
45 case VT_I1:
46 case VT_UI1: memcpy(pOut, &V_UI1(srcVar), sizeof(BYTE)); break;
47 case VT_BOOL:
48 case VT_I2:
49 case VT_UI2: memcpy(pOut, &V_UI2(srcVar), sizeof(SHORT)); break;
50 case VT_R4:
51 case VT_INT:
52 case VT_I4:
53 case VT_UINT:
54 case VT_UI4: memcpy(pOut, &V_UI4(srcVar), sizeof (LONG)); break;
55 case VT_R8:
56 case VT_DATE:
57 case VT_CY:
58 case VT_I8:
59 case VT_UI8: memcpy(pOut, &V_UI8(srcVar), sizeof (LONG64)); break;
60 case VT_INT_PTR: memcpy(pOut, &V_INT_PTR(srcVar), sizeof (INT_PTR)); break;
61 case VT_DECIMAL: memcpy(pOut, &V_DECIMAL(srcVar), sizeof (DECIMAL)); break;
62 case VT_BSTR: memcpy(pOut, &V_BSTR(srcVar), sizeof(BSTR)); break;
63 default:
64 FIXME("VT_ type %d unhandled, please report!\n", vt);
65 }
66}
@ VT_UI8
Definition: compat.h:2315
@ VT_INT
Definition: compat.h:2316
@ VT_R4
Definition: compat.h:2299
@ VT_UI2
Definition: compat.h:2312
@ VT_R8
Definition: compat.h:2300
@ VT_INT_PTR
Definition: compat.h:2327
@ VT_UI4
Definition: compat.h:2313
@ VT_UINT
Definition: compat.h:2317
@ VT_UI1
Definition: compat.h:2311
static REFPROPVARIANT PROPVAR_CHANGE_FLAGS VARTYPE vt
Definition: suminfo.c:91
#define V_UI1(A)
Definition: oleauto.h:266
#define V_UI2(A)
Definition: oleauto.h:268
#define V_INT_PTR(A)
Definition: oleauto.h:257
#define V_BSTR(A)
Definition: oleauto.h:226
#define V_DECIMAL(A)
Definition: oleauto.h:236
#define V_UI4(A)
Definition: oleauto.h:270
#define V_UI8(A)
Definition: oleauto.h:272
int32_t INT_PTR
Definition: typedefs.h:64

Referenced by VARIANT_FromDisp(), and VARIANT_NumberFromBstr().

◆ VARIANT_DecCmp()

static int VARIANT_DecCmp ( const DECIMAL pDecLeft,
const DECIMAL pDecRight 
)
inlinestatic

Definition at line 4556 of file vartype.c.

4557{
4558 if ( pDecLeft->Hi32 < pDecRight->Hi32 ||
4559 (pDecLeft->Hi32 <= pDecRight->Hi32 && pDecLeft->Lo64 < pDecRight->Lo64))
4560 return -1;
4561 else if (pDecLeft->Hi32 == pDecRight->Hi32 && pDecLeft->Lo64 == pDecRight->Lo64)
4562 return 0;
4563 return 1;
4564}

Referenced by VarDecAdd().

◆ VARIANT_DecFromDI()

static void VARIANT_DecFromDI ( const VARIANT_DI from,
DECIMAL to 
)
static

Definition at line 4700 of file vartype.c.

4701{
4702 to->sign = from->sign ? DECIMAL_NEG : DECIMAL_POS;
4703 to->scale = from->scale;
4704 to->Lo32 = from->bitsnum[0];
4705 to->Mid32 = from->bitsnum[1];
4706 to->Hi32 = from->bitsnum[2];
4707}
CardRegion * from
Definition: spigame.cpp:19

Referenced by VarDecFromR4(), VarDecFromR8(), VarDecMul(), VARIANT_DecScale(), and VARIANT_do_division().

◆ VARIANT_DecScale()

static HRESULT VARIANT_DecScale ( const DECIMAL **  ppDecLeft,
const DECIMAL **  ppDecRight,
DECIMAL  pDecOut[2] 
)
static

Definition at line 4430 of file vartype.c.

4433{
4434 static DECIMAL scaleFactor;
4435 unsigned char remainder;
4436 DECIMAL decTemp;
4437 VARIANT_DI di;
4438 int scaleAmount, i;
4439
4440 if ((*ppDecLeft)->sign & ~DECIMAL_NEG || (*ppDecRight)->sign & ~DECIMAL_NEG)
4441 return E_INVALIDARG;
4442
4443 scaleFactor.Lo32 = 10;
4444
4445 i = scaleAmount = (*ppDecLeft)->scale - (*ppDecRight)->scale;
4446
4447 if (!scaleAmount)
4448 return S_OK; /* Same scale */
4449
4450 if (scaleAmount > 0)
4451 {
4452 decTemp = *(*ppDecRight); /* Left is bigger - scale the right hand side */
4453 *ppDecRight = &pDecOut[0];
4454 }
4455 else
4456 {
4457 decTemp = *(*ppDecLeft); /* Right is bigger - scale the left hand side */
4458 *ppDecLeft = &pDecOut[0];
4459 i = -scaleAmount;
4460 }
4461
4462 /* Multiply up the value to be scaled by the correct amount (if possible) */
4463 while (i > 0 && SUCCEEDED(VarDecMul(&decTemp, &scaleFactor, &pDecOut[0])))
4464 {
4465 decTemp = pDecOut[0];
4466 i--;
4467 }
4468
4469 if (!i)
4470 {
4471 pDecOut[0].scale += (scaleAmount > 0) ? scaleAmount : (-scaleAmount);
4472 return S_OK; /* Same scale */
4473 }
4474
4475 /* Scaling further not possible, reduce accuracy of other argument */
4476 pDecOut[0] = decTemp;
4477 if (scaleAmount > 0)
4478 {
4479 pDecOut[0].scale += scaleAmount - i;
4480 VARIANT_DIFromDec(*ppDecLeft, &di);
4481 *ppDecLeft = &pDecOut[1];
4482 }
4483 else
4484 {
4485 pDecOut[0].scale += (-scaleAmount) - i;
4486 VARIANT_DIFromDec(*ppDecRight, &di);
4487 *ppDecRight = &pDecOut[1];
4488 }
4489
4490 di.scale -= i;
4491 remainder = 0;
4492 while (i-- > 0 && !VARIANT_int_iszero(di.bitsnum, ARRAY_SIZE(di.bitsnum)))
4493 {
4495 if (remainder > 0) WARN("losing significant digits (remainder %u)...\n", remainder);
4496 }
4497
4498 /* round up the result - native oleaut32 does this */
4499 if (remainder >= 5) {
4500 for (remainder = 1, i = 0; i < ARRAY_SIZE(di.bitsnum) && remainder; i++) {
4501 ULONGLONG digit = di.bitsnum[i] + 1;
4502 remainder = (digit > 0xFFFFFFFF) ? 1 : 0;
4503 di.bitsnum[i] = digit & 0xFFFFFFFF;
4504 }
4505 }
4506
4507 VARIANT_DecFromDI(&di, &pDecOut[1]);
4508 return S_OK;
4509}

Referenced by VarDecAdd().

◆ VARIANT_DI_clear()

static void VARIANT_DI_clear ( VARIANT_DI i)
static

Definition at line 4710 of file vartype.c.

4711{
4712 memset(i, 0, sizeof(VARIANT_DI));
4713}

Referenced by VARIANT_DI_div(), VARIANT_DI_FromR4(), VARIANT_DI_FromR8(), and VARIANT_DI_mul().

◆ VARIANT_DI_div()

static HRESULT VARIANT_DI_div ( const VARIANT_DI dividend,
const VARIANT_DI divisor,
VARIANT_DI quotient,
BOOL  round_remainder 
)
static

Definition at line 5197 of file vartype.c.

5199{
5200 HRESULT r_overflow = S_OK;
5201
5202 if (VARIANT_int_iszero(divisor->bitsnum, ARRAY_SIZE(divisor->bitsnum))) {
5203 /* division by 0 */
5204 r_overflow = DISP_E_DIVBYZERO;
5205 } else if (VARIANT_int_iszero(dividend->bitsnum, ARRAY_SIZE(dividend->bitsnum))) {
5206 VARIANT_DI_clear(quotient);
5207 } else {
5208 int quotientscale, remainderscale, tempquotientscale;
5209 DWORD remainderplusquotient[8];
5210 int underflow;
5211
5212 quotientscale = remainderscale = (int)dividend->scale - (int)divisor->scale;
5213 tempquotientscale = quotientscale;
5214 VARIANT_DI_clear(quotient);
5215 quotient->sign = (dividend->sign ^ divisor->sign) ? 1 : 0;
5216
5217 /* The following strategy is used for division
5218 1) if there was a nonzero remainder from previous iteration, use it as
5219 dividend for this iteration, else (for first iteration) use intended
5220 dividend
5221 2) perform integer division in temporary buffer, develop quotient in
5222 low-order part, remainder in high-order part
5223 3) add quotient from step 2 to final result, with possible loss of
5224 significant digits
5225 4) multiply integer part of remainder by 10, while incrementing the
5226 scale of the remainder. This operation preserves the intended value
5227 of the remainder.
5228 5) loop to step 1 until one of the following is true:
5229 a) remainder is zero (exact division achieved)
5230 b) addition in step 3 fails to modify bits in quotient (remainder underflow)
5231 */
5232 memset(remainderplusquotient, 0, sizeof(remainderplusquotient));
5233 memcpy(remainderplusquotient, dividend->bitsnum, sizeof(dividend->bitsnum));
5234 do {
5235 VARIANT_int_div(remainderplusquotient, 4, divisor->bitsnum, ARRAY_SIZE(divisor->bitsnum));
5236 underflow = VARIANT_int_addlossy( quotient->bitsnum, &quotientscale,
5237 ARRAY_SIZE(quotient->bitsnum), remainderplusquotient, &tempquotientscale, 4);
5238 if (round_remainder) {
5239 if(remainderplusquotient[4] >= 5){
5240 unsigned int i;
5241 unsigned char remainder = 1;
5242 for (i = 0; i < ARRAY_SIZE(quotient->bitsnum) && remainder; i++) {
5243 ULONGLONG digit = quotient->bitsnum[i] + 1;
5244 remainder = (digit > 0xFFFFFFFF) ? 1 : 0;
5245 quotient->bitsnum[i] = digit & 0xFFFFFFFF;
5246 }
5247 }
5248 memset(remainderplusquotient, 0, sizeof(remainderplusquotient));
5249 } else {
5250 VARIANT_int_mulbychar(remainderplusquotient + 4, 4, 10);
5251 memcpy(remainderplusquotient, remainderplusquotient + 4, 4 * sizeof(DWORD));
5252 }
5253 tempquotientscale = ++remainderscale;
5254 } while (!underflow && !VARIANT_int_iszero(remainderplusquotient + 4, 4));
5255
5256 /* quotient scale might now be negative (extremely big number). If, so, try
5257 to multiply quotient by 10 (without overflowing), while adjusting the scale,
5258 until scale is 0. If this cannot be done, it is a real overflow.
5259 */
5260 while (r_overflow == S_OK && quotientscale < 0) {
5261 memset(remainderplusquotient, 0, sizeof(remainderplusquotient));
5262 memcpy(remainderplusquotient, quotient->bitsnum, sizeof(quotient->bitsnum));
5263 VARIANT_int_mulbychar(remainderplusquotient, ARRAY_SIZE(remainderplusquotient), 10);
5264 if (VARIANT_int_iszero(remainderplusquotient + ARRAY_SIZE(quotient->bitsnum),
5265 ARRAY_SIZE(remainderplusquotient) - ARRAY_SIZE(quotient->bitsnum))) {
5266 quotientscale++;
5267 memcpy(quotient->bitsnum, remainderplusquotient, sizeof(quotient->bitsnum));
5268 } else r_overflow = DISP_E_OVERFLOW;
5269 }
5270 if (r_overflow == S_OK) {
5271 if (quotientscale <= 255) quotient->scale = quotientscale;
5272 else VARIANT_DI_clear(quotient);
5273 }
5274 }
5275 return r_overflow;
5276}
static void VARIANT_DI_clear(VARIANT_DI *i)
Definition: vartype.c:4710
static void VARIANT_int_div(DWORD *p, unsigned int n, const DWORD *divisor, unsigned int dn)
Definition: vartype.c:4996
static unsigned char VARIANT_int_mulbychar(DWORD *p, unsigned int n, unsigned char m)
Definition: vartype.c:5028
static int VARIANT_int_addlossy(DWORD *a, int *ascale, unsigned int an, DWORD *b, int *bscale, unsigned int bn)
Definition: vartype.c:5043
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
#define DISP_E_DIVBYZERO
Definition: winerror.h:3630

Referenced by VARIANT_do_division().

◆ VARIANT_DI_FromR4()

static HRESULT VARIANT_DI_FromR4 ( float  source,
VARIANT_DI dest 
)
static

Definition at line 5449 of file vartype.c.

5450{
5451 HRESULT hres = S_OK;
5452 R4_FIELDS fx;
5453
5454 fx.f = source;
5455
5456 /* Detect special cases */
5457 if (fx.i.m == 0 && fx.i.exp_bias == 0) {
5458 /* Floating-point zero */
5460 } else if (fx.i.m == 0 && fx.i.exp_bias == 0xFF) {
5461 /* Floating-point infinity */
5463 } else if (fx.i.exp_bias == 0xFF) {
5464 /* Floating-point NaN */
5466 } else {
5467 int exponent2;
5469
5470 exponent2 = fx.i.exp_bias - 127; /* Get unbiased exponent */
5471 dest->sign = fx.i.sign; /* Sign is simply copied */
5472
5473 /* Copy significant bits to VARIANT_DI mantissa */
5474 dest->bitsnum[0] = fx.i.m;
5475 dest->bitsnum[0] &= 0x007FFFFF;
5476 if (fx.i.exp_bias == 0) {
5477 /* Denormalized number - correct exponent */
5478 exponent2++;
5479 } else {
5480 /* Add hidden bit to mantissa */
5481 dest->bitsnum[0] |= 0x00800000;
5482 }
5483
5484 /* The act of copying a FP mantissa as integer bits is equivalent to
5485 shifting left the mantissa 23 bits. The exponent2 is reduced to
5486 compensate. */
5487 exponent2 -= 23;
5488
5489 hres = VARIANT_DI_normalize(dest, exponent2, FALSE);
5490 }
5491
5492 return hres;
5493}
static HRESULT VARIANT_DI_normalize(VARIANT_DI *val, int exponent2, BOOL isDouble)
Definition: vartype.c:5285
GLfixed fx
Definition: tritemp.h:484
#define DISP_E_BADVARTYPE
Definition: winerror.h:3620

Referenced by VarDecFromR4().

◆ VARIANT_DI_FromR8()

static HRESULT VARIANT_DI_FromR8 ( double  source,
VARIANT_DI dest 
)
static

Definition at line 5509 of file vartype.c.

5510{
5511 HRESULT hres = S_OK;
5512 R8_FIELDS fx;
5513
5514 fx.d = source;
5515
5516 /* Detect special cases */
5517 if (fx.i.m_lo == 0 && fx.i.m_hi == 0 && fx.i.exp_bias == 0) {
5518 /* Floating-point zero */
5520 } else if (fx.i.m_lo == 0 && fx.i.m_hi == 0 && fx.i.exp_bias == 0x7FF) {
5521 /* Floating-point infinity */
5523 } else if (fx.i.exp_bias == 0x7FF) {
5524 /* Floating-point NaN */
5526 } else {
5527 int exponent2;
5529
5530 exponent2 = fx.i.exp_bias - 1023; /* Get unbiased exponent */
5531 dest->sign = fx.i.sign; /* Sign is simply copied */
5532
5533 /* Copy significant bits to VARIANT_DI mantissa */
5534 dest->bitsnum[0] = fx.i.m_lo;
5535 dest->bitsnum[1] = fx.i.m_hi;
5536 dest->bitsnum[1] &= 0x000FFFFF;
5537 if (fx.i.exp_bias == 0) {
5538 /* Denormalized number - correct exponent */
5539 exponent2++;
5540 } else {
5541 /* Add hidden bit to mantissa */
5542 dest->bitsnum[1] |= 0x00100000;
5543 }
5544
5545 /* The act of copying a FP mantissa as integer bits is equivalent to
5546 shifting left the mantissa 52 bits. The exponent2 is reduced to
5547 compensate. */
5548 exponent2 -= 52;
5549
5550 hres = VARIANT_DI_normalize(dest, exponent2, TRUE);
5551 }
5552
5553 return hres;
5554}

Referenced by VarDecFromR8().

◆ VARIANT_DI_mul()

static int VARIANT_DI_mul ( const VARIANT_DI a,
const VARIANT_DI b,
VARIANT_DI result 
)
static

Definition at line 4756 of file vartype.c.

4757{
4758 BOOL r_overflow = FALSE;
4759 DWORD running[6];
4760 signed int mulstart;
4761
4763 result->sign = (a->sign ^ b->sign) ? 1 : 0;
4764
4765 /* Multiply 128-bit operands into a (max) 256-bit result. The scale
4766 of the result is formed by adding the scales of the operands.
4767 */
4768 result->scale = a->scale + b->scale;
4769 memset(running, 0, sizeof(running));
4770
4771 /* count number of leading zero-bytes in operand A */
4772 for (mulstart = ARRAY_SIZE(a->bitsnum) - 1; mulstart >= 0 && !a->bitsnum[mulstart]; mulstart--);
4773 if (mulstart < 0) {
4774 /* result is 0, because operand A is 0 */
4775 result->scale = 0;
4776 result->sign = 0;
4777 } else {
4778 unsigned char remainder = 0;
4779 int iA;
4780
4781 /* perform actual multiplication */
4782 for (iA = 0; iA <= mulstart; iA++) {
4783 ULONG iOverflowMul;
4784 int iB;
4785
4786 for (iOverflowMul = 0, iB = 0; iB < ARRAY_SIZE(b->bitsnum); iB++) {
4787 ULONG iRV;
4788 int iR;
4789
4790 iRV = VARIANT_Mul(b->bitsnum[iB], a->bitsnum[iA], &iOverflowMul);
4791 iR = iA + iB;
4792 do {
4793 running[iR] = VARIANT_Add(running[iR], 0, &iRV);
4794 iR++;
4795 } while (iRV);
4796 }
4797 }
4798
4799/* Too bad - native oleaut does not do this, so we should not either */
4800#if 0
4801 /* While the result is divisible by 10, and the scale > 0, divide by 10.
4802 This operation should not lose significant digits, and gives an
4803 opportunity to reduce the possibility of overflows in future
4804 operations issued by the application.
4805 */
4806 while (result->scale > 0) {
4807 memcpy(quotient, running, sizeof(quotient));
4808 remainder = VARIANT_int_divbychar(quotient, sizeof(quotient) / sizeof(DWORD), 10);
4809 if (remainder > 0) break;
4810 memcpy(running, quotient, sizeof(quotient));
4811 result->scale--;
4812 }
4813#endif
4814 /* While the 256-bit result overflows, and the scale > 0, divide by 10.
4815 This operation *will* lose significant digits of the result because
4816 all the factors of 10 were consumed by the previous operation.
4817 */
4818 while (result->scale > 0 && !VARIANT_int_iszero(running + ARRAY_SIZE(result->bitsnum),
4819 ARRAY_SIZE(running) - ARRAY_SIZE(result->bitsnum))) {
4820
4821 remainder = VARIANT_int_divbychar(running, ARRAY_SIZE(running), 10);
4822 if (remainder > 0) WARN("losing significant digits (remainder %u)...\n", remainder);
4823 result->scale--;
4824 }
4825
4826 /* round up the result - native oleaut32 does this */
4827 if (remainder >= 5) {
4828 unsigned int i;
4829 for (remainder = 1, i = 0; i < ARRAY_SIZE(running) && remainder; i++) {
4830 ULONGLONG digit = running[i] + 1;
4831 remainder = (digit > 0xFFFFFFFF) ? 1 : 0;
4832 running[i] = digit & 0xFFFFFFFF;
4833 }
4834 }
4835
4836 /* Signal overflow if scale == 0 and 256-bit result still overflows,
4837 and copy result bits into result structure
4838 */
4839 r_overflow = !VARIANT_int_iszero(running + ARRAY_SIZE(result->bitsnum),
4840 ARRAY_SIZE(running) - ARRAY_SIZE(result->bitsnum));
4841 memcpy(result->bitsnum, running, sizeof(result->bitsnum));
4842 }
4843 return r_overflow;
4844}
static ULONG VARIANT_Mul(ULONG ulLeft, ULONG ulRight, ULONG *pulHigh)
Definition: vartype.c:4546
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204

Referenced by VarDecMul().

◆ VARIANT_DI_normalize()

static HRESULT VARIANT_DI_normalize ( VARIANT_DI val,
int  exponent2,
BOOL  isDouble 
)
static

Definition at line 5285 of file vartype.c.

5286{
5287 HRESULT hres = S_OK;
5288 int exponent5, exponent10;
5289
5290 /* A factor of 2^exponent2 is equivalent to (10^exponent2)/(5^exponent2), and
5291 thus equal to (5^-exponent2)*(10^exponent2). After all manipulations,
5292 exponent10 might be used to set the VARIANT_DI scale directly. However,
5293 the value of 5^-exponent5 must be assimilated into the VARIANT_DI. */
5294 exponent5 = -exponent2;
5295 exponent10 = exponent2;
5296
5297 /* Handle exponent5 > 0 */
5298 while (exponent5 > 0) {
5299 char bPrevCarryBit;
5300 char bCurrCarryBit;
5301
5302 /* In order to multiply the value represented by the VARIANT_DI by 5, it
5303 is best to multiply by 10/2. Therefore, exponent10 is incremented, and
5304 somehow the mantissa should be divided by 2. */
5305 if ((val->bitsnum[0] & 1) == 0) {
5306 /* The mantissa is divisible by 2. Therefore the division can be done
5307 without losing significant digits. */
5308 exponent10++; exponent5--;
5309
5310 /* Shift right */
5311 bPrevCarryBit = val->bitsnum[2] & 1;
5312 val->bitsnum[2] >>= 1;
5313 bCurrCarryBit = val->bitsnum[1] & 1;
5314 val->bitsnum[1] = (val->bitsnum[1] >> 1) | (bPrevCarryBit ? 0x80000000 : 0);
5315 val->bitsnum[0] = (val->bitsnum[0] >> 1) | (bCurrCarryBit ? 0x80000000 : 0);
5316 } else {
5317 /* The mantissa is NOT divisible by 2. Therefore the mantissa should
5318 be multiplied by 5, unless the multiplication overflows. */
5319 DWORD temp_bitsnum[3];
5320
5321 exponent5--;
5322
5323 memcpy(temp_bitsnum, val->bitsnum, 3 * sizeof(DWORD));
5324 if (0 == VARIANT_int_mulbychar(temp_bitsnum, 3, 5)) {
5325 /* Multiplication succeeded without overflow, so copy result back
5326 into VARIANT_DI */
5327 memcpy(val->bitsnum, temp_bitsnum, 3 * sizeof(DWORD));
5328
5329 /* Mask out 3 extraneous bits introduced by the multiply */
5330 } else {
5331 /* Multiplication by 5 overflows. The mantissa should be divided
5332 by 2, and therefore will lose significant digits. */
5333 exponent10++;
5334
5335 /* Shift right */
5336 bPrevCarryBit = val->bitsnum[2] & 1;
5337 val->bitsnum[2] >>= 1;
5338 bCurrCarryBit = val->bitsnum[1] & 1;
5339 val->bitsnum[1] = (val->bitsnum[1] >> 1) | (bPrevCarryBit ? 0x80000000 : 0);
5340 val->bitsnum[0] = (val->bitsnum[0] >> 1) | (bCurrCarryBit ? 0x80000000 : 0);
5341 }
5342 }
5343 }
5344
5345 /* Handle exponent5 < 0 */
5346 while (exponent5 < 0) {
5347 /* In order to divide the value represented by the VARIANT_DI by 5, it
5348 is best to multiply by 2/10. Therefore, exponent10 is decremented,
5349 and the mantissa should be multiplied by 2 */
5350 if ((val->bitsnum[2] & 0x80000000) == 0) {
5351 /* The mantissa can withstand a shift-left without overflowing */
5352 exponent10--; exponent5++;
5353 VARIANT_int_shiftleft(val->bitsnum, 3, 1);
5354 } else {
5355 /* The mantissa would overflow if shifted. Therefore it should be
5356 directly divided by 5. This will lose significant digits, unless
5357 by chance the mantissa happens to be divisible by 5 */
5358 exponent5++;
5359 VARIANT_int_divbychar(val->bitsnum, 3, 5);
5360 }
5361 }
5362
5363 /* At this point, the mantissa has assimilated the exponent5, but the
5364 exponent10 might not be suitable for assignment. The exponent10 must be
5365 in the range [-DEC_MAX_SCALE..0], so the mantissa must be scaled up or
5366 down appropriately. */
5367 while (hres == S_OK && exponent10 > 0) {
5368 /* In order to bring exponent10 down to 0, the mantissa should be
5369 multiplied by 10 to compensate. If the exponent10 is too big, this
5370 will cause the mantissa to overflow. */
5371 if (0 == VARIANT_int_mulbychar(val->bitsnum, 3, 10)) {
5372 exponent10--;
5373 } else {
5375 }
5376 }
5377 while (exponent10 < -DEC_MAX_SCALE) {
5378 int rem10;
5379 /* In order to bring exponent up to -DEC_MAX_SCALE, the mantissa should
5380 be divided by 10 to compensate. If the exponent10 is too small, this
5381 will cause the mantissa to underflow and become 0 */
5382 rem10 = VARIANT_int_divbychar(val->bitsnum, 3, 10);
5383 exponent10++;
5384 if (VARIANT_int_iszero(val->bitsnum, 3)) {
5385 /* Underflow, unable to keep dividing */
5386 exponent10 = 0;
5387 } else if (rem10 >= 5) {
5388 DWORD x = 1;
5389 VARIANT_int_add(val->bitsnum, 3, &x, 1);
5390 }
5391 }
5392 /* This step is required in order to remove excess bits of precision from the
5393 end of the bit representation, down to the precision guaranteed by the
5394 floating point number. */
5395 if (isDouble) {
5396 while (exponent10 < 0 && (val->bitsnum[2] != 0 || (val->bitsnum[1] & 0xFFE00000) != 0)) {
5397 int rem10;
5398
5399 rem10 = VARIANT_int_divbychar(val->bitsnum, 3, 10);
5400 exponent10++;
5401 if (rem10 >= 5) {
5402 DWORD x = 1;
5403 VARIANT_int_add(val->bitsnum, 3, &x, 1);
5404 }
5405 }
5406 } else {
5407 while (exponent10 < 0 && (val->bitsnum[2] != 0 || val->bitsnum[1] != 0 ||
5408 (val->bitsnum[2] == 0 && val->bitsnum[1] == 0 && (val->bitsnum[0] & 0xFF000000) != 0))) {
5409 int rem10;
5410
5411 rem10 = VARIANT_int_divbychar(val->bitsnum, 3, 10);
5412 exponent10++;
5413 if (rem10 >= 5) {
5414 DWORD x = 1;
5415 VARIANT_int_add(val->bitsnum, 3, &x, 1);
5416 }
5417 }
5418 }
5419 /* Remove multiples of 10 from the representation */
5420 while (exponent10 < 0) {
5421 DWORD temp_bitsnum[3];
5422
5423 memcpy(temp_bitsnum, val->bitsnum, 3 * sizeof(DWORD));
5424 if (0 == VARIANT_int_divbychar(temp_bitsnum, 3, 10)) {
5425 exponent10++;
5426 memcpy(val->bitsnum, temp_bitsnum, 3 * sizeof(DWORD));
5427 } else break;
5428 }
5429
5430 /* Scale assignment */
5431 if (hres == S_OK) val->scale = -exponent10;
5432
5433 return hres;
5434}
static void VARIANT_int_shiftleft(DWORD *p, unsigned int n, unsigned int shift)
Definition: vartype.c:4930
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLuint GLfloat * val
Definition: glext.h:7180

Referenced by VARIANT_DI_FromR4(), and VARIANT_DI_FromR8().

◆ VARIANT_DI_tostringW()

static BOOL VARIANT_DI_tostringW ( const VARIANT_DI a,
WCHAR s,
unsigned int  n 
)
static

Definition at line 4850 of file vartype.c.

4851{
4853 DWORD quotient[3];
4854 unsigned char remainder;
4855 unsigned int i;
4856
4857 /* place negative sign */
4858 if (!VARIANT_int_iszero(a->bitsnum, ARRAY_SIZE(a->bitsnum)) && a->sign) {
4859 if (n > 0) {
4860 *s++ = '-';
4861 n--;
4862 }
4863 else overflow = TRUE;
4864 }
4865
4866 /* prepare initial 0 */
4867 if (!overflow) {
4868 if (n >= 2) {
4869 s[0] = '0';
4870 s[1] = '\0';
4871 } else overflow = TRUE;
4872 }
4873
4874 i = 0;
4875 memcpy(quotient, a->bitsnum, sizeof(a->bitsnum));
4876 while (!overflow && !VARIANT_int_iszero(quotient, ARRAY_SIZE(quotient))) {
4877 remainder = VARIANT_int_divbychar(quotient, ARRAY_SIZE(quotient), 10);
4878 if (i + 2 > n) {
4879 overflow = TRUE;
4880 } else {
4881 s[i++] = '0' + remainder;
4882 s[i] = '\0';
4883 }
4884 }
4885
4886 if (!overflow && !VARIANT_int_iszero(a->bitsnum, ARRAY_SIZE(a->bitsnum))) {
4887
4888 /* reverse order of digits */
4889 WCHAR * x = s; WCHAR * y = s + i - 1;
4890 while (x < y) {
4891 *x ^= *y;
4892 *y ^= *x;
4893 *x++ ^= *y--;
4894 }
4895
4896 /* check for decimal point. "i" now has string length */
4897 if (i <= a->scale) {
4898 unsigned int numzeroes = a->scale + 1 - i;
4899 if (i + 1 + numzeroes >= n) {
4900 overflow = TRUE;
4901 } else {
4902 memmove(s + numzeroes, s, (i + 1) * sizeof(WCHAR));
4903 i += numzeroes;
4904 while (numzeroes > 0) {
4905 s[--numzeroes] = '0';
4906 }
4907 }
4908 }
4909
4910 /* place decimal point */
4911 if (a->scale > 0) {
4912 unsigned int periodpos = i - a->scale;
4913 if (i + 2 >= n) {
4914 overflow = TRUE;
4915 } else {
4916 memmove(s + periodpos + 1, s + periodpos, (i + 1 - periodpos) * sizeof(WCHAR));
4917 s[periodpos] = '.'; i++;
4918
4919 /* remove extra zeros at the end, if any */
4920 while (s[i - 1] == '0') s[--i] = '\0';
4921 if (s[i - 1] == '.') s[--i] = '\0';
4922 }
4923 }
4924 }
4925
4926 return !overflow;
4927}
GLdouble s
Definition: gl.h:2039
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLenum GLenum GLenum GLenum GLenum scale
Definition: glext.h:9032
#define memmove(s1, s2, n)
Definition: mkisofs.h:881

Referenced by VarBstrFromCy(), and VarBstrFromDec().

◆ VARIANT_DIFromDec()

static void VARIANT_DIFromDec ( const DECIMAL from,
VARIANT_DI to 
)
static

Definition at line 4690 of file vartype.c.

4691{
4692 to->scale = from->scale;
4693 to->sign = from->sign ? 1 : 0;
4694
4695 to->bitsnum[0] = from->Lo32;
4696 to->bitsnum[1] = from->Mid32;
4697 to->bitsnum[2] = from->Hi32;
4698}

Referenced by VarBstrFromDec(), VarDecMul(), VARIANT_DecScale(), and VARIANT_do_division().

◆ VARIANT_do_division()

static HRESULT VARIANT_do_division ( const DECIMAL pDecLeft,
const DECIMAL pDecRight,
DECIMAL pDecOut,
BOOL  round 
)
static

Definition at line 5556 of file vartype.c.

5558{
5559 HRESULT hRet = S_OK;
5560 VARIANT_DI di_left, di_right, di_result;
5561 HRESULT divresult;
5562
5563 VARIANT_DIFromDec(pDecLeft, &di_left);
5564 VARIANT_DIFromDec(pDecRight, &di_right);
5565 divresult = VARIANT_DI_div(&di_left, &di_right, &di_result, round);
5566 if (divresult != S_OK)
5567 {
5568 /* division actually overflowed */
5569 hRet = divresult;
5570 }
5571 else
5572 {
5573 hRet = S_OK;
5574
5575 if (di_result.scale > DEC_MAX_SCALE)
5576 {
5577 unsigned char remainder = 0;
5578
5579 /* division underflowed. In order to comply with the MSDN
5580 specifications for DECIMAL ranges, some significant digits
5581 must be removed
5582 */
5583 WARN("result scale is %u, scaling (with loss of significant digits)...\n",
5584 di_result.scale);
5585 while (di_result.scale > DEC_MAX_SCALE &&
5586 !VARIANT_int_iszero(di_result.bitsnum, ARRAY_SIZE(di_result.bitsnum)))
5587 {
5588 remainder = VARIANT_int_divbychar(di_result.bitsnum, ARRAY_SIZE(di_result.bitsnum), 10);
5589 di_result.scale--;
5590 }
5591 if (di_result.scale > DEC_MAX_SCALE)
5592 {
5593 WARN("result underflowed, setting to 0\n");
5594 di_result.scale = 0;
5595 di_result.sign = 0;
5596 }
5597 else if (remainder >= 5) /* round up result - native oleaut32 does this */
5598 {
5599 unsigned int i;
5600 for (remainder = 1, i = 0; i < ARRAY_SIZE(di_result.bitsnum) && remainder; i++) {
5601 ULONGLONG digit = di_result.bitsnum[i] + 1;
5602 remainder = (digit > 0xFFFFFFFF) ? 1 : 0;
5603 di_result.bitsnum[i] = digit & 0xFFFFFFFF;
5604 }
5605 }
5606 }
5607 VARIANT_DecFromDI(&di_result, pDecOut);
5608 }
5609 return hRet;
5610}
static HRESULT VARIANT_DI_div(const VARIANT_DI *dividend, const VARIANT_DI *divisor, VARIANT_DI *quotient, BOOL round_remainder)
Definition: vartype.c:5197
#define round(x)
Definition: opentype.c:47

Referenced by VarDecDiv(), and VarDecRound().

◆ VARIANT_FromDisp()

static HRESULT VARIANT_FromDisp ( IDispatch pdispIn,
LCID  lcid,
void pOut,
VARTYPE  vt,
DWORD  dwFlags 
)
static

Definition at line 109 of file vartype.c.

111{
112 static DISPPARAMS emptyParams = { NULL, NULL, 0, 0 };
113 VARIANTARG srcVar, dstVar;
114 HRESULT hRet;
115
116 if (!pdispIn)
117 return DISP_E_BADVARTYPE;
118
119 /* Get the default 'value' property from the IDispatch */
120 VariantInit(&srcVar);
121 hRet = IDispatch_Invoke(pdispIn, DISPID_VALUE, &IID_NULL, lcid, DISPATCH_PROPERTYGET,
122 &emptyParams, &srcVar, NULL, NULL);
123
124 if (SUCCEEDED(hRet))
125 {
126 /* Convert the property to the requested type */
127 VariantInit(&dstVar);
128 hRet = VariantChangeTypeEx(&dstVar, &srcVar, lcid, dwFlags, vt);
129 VariantClear(&srcVar);
130
131 if (SUCCEEDED(hRet))
132 VARIANT_CopyData(&dstVar, vt, pOut);
133 }
134 else
135 hRet = DISP_E_TYPEMISMATCH;
136 return hRet;
137}
static void VARIANT_CopyData(const VARIANT *srcVar, VARTYPE vt, void *pOut)
Definition: vartype.c:41
struct stdole::DISPPARAMS DISPPARAMS
#define DISPATCH_PROPERTYGET
Definition: oleauto.h:1007
#define IID_NULL
Definition: guiddef.h:98
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:626
HRESULT WINAPI VariantChangeTypeEx(VARIANTARG *pvargDest, const VARIANTARG *pvargSrc, LCID lcid, USHORT wFlags, VARTYPE vt)
Definition: variant.c:965
void WINAPI VariantInit(VARIANTARG *pVarg)
Definition: variant.c:547

Referenced by VarBoolFromDisp(), VarBstrFromDisp(), VarCyFromDisp(), VarDateFromDisp(), VarDecFromDisp(), VarI1FromDisp(), VarI2FromDisp(), VarI4FromDisp(), VarI8FromDisp(), VarR4FromDisp(), VarR8FromDisp(), VarUI1FromDisp(), VarUI2FromDisp(), VarUI4FromDisp(), and VarUI8FromDisp().

◆ VARIANT_GetLocalisedText()

static BOOL VARIANT_GetLocalisedText ( LANGID  langId,
DWORD  dwId,
WCHAR lpszDest 
)
static

Definition at line 6085 of file vartype.c.

6086{
6087 HRSRC hrsrc;
6088
6090 MAKEINTRESOURCEW((dwId >> 4) + 1), langId );
6091 if (hrsrc)
6092 {
6093 HGLOBAL hmem = LoadResource( hProxyDll, hrsrc );
6094
6095 if (hmem)
6096 {
6097 const WCHAR *p;
6098 unsigned int i;
6099
6100 p = LockResource( hmem );
6101 for (i = 0; i < (dwId & 0x0f); i++) p += *p + 1;
6102
6103 memcpy( lpszDest, p + 1, *p * sizeof(WCHAR) );
6104 lpszDest[*p] = '\0';
6105 TRACE("got %s for LANGID %08x\n", debugstr_w(lpszDest), langId);
6106 return TRUE;
6107 }
6108 }
6109 return FALSE;
6110}
WCHAR lpszDest[260]
LPVOID WINAPI LockResource(HGLOBAL handle)
Definition: res.c:550
HRSRC WINAPI FindResourceExW(HMODULE hModule, LPCWSTR type, LPCWSTR name, WORD lang)
Definition: res.c:164
HGLOBAL WINAPI LoadResource(HINSTANCE hModule, HRSRC hRsrc)
Definition: res.c:532
HMODULE hProxyDll
Definition: combase.c:40
#define RT_STRING
Definition: pedump.c:368
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582

Referenced by VarBoolFromStr(), and VarBstrFromBool().

◆ VARIANT_int_add()

static unsigned char VARIANT_int_add ( DWORD v,
unsigned int  nv,
const DWORD p,
unsigned int  np 
)
static

Definition at line 4957 of file vartype.c.

4959{
4960 unsigned char carry = 0;
4961
4962 if (nv >= np) {
4963 ULONGLONG sum;
4964 unsigned int i;
4965
4966 for (i = 0; i < np; i++) {
4967 sum = (ULONGLONG)v[i]
4968 + (ULONGLONG)p[i]
4969 + (ULONGLONG)carry;
4970 v[i] = sum & 0xffffffff;
4971 carry = sum >> 32;
4972 }
4973 for (; i < nv && carry; i++) {
4974 sum = (ULONGLONG)v[i]
4975 + (ULONGLONG)carry;
4976 v[i] = sum & 0xffffffff;
4977 carry = sum >> 32;
4978 }
4979 }
4980 return carry;
4981}
const GLdouble * v
Definition: gl.h:2040
static int sum(int x_, int y_)
Definition: ptr2_test.cpp:35

Referenced by VarBstrFromCy(), VARIANT_DI_normalize(), VARIANT_int_addlossy(), and VARIANT_int_div().

◆ VARIANT_int_addlossy()

static int VARIANT_int_addlossy ( DWORD a,
int ascale,
unsigned int  an,
DWORD b,
int bscale,
unsigned int  bn 
)
static

Definition at line 5043 of file vartype.c.

5046{
5047 int underflow = 0;
5048
5049 if (VARIANT_int_iszero(a, an)) {
5050 /* if A is zero, copy B into A, after removing digits */
5051 while (bn > an && !VARIANT_int_iszero(b + an, bn - an)) {
5052 VARIANT_int_divbychar(b, bn, 10);
5053 (*bscale)--;
5054 }
5055 memcpy(a, b, an * sizeof(DWORD));
5056 *ascale = *bscale;
5057 } else if (!VARIANT_int_iszero(b, bn)) {
5058 unsigned int tn = an + 1;
5059 DWORD t[5];
5060
5061 if (bn + 1 > tn) tn = bn + 1;
5062 if (*ascale != *bscale) {
5063 /* first (optimistic) try - try to scale down the one with the bigger
5064 scale, while this number is divisible by 10 */
5065 DWORD * digitchosen;
5066 unsigned int nchosen;
5067 int * scalechosen;
5068 int targetscale;
5069
5070 if (*ascale < *bscale) {
5071 targetscale = *ascale;
5072 scalechosen = bscale;
5073 digitchosen = b;
5074 nchosen = bn;
5075 } else {
5076 targetscale = *bscale;
5077 scalechosen = ascale;
5078 digitchosen = a;
5079 nchosen = an;
5080 }
5081 memset(t, 0, tn * sizeof(DWORD));
5082 memcpy(t, digitchosen, nchosen * sizeof(DWORD));
5083
5084 /* divide by 10 until target scale is reached */
5085 while (*scalechosen > targetscale) {
5086 unsigned char remainder = VARIANT_int_divbychar(t, tn, 10);
5087 if (!remainder) {
5088 (*scalechosen)--;
5089 memcpy(digitchosen, t, nchosen * sizeof(DWORD));
5090 } else break;
5091 }
5092 }
5093
5094 if (*ascale != *bscale) {
5095 DWORD * digitchosen;
5096 unsigned int nchosen;
5097 int * scalechosen;
5098 int targetscale;
5099
5100 /* try to scale up the one with the smaller scale */
5101 if (*ascale > *bscale) {
5102 targetscale = *ascale;
5103 scalechosen = bscale;
5104 digitchosen = b;
5105 nchosen = bn;
5106 } else {
5107 targetscale = *bscale;
5108 scalechosen = ascale;
5109 digitchosen = a;
5110 nchosen = an;
5111 }
5112 memset(t, 0, tn * sizeof(DWORD));
5113 memcpy(t, digitchosen, nchosen * sizeof(DWORD));
5114
5115 /* multiply by 10 until target scale is reached, or
5116 significant bytes overflow the number
5117 */
5118 while (*scalechosen < targetscale && t[nchosen] == 0) {
5119 VARIANT_int_mulbychar(t, tn, 10);
5120 if (t[nchosen] == 0) {
5121 /* still does not overflow */
5122 (*scalechosen)++;
5123 memcpy(digitchosen, t, nchosen * sizeof(DWORD));
5124 }
5125 }
5126 }
5127
5128 if (*ascale != *bscale) {
5129 /* still different? try to scale down the one with the bigger scale
5130 (this *will* lose significant digits) */
5131 DWORD * digitchosen;
5132 unsigned int nchosen;
5133 int * scalechosen;
5134 int targetscale;
5135
5136 if (*ascale < *bscale) {
5137 targetscale = *ascale;
5138 scalechosen = bscale;
5139 digitchosen = b;
5140 nchosen = bn;
5141 } else {
5142 targetscale = *bscale;
5143 scalechosen = ascale;
5144 digitchosen = a;
5145 nchosen = an;
5146 }
5147 memset(t, 0, tn * sizeof(DWORD));
5148 memcpy(t, digitchosen, nchosen * sizeof(DWORD));
5149
5150 /* divide by 10 until target scale is reached */
5151 while (*scalechosen > targetscale) {
5152 VARIANT_int_divbychar(t, tn, 10);
5153 (*scalechosen)--;
5154 memcpy(digitchosen, t, nchosen * sizeof(DWORD));
5155 }
5156 }
5157
5158 /* check whether any of the operands still has significant digits
5159 (underflow case 1)
5160 */
5161 if (VARIANT_int_iszero(a, an) || VARIANT_int_iszero(b, bn)) {
5162 underflow = 1;
5163 } else {
5164 /* at this step, both numbers have the same scale and can be added
5165 as integers. However, the result might not fit in A, so further
5166 scaling down might be necessary.
5167 */
5168 while (!underflow) {
5169 memset(t, 0, tn * sizeof(DWORD));
5170 memcpy(t, a, an * sizeof(DWORD));
5171
5172 VARIANT_int_add(t, tn, b, bn);
5173 if (VARIANT_int_iszero(t + an, tn - an)) {
5174 /* addition was successful */
5175 memcpy(a, t, an * sizeof(DWORD));
5176 break;
5177 } else {
5178 /* addition overflowed - remove significant digits
5179 from both operands and try again */
5180 VARIANT_int_divbychar(a, an, 10); (*ascale)--;
5181 VARIANT_int_divbychar(b, bn, 10); (*bscale)--;
5182 /* check whether any operand keeps significant digits after
5183 scaledown (underflow case 2)
5184 */
5186 }
5187 }
5188 }
5189 }
5190 return underflow;
5191}
GLdouble GLdouble t
Definition: gl.h:2047
#define a
Definition: ke_i.h:78
#define b
Definition: ke_i.h:79

Referenced by VARIANT_DI_div().

◆ VARIANT_int_div()

static void VARIANT_int_div ( DWORD p,
unsigned int  n,
const DWORD divisor,
unsigned int  dn 
)
static

Definition at line 4996 of file vartype.c.

4998{
4999 unsigned int i;
5000 DWORD tempsub[8];
5001 DWORD * negdivisor = tempsub + n;
5002
5003 /* build 2s-complement of divisor */
5004 for (i = 0; i < n; i++) negdivisor[i] = (i < dn) ? ~divisor[i] : 0xFFFFFFFF;
5005 p[n] = 1;
5006 VARIANT_int_add(negdivisor, n, p + n, 1);
5007 memset(p + n, 0, n * sizeof(DWORD));
5008
5009 /* skip all leading zero DWORDs in quotient */
5010 for (i = 0; i < n && !p[n - 1]; i++) VARIANT_int_shiftleft(p, n, 32);
5011 /* i is now number of DWORDs left to process */
5012 for (i <<= 5; i < (n << 5); i++) {
5013 VARIANT_int_shiftleft(p, n << 1, 1); /* shl quotient+remainder */
5014
5015 /* trial subtraction */
5016 memcpy(tempsub, p + n, n * sizeof(DWORD));
5017 VARIANT_int_add(tempsub, n, negdivisor, n);
5018
5019 /* check whether result of subtraction was negative */
5020 if ((tempsub[n - 1] & 0x80000000) == 0) {
5021 memcpy(p + n, tempsub, n * sizeof(DWORD));
5022 p[0] |= 1;
5023 }
5024 }
5025}

Referenced by VARIANT_DI_div().

◆ VARIANT_int_divbychar()

static unsigned char VARIANT_int_divbychar ( DWORD p,
unsigned int  n,
unsigned char  divisor 
)
static

Definition at line 4720 of file vartype.c.

4721{
4722 if (divisor == 0) {
4723 /* division by 0 */
4724 return 0xFF;
4725 } else if (divisor == 1) {
4726 /* dividend remains unchanged */
4727 return 0;
4728 } else {
4729 unsigned char remainder = 0;
4730 ULONGLONG iTempDividend;
4731 signed int i;
4732
4733 for (i = n - 1; i >= 0 && !p[i]; i--); /* skip leading zeros */
4734 for (; i >= 0; i--) {
4735 iTempDividend = ((ULONGLONG)remainder << 32) + p[i];
4736 remainder = iTempDividend % divisor;
4737 p[i] = iTempDividend / divisor;
4738 }
4739
4740 return remainder;
4741 }
4742}

Referenced by VarDecAdd(), VarDecMul(), VARIANT_DecScale(), VARIANT_DI_mul(), VARIANT_DI_normalize(), VARIANT_DI_tostringW(), VARIANT_do_division(), and VARIANT_int_addlossy().

◆ VARIANT_int_iszero()

static BOOL VARIANT_int_iszero ( const DWORD p,
unsigned int  n 
)
static

Definition at line 4745 of file vartype.c.

4746{
4747 for (; n > 0; n--) if (*p++ != 0) return FALSE;
4748 return TRUE;
4749}

Referenced by VarDecMul(), VARIANT_DecScale(), VARIANT_DI_div(), VARIANT_DI_mul(), VARIANT_DI_normalize(), VARIANT_DI_tostringW(), VARIANT_do_division(), and VARIANT_int_addlossy().

◆ VARIANT_int_mulbychar()

static unsigned char VARIANT_int_mulbychar ( DWORD p,
unsigned int  n,
unsigned char  m 
)
static

Definition at line 5028 of file vartype.c.

5029{
5030 unsigned int i;
5031 ULONG iOverflowMul;
5032
5033 for (iOverflowMul = 0, i = 0; i < n; i++)
5034 p[i] = VARIANT_Mul(p[i], m, &iOverflowMul);
5035 return (unsigned char)iOverflowMul;
5036}
const GLfloat * m
Definition: glext.h:10848

Referenced by VARIANT_DI_div(), VARIANT_DI_normalize(), and VARIANT_int_addlossy().

◆ VARIANT_int_shiftleft()

static void VARIANT_int_shiftleft ( DWORD p,
unsigned int  n,
unsigned int  shift 
)
static

Definition at line 4930 of file vartype.c.

4931{
4932 DWORD shifted;
4933 unsigned int i;
4934
4935 /* shift whole DWORDs to the left */
4936 while (shift >= 32)
4937 {
4938 memmove(p + 1, p, (n - 1) * sizeof(DWORD));
4939 *p = 0; shift -= 32;
4940 }
4941
4942 /* shift remainder (1..31 bits) */
4943 shifted = 0;
4944 if (shift > 0) for (i = 0; i < n; i++)
4945 {
4946 DWORD b;
4947 b = p[i] >> (32 - shift);
4948 p[i] = (p[i] << shift) | shifted;
4949 shifted = b;
4950 }
4951}
#define shift
Definition: input.c:3280

Referenced by VARIANT_DI_normalize(), and VARIANT_int_div().

◆ VARIANT_IsValidMonthDay()

static BOOL VARIANT_IsValidMonthDay ( DWORD  day,
DWORD  month,
DWORD  year 
)
static

Definition at line 7435 of file vartype.c.

7436{
7437 static const BYTE days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
7438
7439 if (day && month && month < 13)
7440 {
7441 if (day <= days[month] || (month == 2 && day == 29 && IsLeapYear(year)))
7442 return TRUE;
7443 }
7444 return FALSE;
7445}
static DOUBLE day(DOUBLE time)
Definition: date.c:75
#define IsLeapYear(y)
Definition: vartype.c:7432
static const WCHAR month[12][4]
Definition: session.c:2528

Referenced by VARIANT_MakeDate().

◆ VARIANT_MakeBstr()

static BSTR VARIANT_MakeBstr ( LCID  lcid,
DWORD  dwFlags,
WCHAR szOut 
)
static

Definition at line 6367 of file vartype.c.

6368{
6369 WCHAR szConverted[256];
6370
6371 if (dwFlags & VAR_NEGATIVE)
6372 *--szOut = '-';
6373
6374 if (dwFlags & LOCALE_USE_NLS)
6375 {
6376 /* Format the number for the locale */
6377 szConverted[0] = '\0';
6379 szOut, NULL, szConverted, ARRAY_SIZE(szConverted));
6380 szOut = szConverted;
6381 }
6382 return SysAllocStringByteLen((LPCSTR)szOut, lstrlenW(szOut) * sizeof(WCHAR));
6383}
const char * LPCSTR
Definition: typedefs.h:52

Referenced by VARIANT_BstrFromUInt().

◆ VARIANT_MakeDate()

static HRESULT VARIANT_MakeDate ( DATEPARSE dp,
DWORD  iDate,
DWORD  offset,
SYSTEMTIME st 
)
inlinestatic

Definition at line 7455 of file vartype.c.

7457{
7458 DWORD dwAllOrders, dwTry, dwCount = 0, v1, v2, v3;
7459
7460 if (!dp->dwCount)
7461 {
7462 v1 = 30; /* Default to (Variant) 0 date part */
7463 v2 = 12;
7464 v3 = 1899;
7465 goto VARIANT_MakeDate_OK;
7466 }
7467
7468 v1 = dp->dwValues[offset + 0];
7469 v2 = dp->dwValues[offset + 1];
7470 if (dp->dwCount == 2)
7471 {
7474 v3 = current.wYear;
7475 }
7476 else
7477 v3 = dp->dwValues[offset + 2];
7478
7479 TRACE("%ld, %ld, %ld, %ld, %ld.\n", v1, v2, v3, iDate, offset);
7480
7481 /* If one number must be a month (Because a month name was given), then only
7482 * consider orders with the month in that position.
7483 * If we took the current year as 'v3', then only allow a year in that position.
7484 */
7485 if (dp->dwFlags[offset + 0] & DP_MONTH)
7486 {
7487 dwAllOrders = ORDER_MDY;
7488 }
7489 else if (dp->dwFlags[offset + 1] & DP_MONTH)
7490 {
7491 dwAllOrders = ORDER_DMY;
7492 if (dp->dwCount > 2)
7493 dwAllOrders |= ORDER_YMD;
7494 }
7495 else if (dp->dwCount > 2 && dp->dwFlags[offset + 2] & DP_MONTH)
7496 {
7497 dwAllOrders = ORDER_YDM;
7498 }
7499 else
7500 {
7501 dwAllOrders = ORDER_MDY|ORDER_DMY;
7502 if (dp->dwCount > 2)
7503 dwAllOrders |= (ORDER_YMD|ORDER_YDM);
7504 }
7505
7506VARIANT_MakeDate_Start:
7507 TRACE("dwAllOrders is %#lx\n", dwAllOrders);
7508
7509 while (dwAllOrders)
7510 {
7511 DWORD dwTemp;
7512
7513 if (dwCount == 0)
7514 {
7515 /* First: Try the order given by iDate */
7516 switch (iDate)
7517 {
7518 case 0: dwTry = dwAllOrders & ORDER_MDY; break;
7519 case 1: dwTry = dwAllOrders & ORDER_DMY; break;
7520 default: dwTry = dwAllOrders & ORDER_YMD; break;
7521 }
7522 }
7523 else if (dwCount == 1)
7524 {
7525 /* Second: Try all the orders compatible with iDate */
7526 switch (iDate)
7527 {
7528 case 0: dwTry = dwAllOrders & ~(ORDER_DMY|ORDER_YDM); break;
7529 case 1: dwTry = dwAllOrders & ~(ORDER_MDY|ORDER_YDM|ORDER_MYD); break;
7530 default: dwTry = dwAllOrders & ~(ORDER_DMY|ORDER_YDM); break;
7531 }
7532 }
7533 else
7534 {
7535 /* Finally: Try any remaining orders */
7536 dwTry = dwAllOrders;
7537 }
7538
7539 TRACE("Attempt %ld, dwTry is %#lx\n", dwCount, dwTry);
7540
7541 dwCount++;
7542 if (!dwTry)
7543 continue;
7544
7545#define DATE_SWAP(x,y) do { dwTemp = x; x = y; y = dwTemp; } while (0)
7546
7547 if (dwTry & ORDER_MDY)
7548 {
7550 {
7551 DATE_SWAP(v1,v2);
7552 goto VARIANT_MakeDate_OK;
7553 }
7554 dwAllOrders &= ~ORDER_MDY;
7555 }
7556 if (dwTry & ORDER_YMD)
7557 {
7559 {
7560 DATE_SWAP(v1,v3);
7561 goto VARIANT_MakeDate_OK;
7562 }
7563 dwAllOrders &= ~ORDER_YMD;
7564 }
7565 if (dwTry & ORDER_YDM)
7566 {
7568 {
7569 DATE_SWAP(v1,v2);
7570 DATE_SWAP(v2,v3);
7571 goto VARIANT_MakeDate_OK;
7572 }
7573 dwAllOrders &= ~ORDER_YDM;
7574 }
7575 if (dwTry & ORDER_DMY)
7576 {
7578 goto VARIANT_MakeDate_OK;
7579 dwAllOrders &= ~ORDER_DMY;
7580 }
7581 if (dwTry & ORDER_MYD)
7582 {
7583 /* Only occurs if we are trying a 2 year date as M/Y not D/M */
7585 {
7586 DATE_SWAP(v1,v3);
7587 DATE_SWAP(v2,v3);
7588 goto VARIANT_MakeDate_OK;
7589 }
7590 dwAllOrders &= ~ORDER_MYD;
7591 }
7592 }
7593
7594 if (dp->dwCount == 2)
7595 {
7596 /* We couldn't make a date as D/M or M/D, so try M/Y or Y/M */
7597 v3 = 1; /* 1st of the month */
7598 dwAllOrders = ORDER_YMD|ORDER_MYD;
7599 dp->dwCount = 0; /* Don't return to this code path again */
7600 dwCount = 0;
7601 goto VARIANT_MakeDate_Start;
7602 }
7603
7604 /* No valid dates were able to be constructed */
7605 return DISP_E_TYPEMISMATCH;
7606
7607VARIANT_MakeDate_OK:
7608
7609 /* Check that the time part is ok */
7610 if (st->wHour > 23 || st->wMinute > 59 || st->wSecond > 59)
7611 return DISP_E_TYPEMISMATCH;
7612
7613 TRACE("Time %d %d %d\n", st->wHour, st->wMinute, st->wSecond);
7614 if (st->wHour < 12 && (dp->dwParseFlags & DP_PM))
7615 st->wHour += 12;
7616 else if (st->wHour == 12 && (dp->dwParseFlags & DP_AM))
7617 st->wHour = 0;
7618 TRACE("Time %d %d %d\n", st->wHour, st->wMinute, st->wSecond);
7619
7620 st->wDay = v1;
7621 st->wMonth = v2;
7622 /* FIXME: For 2 digit dates old versions of Windows used 29 but
7623 * Windows 10 1903 and greater use 49. This cutoff may also be modified by
7624 * setting the value as a string for the relevant calendar id in the
7625 * registry.
7626 *
7627 * For instance to emulate old Windows versions:
7628 * [HKCU\Control Panel\International\Calendars\TwoDigitYearMax]
7629 * "1"="29"
7630 * (also 2, 9, 10, 11 and 12 for the other Gregorian calendars)
7631 *
7632 * But Wine doesn't have/use that key at the time of writing.
7633 */
7634 st->wYear = v3 <= 49 ? 2000 + v3 : v3 <= 99 ? 1900 + v3 : v3;
7635 TRACE("Returning date %ld/%ld/%d\n", v1, v2, st->wYear);
7636 return S_OK;
7637}
VOID WINAPI GetSystemTime(OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:304
static BOOL VARIANT_IsValidMonthDay(DWORD day, DWORD month, DWORD year)
Definition: vartype.c:7435
#define ORDER_MDY
Definition: vartype.c:7448
#define ORDER_YMD
Definition: vartype.c:7449
#define ORDER_DMY
Definition: vartype.c:7451
#define ORDER_MYD
Definition: vartype.c:7452
#define ORDER_YDM
Definition: vartype.c:7450
#define DATE_SWAP(x, y)
GLintptr offset
Definition: glext.h:5920
GLfloat GLfloat GLfloat GLfloat v3
Definition: glext.h:6064
GLfloat GLfloat v1
Definition: glext.h:6062
GLfloat GLfloat GLfloat v2
Definition: glext.h:6063
struct task_struct * current
Definition: linux.c:32

Referenced by VarDateFromStr().

◆ VARIANT_Mul()

static ULONG VARIANT_Mul ( ULONG  ulLeft,
ULONG  ulRight,
ULONG pulHigh 
)
static

Definition at line 4546 of file vartype.c.

4547{
4548 ULARGE_INTEGER ul64;
4549
4550 ul64.QuadPart = (ULONG64)ulLeft * (ULONG64)ulRight + (ULONG64)*pulHigh;
4551 *pulHigh = ul64.HighPart;
4552 return ul64.LowPart;
4553}

Referenced by VARIANT_DI_mul(), and VARIANT_int_mulbychar().

◆ VARIANT_NumberFromBstr()

static HRESULT VARIANT_NumberFromBstr ( const OLECHAR pStrIn,
LCID  lcid,
ULONG  ulFlags,
void pOut,
VARTYPE  vt 
)
static

Definition at line 84 of file vartype.c.

86{
87 VARIANTARG dstVar;
88 HRESULT hRet;
89 NUMPARSE np;
90 BYTE rgb[1024];
91
92 /* Use VarParseNumFromStr/VarNumFromParseNum as MSDN indicates */
93 np.cDig = ARRAY_SIZE(rgb);
95
96 hRet = VarParseNumFromStr(pStrIn, lcid, ulFlags, &np, rgb);
97
98 if (SUCCEEDED(hRet))
99 {
100 /* 1 << vt gives us the VTBIT constant for the destination number type */
101 hRet = VarNumFromParseNum(&np, rgb, 1 << vt, &dstVar);
102 if (SUCCEEDED(hRet))
103 VARIANT_CopyData(&dstVar, vt, pOut);
104 }
105 return hRet;
106}
#define NUMPRS_STD
Definition: oleauto.h:748
ULONG dwInFlags
Definition: oleauto.h:728
INT cDig
Definition: oleauto.h:727
HRESULT WINAPI VarParseNumFromStr(const OLECHAR *lpszStr, LCID lcid, ULONG dwFlags, NUMPARSE *pNumprs, BYTE *rgbDig)
Definition: variant.c:1578
HRESULT WINAPI VarNumFromParseNum(NUMPARSE *pNumprs, BYTE *rgbDig, ULONG dwVtBits, VARIANT *pVarDst)
Definition: variant.c:2060
_In_ ULONG _In_ ULONG rgb
Definition: winddi.h:3521

Referenced by VarCyFromStr(), VarDecFromStr(), VarI1FromStr(), VarI2FromStr(), VarI4FromStr(), VarI8FromStr(), VarR4FromStr(), VarR8FromStr(), VarUI1FromStr(), VarUI2FromStr(), VarUI4FromStr(), and VarUI8FromStr().

◆ VARIANT_Sub()

static ULONG VARIANT_Sub ( ULONG  ulLeft,
ULONG  ulRight,
ULONG pulHigh 
)
static

Definition at line 4522 of file vartype.c.

4523{
4524 BOOL invert = FALSE;
4525 ULARGE_INTEGER ul64;
4526
4527 ul64.QuadPart = (LONG64)ulLeft - (ULONG64)ulRight;
4528 if (ulLeft < ulRight)
4529 invert = TRUE;
4530
4531 if (ul64.QuadPart > (ULONG64)*pulHigh)
4532 ul64.QuadPart -= (ULONG64)*pulHigh;
4533 else
4534 {
4535 ul64.QuadPart -= (ULONG64)*pulHigh;
4536 invert = TRUE;
4537 }
4538 if (invert)
4539 ul64.HighPart = -ul64.HighPart ;
4540
4541 *pulHigh = ul64.HighPart;
4542 return ul64.LowPart;
4543}
GLboolean invert
Definition: gl.h:1949

Referenced by VarDecAdd().

◆ VARIANT_WriteNumber()

static WCHAR * VARIANT_WriteNumber ( ULONG64  ulVal,
WCHAR szOut 
)
static

Definition at line 6352 of file vartype.c.

6353{
6354 do
6355 {
6356 WCHAR ulNextDigit = ulVal % 10;
6357
6358 *szOut-- = '0' + ulNextDigit;
6359 ulVal = (ulVal - ulNextDigit) / 10;
6360 } while (ulVal);
6361
6362 szOut++;
6363 return szOut;
6364}

Referenced by VARIANT_BstrFromUInt().

◆ VarR4CmpR8()

HRESULT WINAPI VarR4CmpR8 ( float  fltLeft,
double  dblRight 
)

Definition at line 3015 of file vartype.c.

3016{
3017 if (fltLeft < dblRight)
3018 return VARCMP_LT;
3019 else if (fltLeft > dblRight)
3020 return VARCMP_GT;
3021 return VARCMP_EQ;
3022}

◆ VarR4FromBool()

HRESULT WINAPI VarR4FromBool ( VARIANT_BOOL  boolIn,
float pFltOut 
)

Definition at line 2862 of file vartype.c.

2863{
2864 return VarR4FromI2(boolIn, pFltOut);
2865}
HRESULT WINAPI VarR4FromI2(SHORT sIn, float *pFltOut)
Definition: vartype.c:2729

Referenced by test_VarR4FromBool(), and VARIANT_Coerce().

◆ VarR4FromCy()

HRESULT WINAPI VarR4FromCy ( CY  cyIn,
float pFltOut 
)

Definition at line 2784 of file vartype.c.

2785{
2786 *pFltOut = (double)cyIn.int64 / CY_MULTIPLIER_F;
2787 return S_OK;
2788}

Referenced by test_VarR4FromCy(), and VARIANT_Coerce().

◆ VarR4FromDate()

HRESULT WINAPI VarR4FromDate ( DATE  dateIn,
float pFltOut 
)

Definition at line 2803 of file vartype.c.

2804{
2805 return VarR4FromR8(dateIn, pFltOut);
2806}
HRESULT WINAPI VarR4FromR8(double dblIn, float *pFltOut)
Definition: vartype.c:2764

Referenced by test_VarR4FromDate(), and VARIANT_Coerce().

◆ VarR4FromDec()

HRESULT WINAPI VarR4FromDec ( const DECIMAL pDecIn,
float pFltOut 
)

Definition at line 2940 of file vartype.c.

2941{
2942 BYTE scale = pDecIn->scale;
2943 double divisor = 1.0;
2944 double highPart;
2945
2946 if (scale > DEC_MAX_SCALE || pDecIn->sign & ~DECIMAL_NEG)
2947 return E_INVALIDARG;
2948
2949 while (scale--)
2950 divisor *= 10.0;
2951
2952 if (pDecIn->sign)
2953 divisor = -divisor;
2954
2955 if (pDecIn->Hi32)
2956 {
2957 highPart = (double)pDecIn->Hi32 / divisor;
2958 highPart *= 4294967296.0F;
2959 highPart *= 4294967296.0F;
2960 }
2961 else
2962 highPart = 0.0;
2963
2964 *pFltOut = (double)pDecIn->Lo64 / divisor + highPart;
2965 return S_OK;
2966}

Referenced by test_VarR4FromDec(), and VARIANT_Coerce().

◆ VarR4FromDisp()

HRESULT WINAPI VarR4FromDisp ( IDispatch pdispIn,
LCID  lcid,
float pFltOut 
)

Definition at line 2845 of file vartype.c.

2846{
2847 return VARIANT_FromDisp(pdispIn, lcid, pFltOut, VT_R4, 0);
2848}

Referenced by VARIANT_Coerce().

◆ VarR4FromI1()

HRESULT WINAPI VarR4FromI1 ( signed char  cIn,
float pFltOut 
)

Definition at line 2882 of file vartype.c.

2883{
2884 return _VarR4FromI1(cIn, pFltOut);
2885}

Referenced by test_VarR4FromI1(), and VARIANT_Coerce().

◆ VarR4FromI2()

HRESULT WINAPI VarR4FromI2 ( SHORT  sIn,
float pFltOut 
)

Definition at line 2729 of file vartype.c.

2730{
2731 return _VarR4FromI2(sIn, pFltOut);
2732}

Referenced by test_VarR4FromI2(), VARIANT_Coerce(), and VarR4FromBool().

◆ VarR4FromI4()

HRESULT WINAPI VarR4FromI4 ( LONG  lIn,
float pFltOut 
)

Definition at line 2746 of file vartype.c.

2747{
2748 return _VarR4FromI4(lIn, pFltOut);
2749}

Referenced by test_VarR4FromI4(), and VARIANT_Coerce().

◆ VarR4FromI8()

HRESULT WINAPI VarR4FromI8 ( LONG64  llIn,
float pFltOut 
)

Definition at line 2980 of file vartype.c.

2981{
2982 return _VarR4FromI8(llIn, pFltOut);
2983}

Referenced by test_VarR4FromI8(), and VARIANT_Coerce().

◆ VarR4FromR8()

HRESULT WINAPI VarR4FromR8 ( double  dblIn,
float pFltOut 
)

Definition at line 2764 of file vartype.c.

2765{
2766 double d = dblIn < 0.0 ? -dblIn : dblIn;
2767 if (d > R4_MAX) return DISP_E_OVERFLOW;
2768 *pFltOut = dblIn;
2769 return S_OK;
2770}
#define R4_MAX
Definition: variant.h:69

Referenced by test_VarR4FromR8(), VARIANT_Coerce(), and VarR4FromDate().

◆ VarR4FromStr()

HRESULT WINAPI VarR4FromStr ( const OLECHAR strIn,
LCID  lcid,
ULONG  dwFlags,
float pFltOut 
)

Definition at line 2824 of file vartype.c.

2825{
2826 return VARIANT_NumberFromBstr(strIn, lcid, dwFlags, pFltOut, VT_R4);
2827}

Referenced by test_VarR4FromStr(), and VARIANT_Coerce().

◆ VarR4FromUI1()

HRESULT WINAPI VarR4FromUI1 ( BYTE  bIn,
float pFltOut 
)

Definition at line 2712 of file vartype.c.

2713{
2714 return _VarR4FromUI1(bIn, pFltOut);
2715}

Referenced by test_VarR4FromUI1(), and VARIANT_Coerce().

◆ VarR4FromUI2()

HRESULT WINAPI VarR4FromUI2 ( USHORT  usIn,
float pFltOut 
)

Definition at line 2902 of file vartype.c.

2903{
2904 return _VarR4FromUI2(usIn, pFltOut);
2905}

Referenced by test_VarR4FromUI2(), and VARIANT_Coerce().

◆ VarR4FromUI4()

HRESULT WINAPI VarR4FromUI4 ( ULONG  ulIn,
float pFltOut 
)

Definition at line 2922 of file vartype.c.

2923{
2924 return _VarR4FromUI4(ulIn, pFltOut);
2925}

Referenced by test_VarR4FromUI4(), and VARIANT_Coerce().

◆ VarR4FromUI8()

HRESULT WINAPI VarR4FromUI8 ( ULONG64  ullIn,
float pFltOut 
)

Definition at line 2997 of file vartype.c.

2998{
2999 return _VarR4FromUI8(ullIn, pFltOut);
3000}

Referenced by test_VarR4FromUI8(), and VARIANT_Coerce().

◆ VarR8FromBool()

HRESULT WINAPI VarR8FromBool ( VARIANT_BOOL  boolIn,
double pDblOut 
)

Definition at line 3183 of file vartype.c.

3184{
3185 return VarR8FromI2(boolIn, pDblOut);
3186}

Referenced by test_VarR8FromBool(), VarDateFromBool(), and VARIANT_Coerce().

◆ VarR8FromCy()

HRESULT WINAPI VarR8FromCy ( CY  cyIn,
double pDblOut 
)

Definition at line 3107 of file vartype.c.

3108{
3109 return _VarR8FromCy(cyIn, pDblOut);
3110}

Referenced by test_VarAdd(), test_VarMul(), test_VarR8FromCy(), test_VarSub(), VarDateFromCy(), and VARIANT_Coerce().

◆ VarR8FromDate()

HRESULT WINAPI VarR8FromDate ( DATE  dateIn,
double pDblOut 
)

Definition at line 3124 of file vartype.c.

3125{
3126 return _VarR8FromDate(dateIn, pDblOut);
3127}

Referenced by test_VarR8FromDate(), and VARIANT_Coerce().

◆ VarR8FromDec()

HRESULT WINAPI VarR8FromDec ( const DECIMAL pDecIn,
double pDblOut 
)

Definition at line 3261 of file vartype.c.

3262{
3263 BYTE scale = pDecIn->scale;
3264 double divisor = 1.0, highPart;
3265
3266 if (scale > DEC_MAX_SCALE || pDecIn->sign & ~DECIMAL_NEG)
3267 return E_INVALIDARG;
3268
3269 while (scale--)
3270 divisor *= 10;
3271
3272 if (pDecIn->sign)
3273 divisor = -divisor;
3274
3275 if (pDecIn->Hi32)
3276 {
3277 highPart = (double)pDecIn->Hi32 / divisor;
3278 highPart *= 4294967296.0F;
3279 highPart *= 4294967296.0F;
3280 }
3281 else
3282 highPart = 0.0;
3283
3284 *pDblOut = (double)pDecIn->Lo64 / divisor + highPart;
3285 return S_OK;
3286}

Referenced by test_VarAdd(), test_VarDiv(), test_VarMul(), test_VarR8FromDec(), test_VarSub(), VarDateFromDec(), VarDecFix(), VarDecInt(), VarI8FromDec(), VARIANT_Coerce(), VarRound(), and VarUI8FromDec().

◆ VarR8FromDisp()

HRESULT WINAPI VarR8FromDisp ( IDispatch pdispIn,
LCID  lcid,
double pDblOut 
)

Definition at line 3166 of file vartype.c.

3167{
3168 return VARIANT_FromDisp(pdispIn, lcid, pDblOut, VT_R8, 0);
3169}

Referenced by VARIANT_Coerce().

◆ VarR8FromI1()

HRESULT WINAPI VarR8FromI1 ( signed char  cIn,
double pDblOut 
)

Definition at line 3203 of file vartype.c.

3204{
3205 return _VarR8FromI1(cIn, pDblOut);
3206}

Referenced by test_VarR8FromI1(), VarDateFromI1(), and VARIANT_Coerce().

◆ VarR8FromI2()

HRESULT WINAPI VarR8FromI2 ( SHORT  sIn,
double pDblOut 
)

Definition at line 3056 of file vartype.c.

3057{
3058 return _VarR8FromI2(sIn, pDblOut);
3059}

Referenced by test_VarR8FromI2(), VarDateFromI2(), VARIANT_Coerce(), and VarR8FromBool().

◆ VarR8FromI4()

HRESULT WINAPI VarR8FromI4 ( LONG  lIn,
double pDblOut 
)

Definition at line 3073 of file vartype.c.

3074{
3075 return _VarR8FromI4(lIn, pDblOut);
3076}

Referenced by test_VarR8FromI4(), and VARIANT_Coerce().

◆ VarR8FromI8()

HRESULT WINAPI VarR8FromI8 ( LONG64  llIn,
double pDblOut 
)

Definition at line 3300 of file vartype.c.

3301{
3302 return _VarR8FromI8(llIn, pDblOut);
3303}

Referenced by test_VarR8FromI8(), VARIANT_Coerce(), and VarNeg().

◆ VarR8FromR4()

HRESULT WINAPI VarR8FromR4 ( FLOAT  fltIn,
double pDblOut 
)

Definition at line 3090 of file vartype.c.

3091{
3092 return _VarR8FromR4(fltIn, pDblOut);
3093}

Referenced by test_VarR8FromR4(), VarDateFromR4(), and VARIANT_Coerce().

◆ VarR8FromStr()

HRESULT WINAPI VarR8FromStr ( const OLECHAR strIn,
LCID  lcid,
ULONG  dwFlags,
double pDblOut 
)

◆ VarR8FromUI1()

HRESULT WINAPI VarR8FromUI1 ( BYTE  bIn,
double pDblOut 
)

Definition at line 3039 of file vartype.c.

3040{
3041 return _VarR8FromUI1(bIn, pDblOut);
3042}

Referenced by test_VarR8FromUI1(), VarDateFromUI1(), and VARIANT_Coerce().

◆ VarR8FromUI2()

HRESULT WINAPI VarR8FromUI2 ( USHORT  usIn,
double pDblOut 
)

Definition at line 3223 of file vartype.c.

3224{
3225 return _VarR8FromUI2(usIn, pDblOut);
3226}

Referenced by test_VarR8FromUI2(), VarDateFromUI2(), and VARIANT_Coerce().

◆ VarR8FromUI4()

HRESULT WINAPI VarR8FromUI4 ( ULONG  ulIn,
double pDblOut 
)

Definition at line 3243 of file vartype.c.

3244{
3245 return _VarR8FromUI4(ulIn, pDblOut);
3246}

Referenced by test_VarR8FromUI4(), and VARIANT_Coerce().

◆ VarR8FromUI8()

HRESULT WINAPI VarR8FromUI8 ( ULONG64  ullIn,
double pDblOut 
)

Definition at line 3317 of file vartype.c.

3318{
3319 return _VarR8FromUI8(ullIn, pDblOut);
3320}

Referenced by test_VarR8FromUI8(), VARIANT_Coerce(), and variant_from_largeint().

◆ VarR8Pow()

HRESULT WINAPI VarR8Pow ( double  dblLeft,
double  dblPow,
double pDblOut 
)

Definition at line 3335 of file vartype.c.

3336{
3337 *pDblOut = pow(dblLeft, dblPow);
3338 return S_OK;
3339}
double pow(double x, double y)
Definition: freeldr.c:179

◆ VarR8Round()

HRESULT WINAPI VarR8Round ( double  dblIn,
int  nDig,
double pDblOut 
)

Definition at line 3362 of file vartype.c.

3363{
3364 double scale, whole, fract;
3365
3366 if (nDig < 0)
3367 return E_INVALIDARG;
3368
3369 scale = pow(10.0, nDig);
3370
3371 dblIn *= scale;
3372 whole = dblIn < 0 ? ceil(dblIn) : floor(dblIn);
3373 fract = dblIn - whole;
3374
3375 if (fract > 0.5)
3376 dblIn = whole + 1.0;
3377 else if (fract == 0.5)
3378 dblIn = whole + fmod(whole, 2.0);
3379 else if (fract >= 0.0)
3380 dblIn = whole;
3381 else if (fract == -0.5)
3382 dblIn = whole + fmod(whole, 2.0);
3383 else if (fract > -0.5)
3384 dblIn = whole;
3385 else
3386 dblIn = whole - 1.0;
3387
3388 *pDblOut = dblIn / scale;
3389 return S_OK;
3390}
_ACRTIMP double __cdecl fmod(double, double)

Referenced by Global_Round().

◆ VarUI1FromBool()

HRESULT WINAPI VarUI1FromBool ( VARIANT_BOOL  boolIn,
BYTE pbOut 
)

Definition at line 752 of file vartype.c.

753{
754 return _VarUI1FromBool(boolIn, pbOut);
755}

Referenced by test_VarUI1FromBool(), and VARIANT_Coerce().

◆ VarUI1FromCy()

HRESULT WINAPI VarUI1FromCy ( CY  cyIn,
BYTE pbOut 
)

Definition at line 670 of file vartype.c.

671{
672 ULONG i = UI1_MAX + 1;
673
674 VarUI4FromCy(cyIn, &i);
675 return _VarUI1FromUI4(i, pbOut);
676}
HRESULT WINAPI VarUI4FromCy(CY cyIn, ULONG *pulOut)
Definition: vartype.c:1891
#define UI1_MAX
Definition: variant.h:53

Referenced by test_VarUI1FromCy(), and VARIANT_Coerce().

◆ VarUI1FromDate()

HRESULT WINAPI VarUI1FromDate ( DATE  dateIn,
BYTE pbOut 
)

Definition at line 692 of file vartype.c.

693{
694 return VarUI1FromR8(dateIn, pbOut);
695}
HRESULT WINAPI VarUI1FromR8(double dblIn, BYTE *pbOut)
Definition: vartype.c:645

Referenced by test_VarUI1FromDate(), and VARIANT_Coerce().

◆ VarUI1FromDec()

HRESULT WINAPI VarUI1FromDec ( const DECIMAL pdecIn,
BYTE pbOut 
)

Definition at line 828 of file vartype.c.

829{
830 LONG64 i64;
831 HRESULT hRet;
832
833 hRet = VarI8FromDec(pdecIn, &i64);
834
835 if (SUCCEEDED(hRet))
836 hRet = _VarUI1FromI8(i64, pbOut);
837 return hRet;
838}

Referenced by test_VarUI1FromDec(), and VARIANT_Coerce().

◆ VarUI1FromDisp()

HRESULT WINAPI VarUI1FromDisp ( IDispatch pdispIn,
LCID  lcid,
BYTE pbOut 
)

Definition at line 735 of file vartype.c.

736{
737 return VARIANT_FromDisp(pdispIn, lcid, pbOut, VT_UI1, 0);
738}

Referenced by test_VarUI1FromDisp(), and VARIANT_Coerce().

◆ VarUI1FromI1()

HRESULT WINAPI VarUI1FromI1 ( signed char  cIn,
BYTE pbOut 
)

Definition at line 771 of file vartype.c.

772{
773 return _VarUI1FromI1(cIn, pbOut);
774}

Referenced by test_VarUI1FromI1().

◆ VarUI1FromI2()

HRESULT WINAPI VarUI1FromI2 ( SHORT  sIn,
BYTE pbOut 
)

Definition at line 584 of file vartype.c.

585{
586 return _VarUI1FromI2(sIn, pbOut);
587}

Referenced by test_VarUI1FromI2(), and VARIANT_Coerce().

◆ VarUI1FromI4()

HRESULT WINAPI VarUI1FromI4 ( LONG  iIn,
BYTE pbOut 
)

Definition at line 603 of file vartype.c.

604{
605 return _VarUI1FromI4(iIn, pbOut);
606}

Referenced by test_VarUI1FromI4(), and VARIANT_Coerce().

◆ VarUI1FromI8()

HRESULT WINAPI VarUI1FromI8 ( LONG64  llIn,
BYTE pbOut 
)

Definition at line 854 of file vartype.c.

855{
856 return _VarUI1FromI8(llIn, pbOut);
857}

Referenced by test_VarUI1FromI8(), and VARIANT_Coerce().

◆ VarUI1FromR4()

HRESULT WINAPI VarUI1FromR4 ( FLOAT  fltIn,
BYTE pbOut 
)

Definition at line 623 of file vartype.c.

624{
625 return VarUI1FromR8(fltIn, pbOut);
626}

Referenced by test_VarUI1FromR4(), and VARIANT_Coerce().

◆ VarUI1FromR8()

HRESULT WINAPI VarUI1FromR8 ( double  dblIn,
BYTE pbOut 
)

Definition at line 645 of file vartype.c.

646{
647 if (dblIn < -0.5 || dblIn >= UI1_MAX + 0.5)
648 return DISP_E_OVERFLOW;
649 VARIANT_DutchRound(BYTE, dblIn, *pbOut);
650 return S_OK;
651}

Referenced by test_VarUI1FromR8(), VARIANT_Coerce(), VarUI1FromDate(), and VarUI1FromR4().

◆ VarUI1FromStr()

HRESULT WINAPI VarUI1FromStr ( const OLECHAR strIn,
LCID  lcid,
ULONG  dwFlags,
BYTE pbOut 
)

Definition at line 714 of file vartype.c.

715{
716 return VARIANT_NumberFromBstr(strIn, lcid, dwFlags, pbOut, VT_UI1);
717}

Referenced by test_VarUI1FromStr(), and VARIANT_Coerce().

◆ VarUI1FromUI2()

HRESULT WINAPI VarUI1FromUI2 ( USHORT  usIn,
BYTE pbOut 
)

Definition at line 790 of file vartype.c.

791{
792 return _VarUI1FromUI2(usIn, pbOut);
793}

Referenced by test_VarUI1FromUI2(), and VARIANT_Coerce().

◆ VarUI1FromUI4()

HRESULT WINAPI VarUI1FromUI4 ( ULONG  ulIn,
BYTE pbOut 
)

Definition at line 809 of file vartype.c.

810{
811 return _VarUI1FromUI4(ulIn, pbOut);
812}

Referenced by test_VarUI1FromUI4(), and VARIANT_Coerce().

◆ VarUI1FromUI8()

HRESULT WINAPI VarUI1FromUI8 ( ULONG64  ullIn,
BYTE pbOut 
)

Definition at line 873 of file vartype.c.

874{
875 return _VarUI1FromUI8(ullIn, pbOut);
876}

Referenced by test_VarUI1FromUI8(), and VARIANT_Coerce().

◆ VarUI2FromBool()

HRESULT WINAPI VarUI2FromBool ( VARIANT_BOOL  boolIn,
USHORT pusOut 
)

Definition at line 1367 of file vartype.c.

1368{
1369 return _VarUI2FromBool(boolIn, pusOut);
1370}

Referenced by test_VarUI2FromBool(), and VARIANT_Coerce().

◆ VarUI2FromCy()

HRESULT WINAPI VarUI2FromCy ( CY  cyIn,
USHORT pusOut 
)

Definition at line 1305 of file vartype.c.

1306{
1307 ULONG i = UI2_MAX + 1;
1308
1309 VarUI4FromCy(cyIn, &i);
1310 return _VarUI2FromUI4(i, pusOut);
1311}
#define UI2_MAX
Definition: variant.h:57

Referenced by test_VarUI2FromCy(), and VARIANT_Coerce().

◆ VarUI2FromDate()

HRESULT WINAPI VarUI2FromDate ( DATE  dateIn,
USHORT pusOut 
)

Definition at line 1284 of file vartype.c.

1285{
1286 return VarUI2FromR8(dateIn, pusOut);
1287}
HRESULT WINAPI VarUI2FromR8(double dblIn, USHORT *pusOut)
Definition: vartype.c:1263

Referenced by test_VarUI2FromDate(), and VARIANT_Coerce().

◆ VarUI2FromDec()

HRESULT WINAPI VarUI2FromDec ( const DECIMAL pdecIn,
USHORT pusOut 
)

Definition at line 1422 of file vartype.c.

1423{
1424 LONG64 i64;
1425 HRESULT hRet;
1426
1427 hRet = VarI8FromDec(pdecIn, &i64);
1428
1429 if (SUCCEEDED(hRet))
1430 hRet = _VarUI2FromI8(i64, pusOut);
1431 return hRet;
1432}

Referenced by test_VarUI2FromDec(), and VARIANT_Coerce().

◆ VarUI2FromDisp()

HRESULT WINAPI VarUI2FromDisp ( IDispatch pdispIn,
LCID  lcid,
USHORT pusOut 
)

Definition at line 1350 of file vartype.c.

1351{
1352 return VARIANT_FromDisp(pdispIn, lcid, pusOut, VT_UI2, 0);
1353}

Referenced by VARIANT_Coerce().

◆ VarUI2FromI1()

HRESULT WINAPI VarUI2FromI1 ( signed char  cIn,
USHORT pusOut 
)

Definition at line 1385 of file vartype.c.

1386{
1387 return _VarUI2FromI1(cIn, pusOut);
1388}

Referenced by test_VarUI2FromI1(), and VARIANT_Coerce().

◆ VarUI2FromI2()

HRESULT WINAPI VarUI2FromI2 ( SHORT  sIn,
USHORT pusOut 
)

Definition at line 1206 of file vartype.c.

1207{
1208 return _VarUI2FromI2(sIn, pusOut);
1209}

Referenced by test_VarUI2FromI2().

◆ VarUI2FromI4()

HRESULT WINAPI VarUI2FromI4 ( LONG  iIn,
USHORT pusOut 
)

Definition at line 1224 of file vartype.c.

1225{
1226 return _VarUI2FromI4(iIn, pusOut);
1227}

Referenced by test_VarUI2FromI4(), and VARIANT_Coerce().

◆ VarUI2FromI8()

HRESULT WINAPI VarUI2FromI8 ( LONG64  llIn,
USHORT pusOut 
)

Definition at line 1447 of file vartype.c.

1448{
1449 return _VarUI2FromI8(llIn, pusOut);
1450}

Referenced by test_VarUI2FromI8().

◆ VarUI2FromR4()

HRESULT WINAPI VarUI2FromR4 ( FLOAT  fltIn,
USHORT pusOut 
)

Definition at line 1242 of file vartype.c.

1243{
1244 return VarUI2FromR8(fltIn, pusOut);
1245}

Referenced by test_VarUI2FromR4(), and VARIANT_Coerce().

◆ VarUI2FromR8()

HRESULT WINAPI VarUI2FromR8 ( double  dblIn,
USHORT pusOut 
)

Definition at line 1263 of file vartype.c.

1264{
1265 if (dblIn < -0.5 || dblIn >= UI2_MAX + 0.5)
1266 return DISP_E_OVERFLOW;
1267 VARIANT_DutchRound(USHORT, dblIn, *pusOut);
1268 return S_OK;
1269}

Referenced by test_VarUI2FromR8(), VARIANT_Coerce(), VarUI2FromDate(), and VarUI2FromR4().

◆ VarUI2FromStr()

HRESULT WINAPI VarUI2FromStr ( const OLECHAR strIn,
LCID  lcid,
ULONG  dwFlags,
USHORT pusOut 
)

Definition at line 1329 of file vartype.c.

1330{
1331 return VARIANT_NumberFromBstr(strIn, lcid, dwFlags, pusOut, VT_UI2);
1332}

Referenced by test_VarUI2FromStr(), and VARIANT_Coerce().

◆ VarUI2FromUI1()

HRESULT WINAPI VarUI2FromUI1 ( BYTE  bIn,
USHORT pusOut 
)

Definition at line 1188 of file vartype.c.

1189{
1190 return _VarUI2FromUI1(bIn, pusOut);
1191}

Referenced by test_VarUI2FromUI1(), and VARIANT_Coerce().

◆ VarUI2FromUI4()

HRESULT WINAPI VarUI2FromUI4 ( ULONG  ulIn,
USHORT pusOut 
)

Definition at line 1403 of file vartype.c.

1404{
1405 return _VarUI2FromUI4(ulIn, pusOut);
1406}

Referenced by test_VarUI2FromUI4(), and VARIANT_Coerce().

◆ VarUI2FromUI8()

HRESULT WINAPI VarUI2FromUI8 ( ULONG64  ullIn,
USHORT pusOut 
)

Definition at line 1465 of file vartype.c.

1466{
1467 return _VarUI2FromUI8(ullIn, pusOut);
1468}

Referenced by test_VarUI2FromUI8().

◆ VarUI4FromBool()

HRESULT WINAPI VarUI4FromBool ( VARIANT_BOOL  boolIn,
ULONG pulOut 
)

Definition at line 1952 of file vartype.c.

1953{
1954 return _VarUI4FromBool(boolIn, pulOut);
1955}

Referenced by test_VarUI4FromBool(), and VARIANT_Coerce().

◆ VarUI4FromCy()

HRESULT WINAPI VarUI4FromCy ( CY  cyIn,
ULONG pulOut 
)

Definition at line 1891 of file vartype.c.

1892{
1893 double d = cyIn.int64 / CY_MULTIPLIER_F;
1894 return VarUI4FromR8(d, pulOut);
1895}
HRESULT WINAPI VarUI4FromR8(double dblIn, ULONG *pulOut)
Definition: vartype.c:1852

Referenced by test_VarUI4FromCy(), VARIANT_Coerce(), VarUI1FromCy(), and VarUI2FromCy().

◆ VarUI4FromDate()

HRESULT WINAPI VarUI4FromDate ( DATE  dateIn,
ULONG pulOut 
)

Definition at line 1873 of file vartype.c.

1874{
1875 return VarUI4FromR8(dateIn, pulOut);
1876}

Referenced by test_VarUI4FromDate(), and VARIANT_Coerce().

◆ VarUI4FromDec()

HRESULT WINAPI VarUI4FromDec ( const DECIMAL pdecIn,
ULONG pulOut 
)

Definition at line 2006 of file vartype.c.

2007{
2008 LONG64 i64;
2009 HRESULT hRet;
2010
2011 hRet = VarI8FromDec(pdecIn, &i64);
2012
2013 if (SUCCEEDED(hRet))
2014 hRet = _VarUI4FromI8(i64, pulOut);
2015 return hRet;
2016}

Referenced by test_VarUI4FromDec(), and VARIANT_Coerce().

◆ VarUI4FromDisp()

HRESULT WINAPI VarUI4FromDisp ( IDispatch pdispIn,
LCID  lcid,
ULONG pulOut 
)

Definition at line 1935 of file vartype.c.

1936{
1937 return VARIANT_FromDisp(pdispIn, lcid, pulOut, VT_UI4, 0);
1938}

Referenced by VARIANT_Coerce().

◆ VarUI4FromI1()

HRESULT WINAPI VarUI4FromI1 ( signed char  cIn,
ULONG pulOut 
)

Definition at line 1970 of file vartype.c.

1971{
1972 return _VarUI4FromI1(cIn, pulOut);
1973}

Referenced by test_VarUI4FromI1(), and VARIANT_Coerce().

◆ VarUI4FromI2()

HRESULT WINAPI VarUI4FromI2 ( SHORT  sIn,
ULONG pulOut 
)

Definition at line 1795 of file vartype.c.

1796{
1797 return _VarUI4FromI2(sIn, pulOut);
1798}

Referenced by test_VarUI4FromI2(), and VARIANT_Coerce().

◆ VarUI4FromI4()

HRESULT WINAPI VarUI4FromI4 ( LONG  iIn,
ULONG pulOut 
)

Definition at line 1813 of file vartype.c.

1814{
1815 return _VarUI4FromI4(iIn, pulOut);
1816}

Referenced by test_VarUI4FromI4().

◆ VarUI4FromI8()

HRESULT WINAPI VarUI4FromI8 ( LONG64  llIn,
ULONG pulOut 
)

Definition at line 2031 of file vartype.c.

2032{
2033 return _VarUI4FromI8(llIn, pulOut);
2034}

Referenced by test_VarUI4FromI8(), test_VarUI4FromUI8(), and VARIANT_Coerce().

◆ VarUI4FromR4()

HRESULT WINAPI VarUI4FromR4 ( FLOAT  fltIn,
ULONG pulOut 
)

Definition at line 1831 of file vartype.c.

1832{
1833 return VarUI4FromR8(fltIn, pulOut);
1834}

Referenced by test_VarUI4FromR4(), test_VarUI4FromR8(), and VARIANT_Coerce().

◆ VarUI4FromR8()

HRESULT WINAPI VarUI4FromR8 ( double  dblIn,
ULONG pulOut 
)

Definition at line 1852 of file vartype.c.

1853{
1854 if (dblIn < -0.5 || dblIn >= UI4_MAX + 0.5)
1855 return DISP_E_OVERFLOW;
1856 VARIANT_DutchRound(ULONG, dblIn, *pulOut);
1857 return S_OK;
1858}
#define UI4_MAX
Definition: variant.h:61

Referenced by test_VarUI4FromR8(), VARIANT_Coerce(), VarUI4FromCy(), VarUI4FromDate(), and VarUI4FromR4().

◆ VarUI4FromStr()

HRESULT WINAPI VarUI4FromStr ( const OLECHAR strIn,
LCID  lcid,
ULONG  dwFlags,
ULONG pulOut 
)

Definition at line 1914 of file vartype.c.

1915{
1916 return VARIANT_NumberFromBstr(strIn, lcid, dwFlags, pulOut, VT_UI4);
1917}

Referenced by test_VarUI4FromStr(), and VARIANT_Coerce().

◆ VarUI4FromUI1()

HRESULT WINAPI VarUI4FromUI1 ( BYTE  bIn,
ULONG pulOut 
)

Definition at line 1777 of file vartype.c.

1778{
1779 return _VarUI4FromUI1(bIn, pulOut);
1780}

Referenced by test_VarUI4FromUI1(), and VARIANT_Coerce().

◆ VarUI4FromUI2()

HRESULT WINAPI VarUI4FromUI2 ( USHORT  usIn,
ULONG pulOut 
)

Definition at line 1987 of file vartype.c.

1988{
1989 return _VarUI4FromUI2(usIn, pulOut);
1990}

Referenced by test_VarUI4FromUI2(), and VARIANT_Coerce().

◆ VarUI4FromUI8()

HRESULT WINAPI VarUI4FromUI8 ( ULONG64  ullIn,
ULONG pulOut 
)

Definition at line 2049 of file vartype.c.

2050{
2051 return _VarUI4FromUI8(ullIn, pulOut);
2052}

Referenced by test_VarUI4FromUI8(), and VARIANT_Coerce().

◆ VarUI8FromBool()

HRESULT WINAPI VarUI8FromBool ( VARIANT_BOOL  boolIn,
ULONG64 pui64Out 
)

Definition at line 2588 of file vartype.c.

2589{
2590 return VarI8FromI2(boolIn, (LONG64 *)pui64Out);
2591}

Referenced by test_VarUI8FromBool(), and VARIANT_Coerce().

◆ VarUI8FromCy()

HRESULT WINAPI VarUI8FromCy ( CY  cyIn,
ULONG64 pui64Out 
)

Definition at line 2492 of file vartype.c.

2493{
2494 if (cyIn.int64 < 0)
2495 {
2496 if (cyIn.int64 < -CY_HALF)
2497 return DISP_E_OVERFLOW;
2498 *pui64Out = 0;
2499 }
2500 else
2501 {
2502 *pui64Out = cyIn.int64 / CY_MULTIPLIER;
2503
2504 cyIn.int64 -= *pui64Out * CY_MULTIPLIER; /* cyIn.Lo now holds fractional remainder */
2505
2506 if (cyIn.Lo > CY_HALF || (cyIn.Lo == CY_HALF && (*pui64Out & 0x1)))
2507 (*pui64Out)++;
2508 }
2509 return S_OK;
2510}

Referenced by test_VarUI8FromCy(), and VARIANT_Coerce().

◆ VarUI8FromDate()

HRESULT WINAPI VarUI8FromDate ( DATE  dateIn,
ULONG64 pui64Out 
)

Definition at line 2527 of file vartype.c.

2528{
2529 return VarUI8FromR8(dateIn, pui64Out);
2530}
HRESULT WINAPI VarUI8FromR8(double dblIn, ULONG64 *pui64Out)
Definition: vartype.c:2467

Referenced by test_VarUI8FromDate(), and VARIANT_Coerce().

◆ VarUI8FromDec()

HRESULT WINAPI VarUI8FromDec ( const DECIMAL pdecIn,
ULONG64 pui64Out 
)

Definition at line 2664 of file vartype.c.

2665{
2666 if (!pdecIn->scale)
2667 {
2668 /* This decimal is just a 96 bit integer */
2669 if (pdecIn->sign & ~DECIMAL_NEG)
2670 return E_INVALIDARG;
2671
2672 if (pdecIn->Hi32)
2673 return DISP_E_OVERFLOW;
2674
2675 if (pdecIn->sign)
2676 {
2677 WARN("Sign would be ignored under Win32!\n");
2678 return DISP_E_OVERFLOW;
2679 }
2680
2681 *pui64Out = pdecIn->Lo64;
2682 return S_OK;
2683 }
2684 else
2685 {
2686 /* Decimal contains a floating point number */
2687 HRESULT hRet;
2688 double dbl;
2689
2690 hRet = VarR8FromDec(pdecIn, &dbl);
2691 if (SUCCEEDED(hRet))
2692 hRet = VarUI8FromR8(dbl, pui64Out);
2693 return hRet;
2694 }
2695}

Referenced by test_VarUI8FromDec(), and VARIANT_Coerce().

◆ VarUI8FromDisp()

HRESULT WINAPI VarUI8FromDisp ( IDispatch pdispIn,
LCID  lcid,
ULONG64 pui64Out 
)

Definition at line 2570 of file vartype.c.

2571{
2572 return VARIANT_FromDisp(pdispIn, lcid, pui64Out, VT_UI8, 0);
2573}

Referenced by VARIANT_Coerce().

◆ VarUI8FromI1()

HRESULT WINAPI VarUI8FromI1 ( signed char  cIn,
ULONG64 pui64Out 
)

Definition at line 2605 of file vartype.c.

2606{
2607 return _VarUI8FromI1(cIn, pui64Out);
2608}

Referenced by test_VarUI8FromI1(), and VARIANT_Coerce().

◆ VarUI8FromI2()

HRESULT WINAPI VarUI8FromI2 ( SHORT  sIn,
ULONG64 pui64Out 
)

Definition at line 2427 of file vartype.c.

2428{
2429 return _VarUI8FromI2(sIn, pui64Out);
2430}

Referenced by test_VarUI8FromI2(), and VARIANT_Coerce().

◆ VarUI8FromI8()

HRESULT WINAPI VarUI8FromI8 ( LONG64  llIn,
ULONG64 pui64Out 
)

Definition at line 2393 of file vartype.c.

2394{
2395 return _VarUI8FromI8(llIn, pui64Out);
2396}

Referenced by test_VarUI8FromI8().

◆ VarUI8FromR4()

HRESULT WINAPI VarUI8FromR4 ( FLOAT  fltIn,
ULONG64 pui64Out 
)

Definition at line 2445 of file vartype.c.

2446{
2447 return VarUI8FromR8(fltIn, pui64Out);
2448}

Referenced by test_VarUI8FromR4(), and VARIANT_Coerce().

◆ VarUI8FromR8()

HRESULT WINAPI VarUI8FromR8 ( double  dblIn,
ULONG64 pui64Out 
)

Definition at line 2467 of file vartype.c.

2468{
2469 if (dblIn < -0.5 || dblIn > 1.844674407370955e19)
2470 return DISP_E_OVERFLOW;
2471 VARIANT_DutchRound(ULONG64, dblIn, *pui64Out);
2472 return S_OK;
2473}

Referenced by test_VarUI8FromR8(), VARIANT_Coerce(), VarUI8FromDate(), VarUI8FromDec(), and VarUI8FromR4().

◆ VarUI8FromStr()

HRESULT WINAPI VarUI8FromStr ( const OLECHAR strIn,
LCID  lcid,
ULONG  dwFlags,
ULONG64 pui64Out 
)

Definition at line 2549 of file vartype.c.

2550{
2551 return VARIANT_NumberFromBstr(strIn, lcid, dwFlags, pui64Out, VT_UI8);
2552}

Referenced by test_VarUI8FromStr(), and VARIANT_Coerce().

◆ VarUI8FromUI1()

HRESULT WINAPI VarUI8FromUI1 ( BYTE  bIn,
ULONG64 pui64Out 
)

Definition at line 2410 of file vartype.c.

2411{
2412 return _VarUI8FromUI1(bIn, pui64Out);
2413}

Referenced by test_VarUI8FromUI1(), and VARIANT_Coerce().

◆ VarUI8FromUI2()

HRESULT WINAPI VarUI8FromUI2 ( USHORT  usIn,
ULONG64 pui64Out 
)

Definition at line 2622 of file vartype.c.

2623{
2624 return _VarUI8FromUI2(usIn, pui64Out);
2625}

Referenced by test_VarUI8FromUI2(), and VARIANT_Coerce().

◆ VarUI8FromUI4()

HRESULT WINAPI VarUI8FromUI4 ( ULONG  ulIn,
ULONG64 pui64Out 
)

Definition at line 2639 of file vartype.c.

2640{
2641 return _VarUI8FromUI4(ulIn, pui64Out);
2642}

Referenced by test_VarUI8FromUI4(), and VARIANT_Coerce().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( variant  )

Variable Documentation

◆ CY_Divisors

const int CY_Divisors[5]
static
Initial value:

Definition at line 3396 of file vartype.c.

Referenced by VarCyFromDec(), and VarCyRound().

◆ hProxyDll

HMODULE hProxyDll
extern

Definition at line 40 of file combase.c.

Referenced by VARIANT_GetLocalisedText().