33#define NONAMELESSUNION
34#define NONAMELESSSTRUCT
50 0, 0, { (
DWORD_PTR)(__FILE__
": cache_cs") }
518 static DISPPARAMS emptyParams = {
NULL,
NULL, 0, 0 };
570 TRACE(
"(%p)\n", pVarg);
613 IRecordInfo_RecordClear(pBr->pRecInfo, pBr->pvRecord);
614 IRecordInfo_Release(pBr->pRecInfo);
673 IRecordInfo_RecordClear(pBr->pRecInfo, pBr->pvRecord);
674 IRecordInfo_Release(pBr->pRecInfo);
699 if (!src_rec->pRecInfo)
705 hr = IRecordInfo_GetSize(src_rec->pRecInfo, &
size);
714 dest_rec->pRecInfo = src_rec->pRecInfo;
715 IRecordInfo_AddRef(src_rec->pRecInfo);
717 return IRecordInfo_RecordCopy(src_rec->pRecInfo, src_rec->pvRecord, dest_rec->pvRecord);
758 if (pvargSrc != pvargDest &&
761 *pvargDest = *pvargSrc;
765 switch (
V_VT(pvargSrc))
811 case VT_BSTR:
return sizeof(
void*);
869 if (pvargSrc == pvargDest)
883 TRACE(
"VariantClear() of destination failed\n");
919 goto VariantCopyInd_Return;
932 V_VT(pvargDest) =
V_VT(pSrc) & ~VT_BYREF;
934VariantCopyInd_Return:
936 if (pSrc != pvargSrc)
1048#define IsLeapYear(y) (((y % 4) == 0) && (((y % 100) != 0) || ((y % 400) == 0)))
1053 int julianDays = dateIn;
1056 julianDays += 1757585;
1063 int julianDays = dateIn;
1065 julianDays -= 1757585;
1077 l -= (
n * 146097 + 3) / 4;
1078 i = (4000 * (
l + 1)) / 1461001;
1079 l += 31 - (
i * 1461) / 4;
1080 j = (
l * 80) / 2447;
1081 *
day =
l - (
j * 2447) / 80;
1084 *year = 100 * (
n - 49) +
i +
l;
1092 return ((1461 * (year + 4800 +
m12)) / 4 + (367 * (
month - 2 - 12 *
m12)) / 12 -
1093 (3 * ((year + 4900 +
m12) / 100)) / 4 +
day - 32075);
1097#define DOS_YEAR(x) (1980 + (x >> 9))
1098#define DOS_MONTH(x) ((x >> 5) & 0xf)
1099#define DOS_DAY(x) (x & 0x1f)
1100#define DOS_HOUR(x) (x >> 11)
1101#define DOS_MINUTE(x) ((x >> 5) & 0x3f)
1102#define DOS_SECOND(x) ((x & 0x1f) << 1)
1104#define DOS_DATE(d,m,y) (d | (m << 5) | ((y-1980) << 9))
1105#define DOS_TIME(h,m,s) ((s >> 1) | (m << 5) | (h << 11))
1110 static const BYTE days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
1111 short iYear, iMonth, iDay, iHour, iMinute, iSecond;
1121 TRACE(
"Raw date: %d/%d/%d %d:%d:%d\n", iDay, iMonth,
1122 iYear, iHour, iMinute, iSecond);
1124 if (iYear > 9999 || iYear < -9999)
1127 if (iYear >= 0 && iYear < 30)
1130 else if (iYear >= 30 && iYear < 100)
1133 iMinute += iSecond / 60;
1134 iSecond = iSecond % 60;
1135 iHour += iMinute / 60;
1136 iMinute = iMinute % 60;
1139 iYear += iMonth / 12;
1140 iMonth = iMonth % 12;
1141 if (iMonth<=0) {iMonth+=12; iYear--;}
1142 while (iDay > days[iMonth])
1147 iDay -= days[iMonth];
1149 iYear += iMonth / 12;
1150 iMonth = iMonth % 12;
1155 if (iMonth<=0) {iMonth+=12; iYear--;}
1159 iDay += days[iMonth];
1162 if (iSecond<0){iSecond+=60; iMinute--;}
1163 if (iMinute<0){iMinute+=60; iHour--;}
1164 if (iHour<0) {iHour+=24; iDay--;}
1165 if (iYear<=0) iYear+=2000;
1216 TRACE(
"(0x%x(%d/%d/%d),0x%x(%d:%d:%d),%p)\n",
1256 TRACE(
"(%g,%p,%p)\n", dateIn, pwDosDate, pwDosTime);
1267 TRACE(
"Returning 0x%x(%d/%d/%d), 0x%x(%d:%d:%d)\n",
1295 if (lpSt->
wDay > 31)
1297 if ((
short)lpSt->
wYear < 0)
1321 TRACE(
"(%g,%p)\n", dateIn, lpSt);
1350 TRACE(
"(%p->%d/%d/%d %d:%d:%d:%d %d %d,0x%08x,0x%08x,%p)\n", pUdateIn,
1357 FIXME(
"lcid possibly not handled, treating as en-us\n");
1364 WARN(
"Ignoring VAR_VALIDDATE\n");
1375 double dateSign = (dateVal < 0.0) ? -1.0 : 1.0;
1378 dateVal += ud.
st.
wHour / 24.0 * dateSign;
1379 dateVal += ud.
st.
wMinute / 1440.0 * dateSign;
1380 dateVal += ud.
st.
wSecond / 86400.0 * dateSign;
1383 TRACE(
"Returning %g\n", dateVal);
1384 *pDateOut = dateVal;
1430 static const USHORT cumulativeDays[] =
1432 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334
1434 double datePart, timePart;
1442 datePart = dateIn < 0.0 ?
ceil(dateIn) :
floor(dateIn);
1444 timePart =
fabs(dateIn - datePart) + 0.00000000001;
1445 if (timePart >= 1.0)
1446 timePart -= 0.00000000001;
1453 datePart = (datePart + 1.5) / 7.0;
1473 timePart -= lpUdate->
st.
wHour;
1500 if (++lpUdate->
st.
wDay > 28)
1509#define GET_NUMBER_TEXT(fld,name) \
1511 if (!GetLocaleInfoW(lcid, lctype|fld, buff, 2)) \
1512 WARN("buffer too small for " #fld "\n"); \
1514 if (buff[0]) lpChars->name = buff[0]; \
1515 TRACE("lcid 0x%x, " #name "=%d '%c'\n", lcid, lpChars->name, lpChars->name)
1522 static LCID lastLcid = -1;
1523 static DWORD lastFlags = 0;
1532 if(lcid == lastLcid &&
dwFlags == lastFlags)
1534 memcpy(lpChars, &lastChars,
sizeof(defaultChars));
1539 memcpy(lpChars, &defaultChars,
sizeof(defaultChars));
1554 default:
WARN(
"buffer too small for LOCALE_SCURRENCY\n");
1559 memcpy(&lastChars, lpChars,
sizeof(defaultChars));
1566#define B_PROCESSING_EXPONENT 0x1
1567#define B_NEGATIVE_EXPONENT 0x2
1568#define B_EXPONENT_START 0x4
1569#define B_INEXACT_ZEROS 0x8
1570#define B_LEADING_ZERO 0x10
1571#define B_PROCESSING_HEX 0x20
1572#define B_PROCESSING_OCT 0x40
1615 if (!pNumprs || !rgbDig)
1618 if (pNumprs->
cDig < iMaxDigits)
1619 iMaxDigits = pNumprs->
cDig;
1690 if ((*lpszStr ==
'&' && (*(lpszStr+1) ==
'H' || *(lpszStr+1) ==
'h')) &&
1698 else if ((*lpszStr ==
'&' && (*(lpszStr+1) ==
'O' || *(lpszStr+1) ==
'o')) &&
1708 while (*lpszStr ==
'0')
1721 int exponentSize = 0;
1726 while (*lpszStr ==
'0')
1737 exponentSize += *lpszStr -
'0';
1742 exponentSize = -exponentSize;
1744 pNumprs->
nPwr10 += exponentSize;
1755 if (*lpszStr !=
'0')
1756 dwState &= ~B_INEXACT_ZEROS;
1766 if ((dwState &
B_PROCESSING_OCT) && ((*lpszStr ==
'8') || (*lpszStr ==
'9')))
1772 rgbTmp[pNumprs->
cDig] = *lpszStr -
'0';
1793 while (lpszStr[1] ==
'0')
1802 else if (((*lpszStr >=
'a' && *lpszStr <=
'f') ||
1803 (*lpszStr >=
'A' && *lpszStr <=
'F')) &&
1806 if (pNumprs->
cDig >= iMaxDigits)
1812 if (*lpszStr >=
'a')
1813 rgbTmp[pNumprs->
cDig] = *lpszStr -
'a' + 10;
1815 rgbTmp[pNumprs->
cDig] = *lpszStr -
'A' + 10;
1820 else if ((*lpszStr ==
'e' || *lpszStr ==
'E') &&
1853 WARN(
"didn't completely parse exponent\n");
1878 while (pNumprs->
cDig > 1 && !rgbTmp[pNumprs->
cDig - 1])
1888 while (pNumprs->
cDig > 1 && !rgbTmp[pNumprs->
cDig - 1])
1895 if (pNumprs->
cDig <= iMaxDigits)
1898 pNumprs->
cDig = iMaxDigits;
1959#define INTEGER_VTBITS (VTBIT_I1|VTBIT_UI1|VTBIT_I2|VTBIT_UI2|VTBIT_I4|VTBIT_UI4|VTBIT_I8|VTBIT_UI8)
1961#define REAL_VTBITS (VTBIT_R4|VTBIT_R8|VTBIT_CY)
1964#define FITS_AS_I1(x) ((x) >> 8 == 0)
1965#define FITS_AS_I2(x) ((x) >> 16 == 0)
1966#define FITS_AS_I4(x) ((x) >> 32 == 0)
2002 static const double dblMultipliers[11] = {
2003 1.0, 10.0, 100.0, 1000.0, 10000.0, 100000.0,
2004 1000000.0, 10000000.0, 100000000.0, 1000000000.0, 10000000000.0
2006 static const double dblMinimums[11] = {
2011 static const double dblMaximums[11] = {
2017 int wholeNumberDigits, fractionalDigits, divisor10 = 0, multiplier10 = 0;
2019 TRACE(
"(%p,%p,0x%x,%p)\n", pNumprs, rgbDig, dwVtBits, pVarDst);
2029 for (
i = 0;
i < pNumprs->
cDig;
i++)
2033 TRACE(
"Overflow multiplying digits\n");
2046 V_I1(pVarDst) = ul64;
2052 V_UI1(pVarDst) = ul64;
2058 V_I2(pVarDst) = ul64;
2064 V_UI2(pVarDst) = ul64;
2070 V_I4(pVarDst) = ul64;
2076 V_UI4(pVarDst) = ul64;
2082 V_I8(pVarDst) = ul64;
2088 V_UI8(pVarDst) = ul64;
2103 V_R4(pVarDst) = ul64;
2105 V_R4(pVarDst) = l64;
2112 V_R8(pVarDst) = ul64;
2114 V_R8(pVarDst) = l64;
2130 wholeNumberDigits = 0;
2131 fractionalDigits = pNumprs->
cDig;
2132 divisor10 = -pNumprs->
nPwr10;
2137 wholeNumberDigits = pNumprs->
cDig + pNumprs->
nPwr10;
2138 fractionalDigits = pNumprs->
cDig - wholeNumberDigits;
2139 divisor10 = pNumprs->
cDig - wholeNumberDigits;
2142 else if (pNumprs->
nPwr10 == 0)
2145 wholeNumberDigits = pNumprs->
cDig;
2146 fractionalDigits = 0;
2151 wholeNumberDigits = pNumprs->
cDig;
2152 fractionalDigits = 0;
2153 multiplier10 = pNumprs->
nPwr10;
2156 TRACE(
"cDig %d; nPwr10 %d, whole %d, frac %d mult %d; div %d\n",
2157 pNumprs->
cDig, pNumprs->
nPwr10, wholeNumberDigits, fractionalDigits,
2158 multiplier10, divisor10);
2176 for (
i = 0;
i < wholeNumberDigits;
i++)
2180 TRACE(
"Overflow multiplying digits\n");
2184 ul64 = ul64 * 10 + rgbDig[
i];
2188 if (!bOverflow && multiplier10)
2190 for (
i = 0;
i < multiplier10;
i++)
2194 TRACE(
"Overflow scaling number\n");
2206 if (!bOverflow && fractionalDigits && divisor10 > 0)
2208 const BYTE* fracDig = rgbDig + wholeNumberDigits;
2211 TRACE(
"first decimal value is %d\n", *fracDig);
2215 else if (*fracDig == 5)
2217 for (
i = 1;
i < fractionalDigits;
i++)
2226 if (
i == fractionalDigits && (ul64 & 1))
2234 TRACE(
"Overflow after rounding\n");
2247 if (!bOverflow && bNegative)
2254 V_I1(pVarDst) = -ul64;
2260 V_I2(pVarDst) = -ul64;
2266 V_I4(pVarDst) = -ul64;
2272 V_I8(pVarDst) = -ul64;
2286 else if (!bOverflow)
2292 V_I1(pVarDst) = ul64;
2298 V_UI1(pVarDst) = ul64;
2304 V_I2(pVarDst) = ul64;
2310 V_UI2(pVarDst) = ul64;
2316 V_I4(pVarDst) = ul64;
2322 V_UI4(pVarDst) = ul64;
2328 V_I8(pVarDst) = ul64;
2334 V_UI8(pVarDst) = ul64;
2357 for (
i = 0;
i < pNumprs->
cDig;
i++)
2358 whole = whole * 10.0 + rgbDig[
i];
2360 TRACE(
"Whole double value is %16.16g\n", whole);
2363 while (multiplier10 > 10)
2365 if (whole > dblMaximums[10])
2371 whole = whole * dblMultipliers[10];
2374 if (multiplier10 && !bOverflow)
2376 if (whole > dblMaximums[multiplier10])
2382 whole = whole * dblMultipliers[multiplier10];
2386 TRACE(
"Scaled double value is %16.16g\n", whole);
2388 while (divisor10 > 10 && !bOverflow)
2390 if (whole < dblMinimums[10] && whole != 0)
2396 whole = whole / dblMultipliers[10];
2399 if (divisor10 && !bOverflow)
2401 if (whole < dblMinimums[divisor10] && whole != 0)
2407 whole = whole / dblMultipliers[divisor10];
2410 TRACE(
"Final double value is %16.16g\n", whole);
2413 ((whole <= R4_MAX && whole >=
R4_MIN) || whole == 0.0))
2415 TRACE(
"Set R4 to final value\n");
2423 TRACE(
"Set R8 to final value\n");
2434 TRACE(
"Set CY to final value\n");
2437 TRACE(
"Value Overflows CY\n");
2448 DECIMAL_SETZERO(*pDec);
2457 for (
i = 0;
i < pNumprs->
cDig;
i++)
2460 carry = (
ULONG)(tmp >> 32);
2463 carry = (
ULONG)(tmp >> 32);
2470VarNumFromParseNum_DecOverflow:
2471 TRACE(
"Overflow\n");
2478 while (multiplier10 > 0)
2481 carry = (
ULONG)(tmp >> 32);
2484 carry = (
ULONG)(tmp >> 32);
2490 goto VarNumFromParseNum_DecOverflow;
2537 else if ((leftvt ==
VT_I2 || leftvt ==
VT_I4 ||
2610 left_str =
V_BSTR(&converted);
2636 right_str =
V_BSTR(&converted);
2664 V_VT(&vtmpsrc) &= ~VT_RESERVED;
2723 xmask = (1 << lvt) | (1 << rvt);
2781 if (!breserv && !nreserv)
2784 else if (breserv && !nreserv) {
2797 else if (breserv && nreserv)
2858#define _VARCMP(a,b) \
2859 (((a) == (b)) ? VARCMP_EQ : (((a) < (b)) ? VARCMP_LT : VARCMP_GT))
2925 leftExtraFlags =
V_VT(
left)&(~VT_TYPEMASK);
2926 rightExtraFlags =
V_VT(
right)&(~VT_TYPEMASK);
2928 if (leftExtraFlags != rightExtraFlags)
2947 else if (leftvt ==
VT_I8 || rightvt ==
VT_I8)
2949 else if (leftvt ==
VT_I4 || rightvt ==
VT_I4 ||
3092 FIXME(
"Couldn't bitwise AND variant types %d,%d\n",
3140 enum coerceprio { vt_EMPTY, vt_UI1, vt_I2, vt_I4, vt_I8, vt_BSTR,vt_R4,
3141 vt_R8, vt_CY, vt_DATE, vt_DECIMAL, vt_DISPATCH, vt_NULL,
3149 static const VARTYPE coerce[] = {
3151 vt_EMPTY, vt_NULL, vt_I2, vt_I4, vt_R4,
3153 vt_R8, vt_CY, vt_DATE, vt_BSTR, vt_DISPATCH,
3155 vt_ERROR, vt_I2, vt_ERROR, vt_ERROR, vt_DECIMAL,
3157 vt_ERROR, vt_ERROR, vt_UI1, vt_ERROR, vt_ERROR, vt_I8
3197 if (coerce[lvt] > coerce[rvt]) {
3198 resvt = prio2vt[coerce[lvt]];
3199 tvt = prio2vt[coerce[rvt]];
3201 resvt = prio2vt[coerce[rvt]];
3202 tvt = prio2vt[coerce[lvt]];
3227 FIXME(
"cannot handle variant type VT_DISPATCH\n");
3288 ERR(
"We shouldn't get here! tvt = %d!\n", tvt);
3298 resvt = prio2vt[coerce[resvt] + 1];
3353 enum coerceprio { vt_UI1 = 0, vt_I2, vt_I4, vt_I8, vt_CY, vt_R4, vt_R8,
3354 vt_DECIMAL, vt_NULL, vt_ERROR };
3360 static const VARTYPE coerce[] = {
3362 vt_UI1, vt_NULL, vt_I2, vt_I4, vt_R4,
3364 vt_R8, vt_CY, vt_R8, vt_R8, vt_ERROR,
3366 vt_ERROR, vt_I2, vt_ERROR, vt_ERROR, vt_DECIMAL,
3368 vt_ERROR, vt_ERROR, vt_UI1, vt_ERROR, vt_ERROR, vt_I8
3405 if (coerce[lvt] > coerce[rvt]) {
3406 resvt = prio2vt[coerce[lvt]];
3407 tvt = prio2vt[coerce[rvt]];
3409 resvt = prio2vt[coerce[rvt]];
3410 tvt = prio2vt[coerce[lvt]];
3478 ERR(
"We shouldn't get here! tvt = %d!\n", tvt);
3488 resvt = prio2vt[coerce[resvt] + 1];
3553 leftExtraFlags =
V_VT(
left)&(~VT_TYPEMASK);
3554 rightExtraFlags =
V_VT(
right)&(~VT_TYPEMASK);
3556 if (leftExtraFlags != rightExtraFlags)
3581 else if (leftvt ==
VT_I8 || rightvt ==
VT_I8 ||
3601 else if (leftvt ==
VT_R4 || rightvt ==
VT_R4)
3628 if (
V_R4(&lv) == 0.0 &&
V_R4(&rv) == 0.0)
3633 else if (
V_R4(&rv) == 0.0)
3642 if (
V_R8(&lv) == 0.0 &&
V_R8(&rv) == 0.0)
3647 else if (
V_R8(&rv) == 0.0)
3755 leftExtraFlags =
V_VT(
left)&(~VT_TYPEMASK);
3756 rightExtraFlags =
V_VT(
right)&(~VT_TYPEMASK);
3758 if (leftExtraFlags != rightExtraFlags)
3813 (leftvt < VT_VOID || leftvt >
VT_LPWSTR)))