Commit bc93bc83 authored by Justin Bradford's avatar Justin Bradford Committed by Alexandre Julliard

Most of the currency variant conversion functions implemented.

Minor bugfixes and header tidying.
parent b6eda081
#ifndef __WINE_MAPIDEFS_H
#define __WINE_MAPIDEFS_H
#include "wintypes.h"
typedef union tagCY CY;
union tagCY{
struct {
unsigned long Lo;
long Hi;
} u;
LONGLONG int64;
};
#endif /*__WINE_MAPIDEFS_H*/
......@@ -2,6 +2,7 @@
#define __WINE_OLEAUTO_H
#include <ole.h>
#include "mapidefs.h"
BSTR16 WINAPI SysAllocString16(LPOLESTR16);
BSTR32 WINAPI SysAllocString32(LPOLESTR32);
......@@ -38,7 +39,6 @@ typedef short VARIANT_BOOL;
#define VARIANT_TRUE 0xFFFF
#define VARIANT_FALSE 0x0000
typedef double DATE;
typedef LONG SCODE;
enum VARENUM {
......@@ -135,9 +135,9 @@ struct tagVARIANT {
SCODE scode;
DATE date;
BSTR32 bstrVal;
CY cyVal;
/*
DECIMAL decVal;
CY cyVal;
IUnknown* punkVal;
IDispatch* pdispVal;
SAFEARRAY* parray;
......@@ -161,9 +161,9 @@ struct tagVARIANT {
BSTR32* pbstrVal;
VARIANT* pvarVal;
PVOID byref;
CY* pcyVal;
/*
DECIMAL* pdecVal;
CY* pcyVal;
IUnknown** ppunkVal;
IDispatch** ppdispVal;
SAFEARRAY** pparray;
......@@ -296,14 +296,14 @@ HRESULT WINAPI VarUI1FromUI432(ULONG ulIn, BYTE*pbOut);
#define VarUI1FromUI4 WINELIB_NAME(VarUI1FromUI4)
HRESULT WINAPI VarUI1FromStr32(OLECHAR32* strIn, LCID lcid, ULONG dwFlags, BYTE* pbOut);
#define VarUI1FromStr WINELIB_NAME(VarUI1FromStr)
HRESULT WINAPI VarUI1FromCy32(CY cyIn, BYTE* pbOut);
#define VarUI1FromCy WINELIB_NAME(VarUI1FromCy)
/*
HRESULT WINAPI VarUI1FromDec32(DECIMAL*pdecIn, BYTE*pbOut);
#define VarUI1FromDec WINELIB_NAME(VarUI1FromDec)
HRESULT WINAPI VarUI1FromDisp32(IDispatch* pdispIn, LCID lcid, BYTE* pbOut);
#define VarUI1FromDisp WINELIB_NAME(VarUI1FromDisp)
HRESULT WINAPI VarUI1FromCy32(CY cyIn, BYTE* pbOut);
#define VarUI1FromCy WINELIB_NAME(VarUI1FromCy)
*/
HRESULT WINAPI VarI2FromUI132(BYTE bIn, short* psOut);
......@@ -326,13 +326,13 @@ HRESULT WINAPI VarI2FromUI432(ULONG ulIn, short*psOut);
#define VarI2FromUI4 WINELIB_NAME(VarI2FromUI4)
HRESULT WINAPI VarI2FromStr32(OLECHAR32* strIn, LCID lcid, ULONG dwFlags, short* psOut);
#define VarI2FromStr WINELIB_NAME(VarI2FromStr)
HRESULT WINAPI VarI2FromCy32(CY cyIn, short* psOut);
#define VarI2FromCy WINELIB_NAME(VarI2FromCy)
/*
HRESULT WINAPI VarI2FromDec32(DECIMAL*pdecIn, short*psOut);
#define VarI2FromDec WINELIB_NAME(VarI2FromDec)
HRESULT WINAPI VarI2FromDisp32(IDispatch* pdispIn, LCID lcid, short* psOut);
#define VarI2FromDisp WINELIB_NAME(VarI2FromDisp)
HRESULT WINAPI VarI2FromCy32(CY cyIn, short* psOut);
#define VarI2FromCy WINELIB_NAME(VarI2FromCy)
*/
HRESULT WINAPI VarI4FromUI132(BYTE bIn, LONG* plOut);
......@@ -355,9 +355,9 @@ HRESULT WINAPI VarI4FromUI432(ULONG ulIn, LONG*plOut);
#define VarI4FromUI4 WINELIB_NAME(VarI4FromUI4)
HRESULT WINAPI VarI4FromStr32(OLECHAR32* strIn, LCID lcid, ULONG dwFlags, LONG* plOut);
#define VarI4FromStr WINELIB_NAME(VarI4FromStr)
/*
HRESULT WINAPI VarI4FromCy32(CY cyIn, LONG* plOut);
#define VarI4FromCy WINELIB_NAME(VarI4FromCy)
/*
HRESULT WINAPI VarI4FromDec32(DECIMAL*pdecIn, LONG*plOut);
#define VarI4FromDec WINELIB_NAME(VarI4FromDec)
HRESULT WINAPI VarI4FromDisp32(IDispatch* pdispIn, LCID lcid, LONG* plOut);
......@@ -384,13 +384,13 @@ HRESULT WINAPI VarR4FromUI432(ULONG ulIn, FLOAT*pfltOut);
#define VarR4FromUI4 WINELIB_NAME(VarR4FromUI4)
HRESULT WINAPI VarR4FromStr32(OLECHAR32* strIn, LCID lcid, ULONG dwFlags, FLOAT*pfltOut);
#define VarR4FromStr WINELIB_NAME(VarR4FromStr)
HRESULT WINAPI VarR4FromCy32(CY cyIn, FLOAT* pfltOut);
#define VarR4FromCy WINELIB_NAME(VarR4FromCy)
/*
HRESULT WINAPI VarR4FromDec32(DECIMAL*pdecIn, FLOAT*pfltOut);
#define VarR4FromDec WINELIB_NAME(VarR4FromDec)
HRESULT WINAPI VarR4FromDisp32(IDispatch* pdispIn, LCID lcid, FLOAT* pfltOut);
#define VarR4FromDisp WINELIB_NAME(VarR4FromDisp)
HRESULT WINAPI VarR4FromCy32(CY cyIn, FLOAT* pfltOut);
#define VarR4FromCy WINELIB_NAME(VarR4FromCy)
*/
HRESULT WINAPI VarR8FromUI132(BYTE bIn, double* pdblOut);
......@@ -413,11 +413,11 @@ HRESULT WINAPI VarR8FromUI432(ULONG ulIn, double*pdblOut);
#define VarR8FromUI4 WINELIB_NAME(VarR8FromUI4)
HRESULT WINAPI VarR8FromStr32(OLECHAR32*strIn, LCID lcid, ULONG dwFlags, double*pdblOut);
#define VarR8FromStr WINELIB_NAME(VarR8FromStr)
HRESULT WINAPI VarR8FromCy32(CY cyIn, double* pdblOut);
#define VarR8FromCy WINELIB_NAME(VarR8FromCy)
/*
HRESULT WINAPI VarR8FromDec32(DECIMAL*pdecIn, double*pdblOut);
#define VarR8FromDec WINELIB_NAME(VarR8FromDec)
HRESULT WINAPI VarR8FromCy32(CY cyIn, double* pdblOut);
#define VarR8FromCy WINELIB_NAME(VarR8FromCy)
HRESULT WINAPI VarR8FromDisp32(IDispatch* pdispIn, LCID lcid, double* pdblOut);
#define VarR8FromDisp WINELIB_NAME(VarR8FromDisp)
*/
......@@ -442,14 +442,14 @@ HRESULT WINAPI VarDateFromUI432(ULONG ulIn, DATE*pdateOut);
#define VarDateFromUI4 WINELIB_NAME(VarDateFromUI4)
HRESULT WINAPI VarDateFromBool32(VARIANT_BOOL boolIn, DATE* pdateOut);
#define VarDateFromBool WINELIB_NAME(VarDateFromBool)
HRESULT WINAPI VarDateFromCy32(CY cyIn, DATE* pdateOut);
#define VarDateFromCy WINELIB_NAME(VarDateFromCy)
/*
HRESULT WINAPI VarDateFromDec32(DECIMAL*pdecIn, DATE*pdateOut);
#define VarDateFromDec WINELIB_NAME(VarDateFromDec)
HRESULT WINAPI VarDateFromDisp32(IDispatch* pdispIn, LCID lcid, DATE* pdateOut);
#define VarDateFromDisp WINELIB_NAME(VarDateFromDisp)
HRESULT WINAPI VarDateFromCy32(CY cyIn, DATE* pdateOut);
#define VarDateFromCy WINELIB_NAME(VarDateFromCy)
*/
HRESULT WINAPI VarCyFromUI132(BYTE bIn, CY* pcyOut);
#define VarCyFromUI1 WINELIB_NAME(VarCyFromUI1)
HRESULT WINAPI VarCyFromI232(short sIn, CY* pcyOut);
......@@ -462,10 +462,6 @@ HRESULT WINAPI VarCyFromR832(double dblIn, CY* pcyOut);
#define VarCyFromR8 WINELIB_NAME(VarCyFromR8)
HRESULT WINAPI VarCyFromDate32(DATE dateIn, CY* pcyOut);
#define VarCyFromDate WINELIB_NAME(VarCyFromDate)
HRESULT WINAPI VarCyFromStr32(OLECHAR32* strIn, LCID lcid, ULONG dwFlags, CY* pcyOut);
#define VarCyFromStr WINELIB_NAME(VarCyFromStr)
HRESULT WINAPI VarCyFromDisp32(IDispatch* pdispIn, LCID lcid, CY* pcyOut);
#define VarCyFromDisp WINELIB_NAME(VarCyFromDisp)
HRESULT WINAPI VarCyFromBool32(VARIANT_BOOL boolIn, CY* pcyOut);
#define VarCyFromBool WINELIB_NAME(VarCyFromBool)
HRESULT WINAPI VarCyFromI132(CHAR cIn, CY*pcyOut);
......@@ -474,8 +470,13 @@ HRESULT WINAPI VarCyFromUI232(USHORT uiIn, CY*pcyOut);
#define VarCyFromUI2 WINELIB_NAME(VarCyFromUI2)
HRESULT WINAPI VarCyFromUI432(ULONG ulIn, CY*pcyOut);
#define VarCyFromUI4 WINELIB_NAME(VarCyFromUI4)
/*
HRESULT WINAPI VarCyFromDec32(DECIMAL*pdecIn, CY*pcyOut);
#define VarCyFromDec WINELIB_NAME(VarCyFromDec)
HRESULT WINAPI VarCyFromStr32(OLECHAR32* strIn, LCID lcid, ULONG dwFlags, CY* pcyOut);
#define VarCyFromStr WINELIB_NAME(VarCyFromStr)
HRESULT WINAPI VarCyFromDisp32(IDispatch* pdispIn, LCID lcid, CY* pcyOut);
#define VarCyFromDisp WINELIB_NAME(VarCyFromDisp)
*/
HRESULT WINAPI VarBstrFromUI132(BYTE bVal, LCID lcid, ULONG dwFlags, BSTR32* pbstrOut);
......@@ -498,11 +499,11 @@ HRESULT WINAPI VarBstrFromUI232(USHORT uiIn, LCID lcid, ULONG dwFlags, BSTR32*pb
#define VarBstrFromUI2 WINELIB_NAME(VarBstrFromUI2)
HRESULT WINAPI VarBstrFromUI432(ULONG ulIn, LCID lcid, ULONG dwFlags, BSTR32*pbstrOut);
#define VarBstrFromUI4 WINELIB_NAME(VarBstrFromUI4)
HRESULT WINAPI VarBstrFromCy32(CY cyIn, LCID lcid, ULONG dwFlags, BSTR32* pbstrOut);
#define VarBstrFromCy WINELIB_NAME(VarBstrFromCy)
/*
HRESULT WINAPI VarBstrFromDec32(DECIMAL*pdecIn, LCID lcid, ULONG dwFlags, BSTR32*pbstrOut);
#define VarBstrFromDec WINELIB_NAME(VarBstrFromDec)
HRESULT WINAPI VarBstrFromCy32(CY cyIn, LCID lcid, ULONG dwFlags, BSTR32* pbstrOut);
#define VarBstrFromCy WINELIB_NAME(VarBstrFromCy)
HRESULT WINAPI VarBstrFromDisp32(IDispatch* pdispIn, LCID lcid, ULONG dwFlags, BSTR32* pbstrOut);
#define VarBstrFromDisp WINELIB_NAME(VarBstrFromDisp)
*/
......@@ -527,11 +528,11 @@ HRESULT WINAPI VarBoolFromUI232(USHORT uiIn, VARIANT_BOOL*pboolOut);
#define VarBoolFromUI2 WINELIB_NAME(VarBoolFromUI2)
HRESULT WINAPI VarBoolFromUI432(ULONG ulIn, VARIANT_BOOL*pboolOut);
#define VarBoolFromUI4 WINELIB_NAME(VarBoolFromUI4)
HRESULT WINAPI VarBoolFromCy32(CY cyIn, VARIANT_BOOL* pboolOut);
#define VarBoolFromCy WINELIB_NAME(VarBoolFromCy)
/*
HRESULT WINAPI VarBoolFromDec32(DECIMAL*pdecIn, VARIANT_BOOL*pboolOut);
#define VarBoolFromDec WINELIB_NAME(VarBoolFromDec)
HRESULT WINAPI VarBoolFromCy32(CY cyIn, VARIANT_BOOL* pboolOut);
#define VarBoolFromCy WINELIB_NAME(VarBoolFromCy)
HRESULT WINAPI VarBoolFromDisp32(IDispatch* pdispIn, LCID lcid, VARIANT_BOOL* pboolOut);
#define VarBoolFromDisp WINELIB_NAME(VarBoolFromDisp)
*/
......@@ -556,13 +557,13 @@ HRESULT WINAPI VarI1FromUI232(USHORT uiIn, CHAR*pcOut);
#define VarI1FromUI2 WINELIB_NAME(VarI1FromUI2)
HRESULT WINAPI VarI1FromUI432(ULONG ulIn, CHAR*pcOut);
#define VarI1FromUI4 WINELIB_NAME(VarI1FromUI4)
HRESULT WINAPI VarI1FromCy32(CY cyIn, CHAR*pcOut);
#define VarI1FromCy WINELIB_NAME(VarI1FromCy)
/*
HRESULT WINAPI VarI1FromDec32(DECIMAL*pdecIn, CHAR*pcOut);
#define VarI1FromDec WINELIB_NAME(VarI1FromDec)
HRESULT WINAPI VarI1FromDisp32(IDispatch*pdispIn, LCID lcid, CHAR*pcOut);
#define VarI1FromDisp WINELIB_NAME(VarI1FromDisp)
HRESULT WINAPI VarI1FromCy32(CY cyIn, CHAR*pcOut);
#define VarI1FromCy WINELIB_NAME(VarI1FromCy)
*/
HRESULT WINAPI VarUI2FromUI132(BYTE bIn, USHORT*puiOut);
......@@ -585,11 +586,11 @@ HRESULT WINAPI VarUI2FromI132(CHAR cIn, USHORT*puiOut);
#define VarUI2FromI1 WINELIB_NAME(VarUI2FromI1)
HRESULT WINAPI VarUI2FromUI432(ULONG ulIn, USHORT*puiOut);
#define VarUI2FromUI4 WINELIB_NAME(VarUI2FromUI4)
HRESULT WINAPI VarUI2FromCy32(CY cyIn, USHORT*puiOut);
#define VarUI2FromCy WINELIB_NAME(VarUI2FromCy)
/*
HRESULT WINAPI VarUI2FromDec32(DECIMAL*pdecIn, USHORT*puiOut);
#define VarUI2FromDec WINELIB_NAME(VarUI2FromDec)
HRESULT WINAPI VarUI2FromCy32(CY cyIn, USHORT*puiOut);
#define VarUI2FromCy WINELIB_NAME(VarUI2FromCy)
HRESULT WINAPI VarUI2FromDisp32(IDispatch*pdispIn, LCID lcid, USHORT*puiOut);
#define VarUI2FromDisp WINELIB_NAME(VarUI2FromDisp)
*/
......@@ -614,13 +615,13 @@ HRESULT WINAPI VarUI4FromI132(CHAR cIn, ULONG*pulOut);
#define VarUI4FromI1 WINELIB_NAME(VarUI4FromI1)
HRESULT WINAPI VarUI4FromUI232(USHORT uiIn, ULONG*pulOut);
#define VarUI4FromUI2 WINELIB_NAME(VarUI4FromUI2)
HRESULT WINAPI VarUI4FromCy32(CY cyIn, ULONG*pulOut);
#define VarUI4FromCy WINELIB_NAME(VarUI4FromCy)
/*
HRESULT WINAPI VarUI4FromDec32(DECIMAL*pdecIn, ULONG*pulOut);
#define VarUI4FromDec WINELIB_NAME(VarUI4FromDec)
HRESULT WINAPI VarUI4FromDisp32(IDispatch*pdispIn, LCID lcid, ULONG*pulOut);
#define VarUI4FromDisp WINELIB_NAME(VarUI4FromDisp)
HRESULT WINAPI VarUI4FromCy32(CY cyIn, ULONG*pulOut);
#define VarUI4FromCy WINELIB_NAME(VarUI4FromCy)
HRESULT WINAPI VarDecFromUI132(BYTE bIn, DECIMAL*pdecOut);
#define VarDecFromUI1 WINELIB_NAME(VarDecFromUI1)
......
......@@ -110,8 +110,6 @@ typedef struct PDEVICE_HEADER
LOADED_PRINTER_DRIVER *pLPD; /* Associated printer driver */
} PDEVICE_HEADER;
typedef short SHORT;
#pragma pack(1)
#define PCOLOR DWORD
typedef struct DRAWMODE
......
......@@ -80,6 +80,7 @@ typedef unsigned long DWORD;
typedef unsigned long ULONG;
typedef unsigned char BYTE;
typedef long LONG;
typedef short SHORT;
typedef unsigned short USHORT;
typedef char CHAR;
typedef unsigned char UCHAR;
......@@ -87,6 +88,11 @@ typedef unsigned char UCHAR;
typedef unsigned short WCHAR;
typedef unsigned short BOOL16;
typedef int BOOL32;
typedef double DATE;
#ifdef __i386__
typedef double LONGLONG;
typedef double ULONGLONG;
#endif /*__i386__*/
/* Integer types. These are the same for emulator and library. */
......
......@@ -448,7 +448,7 @@ sizeof((i).ifr_name)+(i).ifr_addr.sa_len)
TRACE(ole, "%p", pguid);
return 1;
return S_OK;
}
/******************************************************************************
......
......@@ -19,10 +19,12 @@
* working on this.
*/
#include "wintypes.h"
#include "oleauto.h"
#include "heap.h"
#include "debug.h"
#include "winerror.h"
#include "mapidefs.h"
#include <string.h>
#include <stdlib.h>
......@@ -41,7 +43,7 @@ static const short I2_MIN = -32768;
static const unsigned long UI4_MAX = 4294967295;
static const unsigned long UI4_MIN = 0;
static const long I4_MAX = 2147483647;
static const long I4_MIN = -2147483648.0;
static const long I4_MIN = -2147483648;
static const DATE DATE_MIN = -657434;
static const DATE DATE_MAX = 2958465;
......@@ -138,20 +140,18 @@ static BSTR32 StringDupAtoBstr( char* strIn )
*/
static double round( double d )
{
double decimals = 0.0;
unsigned long integerValue = 0.0;
double roundedValue = 0.0;
double decimals = 0.0, integerValue = 0.0, roundedValue = 0.0;
BOOL32 bEvenNumber = FALSE;
int nSign = 0;
/* Save the sign of the number
*/
nSign = d >= 0.0 ? 1 : -1;
nSign = (d >= 0.0) ? 1 : -1;
d = fabs( d );
/* Remove the decimals.
*/
integerValue = (unsigned long) d;
integerValue = floor( d );
/* Set the Even flag. This is used to round the number when
* the decimals are exactly 1/2. If the integer part is
......@@ -159,7 +159,7 @@ static double round( double d )
* is even the number is rounded down. Using this method
* numbers are rounded up|down half the time.
*/
bEvenNumber = ((integerValue % 2) == 0) ? TRUE : FALSE;
bEvenNumber = (((short)fmod(integerValue, 2)) == 0) ? TRUE : FALSE;
/* Remove the integral part of the number.
*/
......@@ -198,7 +198,6 @@ static double round( double d )
return roundedValue * nSign;
}
/******************************************************************************
* RemoveCharacterFromString [INTERNAL]
*
......@@ -535,7 +534,7 @@ static HRESULT Coerce( VARIANTARG* pd, LCID lcid, ULONG dwFlags, VARIANTARG* ps,
res = VarI1FromStr32( ps->u.bstrVal, lcid, dwFlags, &(pd->u.cVal) );
break;
case( VT_CY ):
/*res = VarI1FromCY32( ps->u.cyVal, &(pd->u.cVal) );*/
res = VarI1FromCy32( ps->u.cyVal, &(pd->u.cVal) );
case( VT_DISPATCH ):
/*res = VarI1FromDisp32( ps->u.pdispVal, lcid, &(pd->u.cVal) );*/
case( VT_UNKNOWN ):
......@@ -588,7 +587,7 @@ static HRESULT Coerce( VARIANTARG* pd, LCID lcid, ULONG dwFlags, VARIANTARG* ps,
res = VarI2FromStr32( ps->u.bstrVal, lcid, dwFlags, &(pd->u.iVal) );
break;
case( VT_CY ):
/*res = VarI2FromCY32( ps->u.cyVal, &(pd->u.iVal) );*/
res = VarI2FromCy32( ps->u.cyVal, &(pd->u.iVal) );
case( VT_DISPATCH ):
/*res = VarI2FromDisp32( ps->u.pdispVal, lcid, &(pd->u.iVal) );*/
case( VT_UNKNOWN ):
......@@ -642,7 +641,7 @@ static HRESULT Coerce( VARIANTARG* pd, LCID lcid, ULONG dwFlags, VARIANTARG* ps,
res = VarI4FromStr32( ps->u.bstrVal, lcid, dwFlags, &(pd->u.lVal) );
break;
case( VT_CY ):
/*res = VarI4FromCY32( ps->u.cyVal, &(pd->u.lVal) );*/
res = VarI4FromCy32( ps->u.cyVal, &(pd->u.lVal) );
case( VT_DISPATCH ):
/*res = VarI4FromDisp32( ps->u.pdispVal, lcid, &(pd->u.lVal) );*/
case( VT_UNKNOWN ):
......@@ -695,7 +694,7 @@ static HRESULT Coerce( VARIANTARG* pd, LCID lcid, ULONG dwFlags, VARIANTARG* ps,
res = VarUI1FromStr32( ps->u.bstrVal, lcid, dwFlags, &(pd->u.bVal) );
break;
case( VT_CY ):
/*res = VarUI1FromCY32( ps->u.cyVal, &(pd->u.bVal) );*/
res = VarUI1FromCy32( ps->u.cyVal, &(pd->u.bVal) );
case( VT_DISPATCH ):
/*res = VarUI1FromDisp32( ps->u.pdispVal, lcid, &(pd->u.bVal) );*/
case( VT_UNKNOWN ):
......@@ -748,7 +747,7 @@ static HRESULT Coerce( VARIANTARG* pd, LCID lcid, ULONG dwFlags, VARIANTARG* ps,
res = VarUI2FromStr32( ps->u.bstrVal, lcid, dwFlags, &(pd->u.uiVal) );
break;
case( VT_CY ):
/*res = VarUI2FromCY32( ps->u.cyVal, &(pd->u.uiVal) );*/
res = VarUI2FromCy32( ps->u.cyVal, &(pd->u.uiVal) );
case( VT_DISPATCH ):
/*res = VarUI2FromDisp32( ps->u.pdispVal, lcid, &(pd->u.uiVal) );*/
case( VT_UNKNOWN ):
......@@ -801,7 +800,7 @@ static HRESULT Coerce( VARIANTARG* pd, LCID lcid, ULONG dwFlags, VARIANTARG* ps,
res = VarUI4FromStr32( ps->u.bstrVal, lcid, dwFlags, &(pd->u.ulVal) );
break;
case( VT_CY ):
/*res = VarUI4FromCY32( ps->u.cyVal, &(pd->u.ulVal) );*/
res = VarUI4FromCy32( ps->u.cyVal, &(pd->u.ulVal) );
case( VT_DISPATCH ):
/*res = VarUI4FromDisp32( ps->u.pdispVal, lcid, &(pd->u.ulVal) );*/
case( VT_UNKNOWN ):
......@@ -854,7 +853,7 @@ static HRESULT Coerce( VARIANTARG* pd, LCID lcid, ULONG dwFlags, VARIANTARG* ps,
res = VarR4FromStr32( ps->u.bstrVal, lcid, dwFlags, &(pd->u.fltVal) );
break;
case( VT_CY ):
/*res = VarR4FromCY32( ps->u.cyVal, &(pd->u.fltVal) );*/
res = VarR4FromCy32( ps->u.cyVal, &(pd->u.fltVal) );
case( VT_DISPATCH ):
/*res = VarR4FromDisp32( ps->u.pdispVal, lcid, &(pd->u.fltVal) );*/
case( VT_UNKNOWN ):
......@@ -907,7 +906,7 @@ static HRESULT Coerce( VARIANTARG* pd, LCID lcid, ULONG dwFlags, VARIANTARG* ps,
res = VarR8FromStr32( ps->u.bstrVal, lcid, dwFlags, &(pd->u.dblVal) );
break;
case( VT_CY ):
/*res = VarR8FromCY32( ps->u.cyVal, &(pd->u.dblVal) );*/
res = VarR8FromCy32( ps->u.cyVal, &(pd->u.dblVal) );
case( VT_DISPATCH ):
/*res = VarR8FromDisp32( ps->u.pdispVal, lcid, &(pd->u.dblVal) );*/
case( VT_UNKNOWN ):
......@@ -964,7 +963,7 @@ static HRESULT Coerce( VARIANTARG* pd, LCID lcid, ULONG dwFlags, VARIANTARG* ps,
res = VarDateFromStr32( ps->u.bstrVal, lcid, dwFlags, &(pd->u.date) );
break;
case( VT_CY ):
/*res = VarDateFromCY32( ps->u.cyVal, &(pd->u.date) );*/
res = VarDateFromCy32( ps->u.cyVal, &(pd->u.date) );
case( VT_DISPATCH ):
/*res = VarDateFromDisp32( ps->u.pdispVal, lcid, &(pd->u.date) );*/
case( VT_UNKNOWN ):
......@@ -1021,7 +1020,7 @@ static HRESULT Coerce( VARIANTARG* pd, LCID lcid, ULONG dwFlags, VARIANTARG* ps,
res = VarBoolFromStr32( ps->u.bstrVal, lcid, dwFlags, &(pd->u.boolVal) );
break;
case( VT_CY ):
/*res = VarBoolFromCY32( ps->u.cyVal, &(pd->u.boolVal) );*/
res = VarBoolFromCy32( ps->u.cyVal, &(pd->u.boolVal) );
case( VT_DISPATCH ):
/*res = VarBoolFromDisp32( ps->u.pdispVal, lcid, &(pd->u.boolVal) );*/
case( VT_UNKNOWN ):
......@@ -1078,7 +1077,7 @@ static HRESULT Coerce( VARIANTARG* pd, LCID lcid, ULONG dwFlags, VARIANTARG* ps,
res = VariantCopy32( pd, ps );
break;
case( VT_CY ):
/*res = VarBstrFromCY32( ps->u.cyVal, lcid, dwFlags, &(pd->u.bstrVal) );*/
/*res = VarBstrFromCy32( ps->u.cyVal, lcid, dwFlags, &(pd->u.bstrVal) );*/
case( VT_DISPATCH ):
/*res = VarBstrFromDisp32( ps->u.pdispVal, lcid, lcid, dwFlags, &(pd->u.bstrVal) );*/
case( VT_UNKNOWN ):
......@@ -1092,6 +1091,63 @@ static HRESULT Coerce( VARIANTARG* pd, LCID lcid, ULONG dwFlags, VARIANTARG* ps,
}
break;
case( VT_CY ):
switch( vtFrom )
{
case( VT_I1 ):
res = VarCyFromI132( ps->u.cVal, &(pd->u.cyVal) );
break;
case( VT_I2 ):
res = VarCyFromI232( ps->u.iVal, &(pd->u.cyVal) );
break;
case( VT_INT ):
res = VarCyFromInt32( ps->u.intVal, &(pd->u.cyVal) );
break;
case( VT_I4 ):
res = VarCyFromI432( ps->u.lVal, &(pd->u.cyVal) );
break;
case( VT_UI1 ):
res = VarCyFromUI132( ps->u.bVal, &(pd->u.cyVal) );
break;
case( VT_UI2 ):
res = VarCyFromUI232( ps->u.uiVal, &(pd->u.cyVal) );
break;
case( VT_UINT ):
res = VarCyFromUint32( ps->u.uintVal, &(pd->u.cyVal) );
break;
case( VT_UI4 ):
res = VarCyFromUI432( ps->u.ulVal, &(pd->u.cyVal) );
break;
case( VT_R4 ):
res = VarCyFromR432( ps->u.fltVal, &(pd->u.cyVal) );
break;
case( VT_R8 ):
res = VarCyFromR832( ps->u.dblVal, &(pd->u.cyVal) );
break;
case( VT_DATE ):
res = VarCyFromDate32( ps->u.date, &(pd->u.cyVal) );
break;
case( VT_BOOL ):
res = VarCyFromBool32( ps->u.date, &(pd->u.cyVal) );
break;
case( VT_CY ):
res = VariantCopy32( pd, ps );
break;
case( VT_BSTR ):
/*res = VarCyFromStr32( ps->u.bstrVal, lcid, dwFlags, &(pd->u.cyVal) );*/
case( VT_DISPATCH ):
/*res = VarCyFromDisp32( ps->u.pdispVal, lcid, &(pd->u.boolVal) );*/
case( VT_UNKNOWN ):
/*res = VarCyFrom32( ps->u.lVal, &(pd->u.boolVal) );*/
case( VT_DECIMAL ):
/*res = VarCyFromDec32( ps->u.deiVal, &(pd->u.boolVal) );*/
default:
res = DISP_E_TYPEMISMATCH;
FIXME(ole,"Coercion from %d to %d\n", vtFrom, vt );
break;
}
break;
default:
res = DISP_E_TYPEMISMATCH;
FIXME(ole,"Coercion from %d to %d\n", vtFrom, vt );
......@@ -1367,7 +1423,7 @@ HRESULT WINAPI VariantCopyInd32(VARIANT* pvargDest, VARIANTARG* pvargSrc)
{
/* Prevent from cycling. According to tests on
* VariantCopyInd in Windows and the documentation
* this API dereferences the inner Variants to only on depth.
* this API dereferences the inner Variants to only one depth.
* If the inner Variant itself contains an
* other inner variant the E_INVALIDARG error is
* returned.
......@@ -1707,6 +1763,19 @@ HRESULT WINAPI VarUI1FromStr32(OLECHAR32* strIn, LCID lcid, ULONG dwFlags, BYTE*
return S_OK;
}
/**********************************************************************
* VarUI1FromCy32 [OLEAUT32.134]
* Convert currency to unsigned char
*/
HRESULT WINAPI VarUI1FromCy32(CY cyIn, BYTE* pbOut) {
double t = round((((double)cyIn.u.Hi * 4294967296) + (double)cyIn.u.Lo) / 10000);
if (t > UI1_MAX || t < UI1_MIN) return DISP_E_OVERFLOW;
*pbOut = (BYTE)t;
return S_OK;
}
/******************************************************************************
* VarI2FromUI132 [OLEAUT32.48]
*/
......@@ -1900,6 +1969,19 @@ HRESULT WINAPI VarI2FromStr32(OLECHAR32* strIn, LCID lcid, ULONG dwFlags, short*
return S_OK;
}
/**********************************************************************
* VarI2FromCy32 [OLEAUT32.52]
* Convert currency to signed short
*/
HRESULT WINAPI VarI2FromCy32(CY cyIn, short* psOut) {
double t = round((((double)cyIn.u.Hi * 4294967296) + (double)cyIn.u.Lo) / 10000);
if (t > I2_MAX || t < I2_MIN) return DISP_E_OVERFLOW;
*psOut = (SHORT)t;
return S_OK;
}
/******************************************************************************
* VarI4FromUI132 [OLEAUT32.58]
*/
......@@ -2080,6 +2162,19 @@ HRESULT WINAPI VarI4FromStr32(OLECHAR32* strIn, LCID lcid, ULONG dwFlags, LONG*
return S_OK;
}
/**********************************************************************
* VarI4FromCy32 [OLEAUT32.62]
* Convert currency to signed long
*/
HRESULT WINAPI VarI4FromCy32(CY cyIn, LONG* plOut) {
double t = round((((double)cyIn.u.Hi * 4294967296) + (double)cyIn.u.Lo) / 10000);
if (t > I4_MAX || t < I4_MIN) return DISP_E_OVERFLOW;
*plOut = (LONG)t;
return S_OK;
}
/******************************************************************************
* VarR4FromUI132 [OLEAUT32.68]
*/
......@@ -2241,6 +2336,16 @@ HRESULT WINAPI VarR4FromStr32(OLECHAR32* strIn, LCID lcid, ULONG dwFlags, FLOAT*
return S_OK;
}
/**********************************************************************
* VarR4FromCy32 [OLEAUT32.72]
* Convert currency to float
*/
HRESULT WINAPI VarR4FromCy32(CY cyIn, FLOAT* pfltOut) {
*pfltOut = (FLOAT)((((double)cyIn.u.Hi * 4294967296) + (double)cyIn.u.Lo) / 10000);
return S_OK;
}
/******************************************************************************
* VarR8FromUI132 [OLEAUT32.68]
*/
......@@ -2381,6 +2486,16 @@ HRESULT WINAPI VarR8FromStr32(OLECHAR32* strIn, LCID lcid, ULONG dwFlags, double
return S_OK;
}
/**********************************************************************
* VarR8FromCy32 [OLEAUT32.82]
* Convert currency to double
*/
HRESULT WINAPI VarR8FromCy32(CY cyIn, double* pdblOut) {
*pdblOut = (double)((((double)cyIn.u.Hi * 4294967296) + (double)cyIn.u.Lo) / 10000);
return S_OK;
}
/******************************************************************************
* VarDateFromUI132 [OLEAUT32.]
*/
......@@ -2554,6 +2669,16 @@ HRESULT WINAPI VarDateFromBool32(VARIANT_BOOL boolIn, DATE* pdateOut)
return S_OK;
}
/**********************************************************************
* VarDateFromCy32 [OLEAUT32.93]
* Convert currency to date
*/
HRESULT WINAPI VarDateFromCy32(CY cyIn, DATE* pdateOut) {
*pdateOut = (DATE)((((double)cyIn.u.Hi * 4294967296) + (double)cyIn.u.Lo) / 10000);
if (*pdateOut > DATE_MAX || *pdateOut < DATE_MIN) return DISP_E_TYPEMISMATCH;
return S_OK;
}
/******************************************************************************
* VarBstrFromUI132 [OLEAUT32.108]
......@@ -3050,6 +3175,17 @@ HRESULT WINAPI VarBoolFromUI432(ULONG ulIn, VARIANT_BOOL* pboolOut)
return S_OK;
}
/**********************************************************************
* VarBoolFromCy32 [OLEAUT32.124]
* Convert currency to boolean
*/
HRESULT WINAPI VarBoolFromCy32(CY cyIn, VARIANT_BOOL* pboolOut) {
if (cyIn.u.Hi || cyIn.u.Lo) *pboolOut = -1;
else *pboolOut = 0;
return S_OK;
}
/******************************************************************************
* VarI1FromUI132 [OLEAUT32.244]
*/
......@@ -3243,6 +3379,19 @@ HRESULT WINAPI VarI1FromUI432(ULONG ulIn, CHAR* pcOut)
return S_OK;
}
/**********************************************************************
* VarI1FromCy32 [OLEAUT32.250]
* Convert currency to signed char
*/
HRESULT WINAPI VarI1FromCy32(CY cyIn, CHAR* pcOut) {
double t = round((((double)cyIn.u.Hi * 4294967296) + (double)cyIn.u.Lo) / 10000);
if (t > CHAR_MAX || t < CHAR_MIN) return DISP_E_OVERFLOW;
*pcOut = (CHAR)t;
return S_OK;
}
/******************************************************************************
* VarUI2FromUI132 [OLEAUT32.257]
*/
......@@ -3464,6 +3613,20 @@ HRESULT WINAPI VarUI4FromStr32(OLECHAR32* strIn, LCID lcid, ULONG dwFlags, ULONG
return S_OK;
}
/**********************************************************************
* VarUI2FromCy32 [OLEAUT32.263]
* Convert currency to unsigned short
*/
HRESULT WINAPI VarUI2FromCy32(CY cyIn, USHORT* pusOut) {
double t = round((((double)cyIn.u.Hi * 4294967296) + (double)cyIn.u.Lo) / 10000);
if (t > UI2_MAX || t < UI2_MIN) return DISP_E_OVERFLOW;
*pusOut = (USHORT)t;
return S_OK;
}
/******************************************************************************
* VarUI4FromUI132 [OLEAUT32.270]
*/
......@@ -3598,3 +3761,138 @@ HRESULT WINAPI VarUI4FromUI232(USHORT uiIn, ULONG* pulOut)
return S_OK;
}
/**********************************************************************
* VarUI4FromCy32 [OLEAUT32.276]
* Convert currency to unsigned long
*/
HRESULT WINAPI VarUI4FromCy32(CY cyIn, ULONG* pulOut) {
double t = round((((double)cyIn.u.Hi * 4294967296) + (double)cyIn.u.Lo) / 10000);
if (t > UI4_MAX || t < UI4_MIN) return DISP_E_OVERFLOW;
*pulOut = (ULONG)t;
return S_OK;
}
/**********************************************************************
* VarCyFromUI132 [OLEAUT32.98]
* Convert unsigned char to currency
*/
HRESULT WINAPI VarCyFromUI132(BYTE bIn, CY* pcyOut) {
pcyOut->u.Hi = 0;
pcyOut->u.Lo = ((ULONG)bIn) * 10000;
return S_OK;
}
/**********************************************************************
* VarCyFromI232 [OLEAUT32.99]
* Convert signed short to currency
*/
HRESULT WINAPI VarCyFromI232(short sIn, CY* pcyOut) {
if (sIn < 0) pcyOut->u.Hi = -1;
else pcyOut->u.Hi = 0;
pcyOut->u.Lo = ((ULONG)sIn) * 10000;
return S_OK;
}
/**********************************************************************
* VarCyFromI432 [OLEAUT32.100]
* Convert signed long to currency
*/
HRESULT WINAPI VarCyFromI432(LONG lIn, CY* pcyOut) {
double t = (double)lIn * (double)10000;
pcyOut->u.Hi = (LONG)(t / (double)4294967296);
pcyOut->u.Lo = (ULONG)fmod(t, (double)4294967296);
if (lIn < 0) pcyOut->u.Hi--;
return S_OK;
}
/**********************************************************************
* VarCyFromR432 [OLEAUT32.101]
* Convert float to currency
*/
HRESULT WINAPI VarCyFromR432(FLOAT fltIn, CY* pcyOut) {
double t = round((double)fltIn * (double)10000);
pcyOut->u.Hi = (LONG)(t / (double)4294967296);
pcyOut->u.Lo = (ULONG)fmod(t, (double)4294967296);
if (fltIn < 0) pcyOut->u.Hi--;
return S_OK;
}
/**********************************************************************
* VarCyFromR832 [OLEAUT32.102]
* Convert double to currency
*/
HRESULT WINAPI VarCyFromR832(double dblIn, CY* pcyOut) {
double t = round(dblIn * (double)10000);
pcyOut->u.Hi = (LONG)(t / (double)4294967296);
pcyOut->u.Lo = (ULONG)fmod(t, (double)4294967296);
if (dblIn < 0) pcyOut->u.Hi--;
return S_OK;
}
/**********************************************************************
* VarCyFromDate32 [OLEAUT32.103]
* Convert date to currency
*/
HRESULT WINAPI VarCyFromDate32(DATE dateIn, CY* pcyOut) {
double t = round((double)dateIn * (double)10000);
pcyOut->u.Hi = (LONG)(t / (double)4294967296);
pcyOut->u.Lo = (ULONG)fmod(t, (double)4294967296);
if (dateIn < 0) pcyOut->u.Hi--;
return S_OK;
}
/**********************************************************************
* VarCyFromBool32 [OLEAUT32.106]
* Convert boolean to currency
*/
HRESULT WINAPI VarCyFromBool32(VARIANT_BOOL boolIn, CY* pcyOut) {
if (boolIn < 0) pcyOut->u.Hi = -1;
else pcyOut->u.Hi = 0;
pcyOut->u.Lo = (ULONG)boolIn * (ULONG)10000;
return S_OK;
}
/**********************************************************************
* VarCyFromI132 [OLEAUT32.225]
* Convert signed char to currency
*/
HRESULT WINAPI VarCyFromI132(CHAR cIn, CY* pcyOut) {
if (cIn < 0) pcyOut->u.Hi = -1;
else pcyOut->u.Hi = 0;
pcyOut->u.Lo = (ULONG)cIn * (ULONG)10000;
return S_OK;
}
/**********************************************************************
* VarCyFromUI232 [OLEAUT32.226]
* Convert unsigned short to currency
*/
HRESULT WINAPI VarCyFromUI232(USHORT usIn, CY* pcyOut) {
pcyOut->u.Hi = 0;
pcyOut->u.Lo = (ULONG)usIn * (ULONG)10000;
return S_OK;
}
/**********************************************************************
* VarCyFromUI432 [OLEAUT32.227]
* Convert unsigned long to currency
*/
HRESULT WINAPI VarCyFromUI432(ULONG ulIn, CY* pcyOut) {
double t = (double)ulIn * (double)10000;
pcyOut->u.Hi = (LONG)(t / (double)4294967296);
pcyOut->u.Lo = (ULONG)fmod(t, (double)4294967296);
return S_OK;
}
......@@ -48,7 +48,7 @@ type win32
49 stdcall VarI2FromI4(long ptr) VarI2FromI432
50 stdcall VarI2FromR4(long ptr) VarI2FromR432
51 stdcall VarI2FromR8(double ptr) VarI2FromR832
52 stub VarI2FromCy
52 stdcall VarI2FromCy(double ptr) VarI2FromCy32
53 stdcall VarI2FromDate(long ptr) VarI2FromDate32
54 stdcall VarI2FromStr(wstr long long ptr) VarI2FromStr32
55 stub VarI2FromDisp
......@@ -57,7 +57,7 @@ type win32
59 stdcall VarI4FromI2(long ptr) VarI4FromI232
60 stdcall VarI4FromR4(long ptr) VarI4FromR432
61 stdcall VarI4FromR8(double ptr) VarI4FromR832
62 stub VarI4FromCy
62 stdcall VarI4FromCy(double ptr) VarI4FromCy32
63 stdcall VarI4FromDate(long ptr) VarI4FromDate32
64 stdcall VarI4FromStr(wstr long long ptr) VarI4FromStr32
65 stub VarI4FromDisp
......@@ -66,7 +66,7 @@ type win32
69 stdcall VarR4FromI2(long ptr) VarR4FromI232
70 stdcall VarR4FromI4(long ptr) VarR4FromI432
71 stdcall VarR4FromR8(double ptr) VarR4FromR832
72 stub VarR4FromCy
72 stdcall VarR4FromCy(double ptr) VarR4FromCy32
73 stdcall VarR4FromDate(long ptr) VarR4FromDate32
74 stdcall VarR4FromStr(wstr long long ptr) VarR4FromStr32
75 stub VarR4FromDisp
......@@ -75,7 +75,7 @@ type win32
79 stdcall VarR8FromI2(long ptr) VarR8FromI232
80 stdcall VarR8FromI4(long ptr) VarR8FromI432
81 stdcall VarR8FromR4(long ptr) VarR8FromR432
82 stub VarR8FromCy
82 stdcall VarR8FromCy(double ptr) VarR8FromCy32
83 stdcall VarR8FromDate(long ptr) VarR8FromDate32
84 stdcall VarR8FromStr(wstr long long ptr) VarR8FromStr32
85 stub VarR8FromDisp
......@@ -85,19 +85,19 @@ type win32
90 stdcall VarDateFromI4(long ptr) VarDateFromI432
91 stdcall VarDateFromR4(long ptr) VarDateFromR432
92 stdcall VarDateFromR8(double ptr) VarDateFromR832
93 stub VarDateFromCy
93 stdcall VarDateFromCy(double ptr) VarDateFromCy32
94 stdcall VarDateFromStr(wstr long long ptr) VarDateFromStr32
95 stub VarDateFromDisp
96 stdcall VarDateFromBool(long ptr) VarDateFromBool32
98 stub VarCyFromUI1
99 stub VarCyFromI2
100 stub VarCyFromI4
101 stub VarCyFromR4
102 stub VarCyFromR8
103 stub VarCyFromDate
98 stdcall VarCyFromUI1(long ptr) VarCyFromUI132
99 stdcall VarCyFromI2(long ptr) VarCyFromI232
100 stdcall VarCyFromI4(long ptr) VarCyFromI432
101 stdcall VarCyFromR4(long ptr) VarCyFromR432
102 stdcall VarCyFromR8(double ptr) VarCyFromR832
103 stdcall VarCyFromDate(double ptr) VarCyFromDate32
104 stub VarCyFromStr
105 stub VarCyFromDisp
106 stub VarCyFromBool
106 stdcall VarCyFromBool(long ptr) VarCyFromBool32
108 stdcall VarBstrFromUI1(long long long ptr) VarBstrFromUI132
109 stdcall VarBstrFromI2(long long long ptr) VarBstrFromI232
110 stdcall VarBstrFromI4(long long long ptr) VarBstrFromI432
......@@ -113,14 +113,14 @@ type win32
121 stdcall VarBoolFromR4(long ptr) VarBoolFromR432
122 stdcall VarBoolFromR8(double ptr) VarBoolFromR832
123 stdcall VarBoolFromDate(long ptr) VarBoolFromDate32
124 stub VarBoolFromCy
124 stdcall VarBoolFromCy(double ptr) VarBoolFromCy32
125 stdcall VarBoolFromStr(wstr long long ptr) VarBoolFromStr32
126 stub VarBoolFromDisp
130 stdcall VarUI1FromI2(long ptr) VarUI1FromI232
131 stdcall VarUI1FromI4(long ptr) VarUI1FromI432
132 stdcall VarUI1FromR4(long ptr) VarUI1FromR432
133 stdcall VarUI1FromR8(double ptr) VarUI1FromR832
134 stub VarUI1FromCy
134 stdcall VarUI1FromCy(double ptr) VarUI1FromCy32
135 stdcall VarUI1FromDate(long ptr) VarUI1FromDate32
136 stdcall VarUI1FromStr(wstr long long ptr) VarUI1FromStr32
137 stub VarUI1FromDisp
......@@ -177,9 +177,9 @@ type win32
222 stdcall VarDateFromUI2(long ptr) VarDateFromUI232
223 stdcall VarDateFromUI4(long ptr) VarDateFromUI432
224 stub VarDateFromDec
225 stub VarCyFromI1
226 stub VarCyFromUI2
227 stub VarCyFromUI4
225 stdcall VarCyFromI1(long ptr) VarCyFromI132
226 stdcall VarCyFromUI2(long ptr) VarCyFromUI232
227 stdcall VarCyFromUI4(long ptr) VarCyFromUI432
228 stub VarCyFromDec
229 stdcall VarBstrFromI1(long long long ptr) VarBstrFromI132
230 stdcall VarBstrFromUI2(long long long ptr) VarBstrFromUI232
......@@ -202,7 +202,7 @@ type win32
247 stdcall VarI1FromR4(long ptr) VarI1FromR432
248 stdcall VarI1FromR8(double ptr) VarI1FromR832
249 stdcall VarI1FromDate(long ptr) VarI1FromDate32
250 stub VarI1FromCy
250 stdcall VarI1FromCy(double ptr) VarI1FromCy32
251 stdcall VarI1FromStr(wstr long long ptr) VarI1FromStr32
252 stub VarI1FromDisp
253 stdcall VarI1FromBool(long ptr) VarI1FromBool32
......@@ -215,7 +215,7 @@ type win32
260 stdcall VarUI2FromR4(long ptr) VarUI2FromR432
261 stdcall VarUI2FromR8(double ptr) VarUI2FromR832
262 stdcall VarUI2FromDate(long ptr) VarUI2FromDate32
263 stub VarUI2FromCy
263 stdcall VarUI2FromCy(double ptr) VarUI2FromCy32
264 stdcall VarUI2FromStr(wstr long long ptr) VarUI2FromStr32
265 stub VarUI2FromDisp
266 stdcall VarUI2FromBool(long ptr) VarUI2FromBool32
......@@ -228,7 +228,7 @@ type win32
273 stdcall VarUI4FromR4(long ptr) VarUI4FromR432
274 stdcall VarUI4FromR8(double ptr) VarUI4FromR832
275 stdcall VarUI4FromDate(long ptr) VarUI4FromDate32
276 stub VarUI4FromCy
276 stdcall VarUI4FromCy(double ptr) VarUI4FromCy32
277 stdcall VarUI4FromStr(wstr long long ptr) VarUI4FromStr32
278 stub VarUI4FromDisp
279 stdcall VarUI4FromBool(long ptr) VarUI4FromBool32
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment