V_VT(pVarg) = VT_EMPTY; /* Native doesn't set any other fields */
}
+HRESULT VARIANT_ClearInd(VARIANTARG *pVarg)
+{
+ HRESULT hres;
+
+ TRACE("(%p->(%s%s))\n", pVarg, debugstr_VT(pVarg), debugstr_VF(pVarg));
+
+ hres = VARIANT_ValidateType(V_VT(pVarg));
+ if (FAILED(hres))
+ return hres;
+
+ switch (V_VT(pVarg))
+ {
+ case VT_DISPATCH:
+ case VT_UNKNOWN:
+ if (V_UNKNOWN(pVarg))
+ IUnknown_Release(V_UNKNOWN(pVarg));
+ break;
+ case VT_UNKNOWN | VT_BYREF:
+ case VT_DISPATCH | VT_BYREF:
+ if(*V_UNKNOWNREF(pVarg))
+ IUnknown_Release(*V_UNKNOWNREF(pVarg));
+ break;
+ case VT_BSTR:
+ SysFreeString(V_BSTR(pVarg));
+ break;
+ case VT_BSTR | VT_BYREF:
+ SysFreeString(*V_BSTRREF(pVarg));
+ break;
+ case VT_VARIANT | VT_BYREF:
+ VariantClear(V_VARIANTREF(pVarg));
+ break;
+ case VT_RECORD:
+ case VT_RECORD | VT_BYREF:
+ {
+ struct __tagBRECORD* pBr = &V_UNION(pVarg,brecVal);
+ if (pBr->pRecInfo)
+ {
+ IRecordInfo_RecordClear(pBr->pRecInfo, pBr->pvRecord);
+ IRecordInfo_Release(pBr->pRecInfo);
+ }
+ break;
+ }
+ default:
+ if (V_ISARRAY(pVarg) || (V_VT(pVarg) & ~VT_BYREF) == VT_SAFEARRAY)
+ {
+ if (V_ISBYREF(pVarg))
+ {
+ if (*V_ARRAYREF(pVarg))
+ hres = SafeArrayDestroy(*V_ARRAYREF(pVarg));
+ }
+ else if (V_ARRAY(pVarg))
+ hres = SafeArrayDestroy(V_ARRAY(pVarg));
+ }
+ break;
+ }
+
+ V_VT(pVarg) = VT_EMPTY;
+ return hres;
+}
+
/******************************************************************************
* VariantClear [OLEAUT32.9]
*
static HRESULT VARIANT_RollUdate(UDATE *lpUd)
{
static const BYTE days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+ short iYear, iMonth, iDay, iHour, iMinute, iSecond;
- TRACE("Raw date: %d/%d/%d %d:%d:%d\n", lpUd->st.wDay, lpUd->st.wMonth,
- lpUd->st.wYear, lpUd->st.wHour, lpUd->st.wMinute, lpUd->st.wSecond);
+ /* interpret values signed */
+ iYear = lpUd->st.wYear;
+ iMonth = lpUd->st.wMonth;
+ iDay = lpUd->st.wDay;
+ iHour = lpUd->st.wHour;
+ iMinute = lpUd->st.wMinute;
+ iSecond = lpUd->st.wSecond;
- /* Years < 100 are treated as 1900 + year */
- if (lpUd->st.wYear < 100)
- lpUd->st.wYear += 1900;
+ TRACE("Raw date: %d/%d/%d %d:%d:%d\n", iDay, iMonth,
+ iYear, iHour, iMinute, iSecond);
- if (!lpUd->st.wMonth)
+ if (iYear > 9999 || iYear < -9999)
+ return E_INVALIDARG; /* Invalid value */
+ /* Years < 100 are treated as 1900 + year */
+ if (iYear > 0 && iYear < 100)
+ iYear += 1900;
+
+ iMinute += iSecond / 60;
+ iSecond = iSecond % 60;
+ iHour += iMinute / 60;
+ iMinute = iMinute % 60;
+ iDay += iHour / 24;
+ iHour = iHour % 24;
+ iYear += iMonth / 12;
+ iMonth = iMonth % 12;
+ if (iMonth<=0) {iMonth+=12; iYear--;}
+ while (iDay > days[iMonth])
{
- /* Roll back to December of the previous year */
- lpUd->st.wMonth = 12;
- lpUd->st.wYear--;
+ if (iMonth == 2 && IsLeapYear(iYear))
+ iDay -= 29;
+ else
+ iDay -= days[iMonth];
+ iMonth++;
+ iYear += iMonth / 12;
+ iMonth = iMonth % 12;
}
- else while (lpUd->st.wMonth > 12)
+ while (iDay <= 0)
{
- /* Roll forward the correct number of months */
- lpUd->st.wYear++;
- lpUd->st.wMonth -= 12;
- }
-
- if (lpUd->st.wYear > 9999 || lpUd->st.wHour > 23 ||
- lpUd->st.wMinute > 59 || lpUd->st.wSecond > 59)
- return E_INVALIDARG; /* Invalid values */
-
- if (!lpUd->st.wDay)
- {
- /* Roll back the date one day */
- if (lpUd->st.wMonth == 1)
- {
- /* Roll back to December 31 of the previous year */
- lpUd->st.wDay = 31;
- lpUd->st.wMonth = 12;
- lpUd->st.wYear--;
- }
+ iMonth--;
+ if (iMonth<=0) {iMonth+=12; iYear--;}
+ if (iMonth == 2 && IsLeapYear(iYear))
+ iDay += 29;
else
- {
- lpUd->st.wMonth--; /* Previous month */
- if (lpUd->st.wMonth == 2 && IsLeapYear(lpUd->st.wYear))
- lpUd->st.wDay = 29; /* February has 29 days on leap years */
- else
- lpUd->st.wDay = days[lpUd->st.wMonth]; /* Last day of the month */
- }
+ iDay += days[iMonth];
}
- else if (lpUd->st.wDay > 28)
- {
- int rollForward = 0;
- /* Possibly need to roll the date forward */
- if (lpUd->st.wMonth == 2 && IsLeapYear(lpUd->st.wYear))
- rollForward = lpUd->st.wDay - 29; /* February has 29 days on leap years */
- else
- rollForward = lpUd->st.wDay - days[lpUd->st.wMonth];
+ if (iSecond<0){iSecond+=60; iMinute--;}
+ if (iMinute<0){iMinute+=60; iHour--;}
+ if (iHour<0) {iHour+=24; iDay--;}
+ if (iYear<=0) iYear+=2000;
+
+ lpUd->st.wYear = iYear;
+ lpUd->st.wMonth = iMonth;
+ lpUd->st.wDay = iDay;
+ lpUd->st.wHour = iHour;
+ lpUd->st.wMinute = iMinute;
+ lpUd->st.wSecond = iSecond;
- if (rollForward > 0)
- {
- lpUd->st.wDay = rollForward;
- lpUd->st.wMonth++;
- if (lpUd->st.wMonth > 12)
- {
- lpUd->st.wMonth = 1; /* Roll forward into January of the next year */
- lpUd->st.wYear++;
- }
- }
- }
TRACE("Rolled date: %d/%d/%d %d:%d:%d\n", lpUd->st.wDay, lpUd->st.wMonth,
lpUd->st.wYear, lpUd->st.wHour, lpUd->st.wMinute, lpUd->st.wSecond);
return S_OK;
ud.st.wMinute = DOS_MINUTE(wDosTime);
ud.st.wSecond = DOS_SECOND(wDosTime);
ud.st.wDayOfWeek = ud.st.wMilliseconds = 0;
+ if (ud.st.wHour > 23 || ud.st.wMinute > 59 || ud.st.wSecond > 59)
+ return FALSE; /* Invalid values in Dos*/
return VarDateFromUdate(&ud, 0, pDateOut) == S_OK;
}
dateVal += ud.st.wHour / 24.0;
dateVal += ud.st.wMinute / 1440.0;
dateVal += ud.st.wSecond / 86400.0;
- dateVal += ud.st.wMilliseconds / 86400000.0;
TRACE("Returning %g\n", dateVal);
*pDateOut = dateVal;
if (FAILED(rc))
return rc;
rc = VarBstrCmp(V_BSTR(bstrv), V_BSTR(&rv), lcid, flags);
+ VariantClear(&rv);
} else if (V_BSTR(bstrv) && *V_BSTR(bstrv)) {
/* Non NULL nor empty BSTR */
/* If the BSTR is not a number the BSTR is greater */
/* Numeric comparison, will be handled below.
VARCMP_NULL used only to break out. */
rc = VARCMP_NULL;
- VariantClear(&lv);
- VariantClear(&rv);
+ VariantClear(&lv);
+ VariantClear(&rv);
} else
/* Empty or NULL BSTR */
rc = VARCMP_GT;