PATCH: VarMul, VarDiv, VarSUB
Marcus Meissner
marcus at jet.franken.de
Sun Jan 26 16:02:57 CST 2003
Hi,
Some more variant operation handlers.
Ciao, Marcus
Changelog:
Added R4 and R8 comparison to VarCmp.
Added I2 to VarFormat.
Added VarSub, VarDiv, VarMul for integer and float types.
Index: dlls/oleaut32/oleaut32.spec
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/oleaut32.spec,v
retrieving revision 1.47
diff -u -u -r1.47 oleaut32.spec
--- dlls/oleaut32/oleaut32.spec 2 Jan 2003 23:13:56 -0000 1.47
+++ dlls/oleaut32/oleaut32.spec 26 Jan 2003 21:57:32 -0000
@@ -140,7 +140,7 @@
140 stdcall VarTokenizeFormatString (ptr ptr long long long long ptr) VarTokenizeFormatString
141 stdcall VarAdd(ptr ptr ptr) VarAdd
142 stdcall VarAnd(ptr ptr ptr) VarAnd
-143 stub VarDiv # stdcall (ptr ptr ptr)
+143 stdcall VarDiv(ptr ptr ptr) VarDiv
144 stub OACreateTypeLib2
146 stdcall DispCallFunc(ptr long long long long ptr ptr ptr) DispCallFunc
147 stdcall VariantChangeTypeEx(ptr ptr long long long) VariantChangeTypeEx
@@ -151,10 +151,10 @@
153 stub VarIdiv # stdcall (ptr ptr ptr)
154 stub VarImp # stdcall (ptr ptr ptr)
155 stub VarMod # stdcall (ptr ptr ptr)
-156 stub VarMul # stdcall (ptr ptr ptr)
+156 stdcall VarMul(ptr ptr ptr) VarMul
157 stdcall VarOr(ptr ptr ptr) VarOr
158 stub VarPow # stdcall (ptr ptr ptr)
-159 stub VarSub # stdcall (ptr ptr ptr)
+159 stdcall VarSub(ptr ptr ptr) VarSub
160 stdcall CreateTypeLib(long wstr ptr) CreateTypeLib
161 stdcall LoadTypeLib (wstr ptr) LoadTypeLib
162 stdcall LoadRegTypeLib (ptr long long long ptr) LoadRegTypeLib
Index: dlls/oleaut32/variant.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/variant.c,v
retrieving revision 1.56
diff -u -u -r1.56 variant.c
--- dlls/oleaut32/variant.c 23 Jan 2003 23:07:39 -0000 1.56
+++ dlls/oleaut32/variant.c 26 Jan 2003 21:57:38 -0000
@@ -5110,10 +5110,17 @@
{
- BOOL lOk = TRUE;
- BOOL rOk = TRUE;
- LONGLONG lVal = -1;
- LONGLONG rVal = -1;
+ BOOL lOk = TRUE;
+ BOOL rOk = TRUE;
+ LONGLONG lVal = -1;
+ LONGLONG rVal = -1;
+ VARIANT rv,lv;
+ DWORD xmask;
+ HRESULT rc;
+
+ VariantInit(&lv);VariantInit(&rv);
+ V_VT(right) &= ~0x8000; /* hack since we sometime get this flag. */
+ V_VT(left) &= ~0x8000; /* hack since we sometime get this flag. */
TRACE("Left Var:\n");
dump_Variant(left);
@@ -5131,6 +5138,30 @@
return VarBstrCmp(V_BSTR(left), V_BSTR(right), lcid, flags);
}
+ xmask = (1<<(V_VT(left)&VT_TYPEMASK))|(1<<(V_VT(right)&VT_TYPEMASK));
+ if (xmask & (1<<VT_R8)) {
+ rc = VariantChangeType(&lv,left,0,VT_R8);
+ if (FAILED(rc)) return rc;
+ rc = VariantChangeType(&rv,right,0,VT_R8);
+ if (FAILED(rc)) return rc;
+
+ if (V_R8(&lv) == V_R8(&rv)) return VARCMP_EQ;
+ if (V_R8(&lv) < V_R8(&rv)) return VARCMP_LT;
+ if (V_R8(&lv) > V_R8(&rv)) return VARCMP_GT;
+ return E_FAIL; /* can't get here */
+ }
+ if (xmask & (1<<VT_R4)) {
+ rc = VariantChangeType(&lv,left,0,VT_R4);
+ if (FAILED(rc)) return rc;
+ rc = VariantChangeType(&rv,right,0,VT_R4);
+ if (FAILED(rc)) return rc;
+
+ if (V_R4(&lv) == V_R4(&rv)) return VARCMP_EQ;
+ if (V_R4(&lv) < V_R4(&rv)) return VARCMP_LT;
+ if (V_R4(&lv) > V_R4(&rv)) return VARCMP_GT;
+ return E_FAIL; /* can't get here */
+ }
+
/* Integers - Ideally like to use VarDecCmp, but no Dec support yet
Use LONGLONG to maximize ranges */
lOk = TRUE;
@@ -5204,8 +5235,6 @@
return VARCMP_GT;
}
}
-
-
FIXME("VarCmp partial implementation, doesnt support vt 0x%x / 0x%x\n",V_VT(left), V_VT(right));
return E_FAIL;
}
@@ -5377,6 +5406,174 @@
}
/**********************************************************************
+ * VarMul [OLEAUT32.156]
+ *
+ */
+HRESULT WINAPI VarMul(LPVARIANT left, LPVARIANT right, LPVARIANT result)
+{
+ HRESULT rc = E_FAIL;
+ TRACE("left: ");dump_Variant(left);
+ TRACE("right: ");dump_Variant(right);
+ VARTYPE lvt,rvt,resvt;
+ VARIANT lv,rv;
+ BOOL found;
+
+ VariantInit(&lv);VariantInit(&rv);
+ lvt = V_VT(left)&VT_TYPEMASK;
+ rvt = V_VT(right)&VT_TYPEMASK;
+ found = FALSE;resvt=VT_VOID;
+ if (((1<<lvt) | (1<<rvt)) & ((1<<VT_R4)|(1<<VT_R8))) {
+ found = TRUE;
+ resvt = VT_R8;
+ }
+ if (!found && (((1<<lvt) | (1<<rvt)) & ((1<<VT_I1)|(1<<VT_I2)|(1<<VT_UI1)|(1<<VT_UI2)|(1<<VT_I4)|(1<<VT_UI4)|(1<<VT_INT)|(1<<VT_UINT)))) {
+ found = TRUE;
+ resvt = VT_I4;
+ }
+ if (!found) {
+ FIXME("can't expand vt %d vs %d to a target type.\n",lvt,rvt);
+ return E_FAIL;
+ }
+ rc = VariantChangeType(&lv, left, 0, resvt);
+ if (FAILED(rc)) {
+ FIXME("Could not convert 0x%x to %d?\n",V_VT(left),resvt);
+ return rc;
+ }
+ rc = VariantChangeType(&rv, right, 0, resvt);
+ if (FAILED(rc)) {
+ FIXME("Could not convert 0x%x to %d?\n",V_VT(right),resvt);
+ return rc;
+ }
+ switch (resvt) {
+ case VT_R8:
+ V_VT(result) = resvt;
+ V_R8(result) = V_R8(&lv) * V_R8(&rv);
+ rc = S_OK;
+ break;
+ case VT_I4:
+ V_VT(result) = resvt;
+ V_I4(result) = V_I4(&lv) * V_I4(&rv);
+ rc = S_OK;
+ break;
+ }
+ TRACE("rc=%d, Result:\n", (int) rc);
+ dump_Variant(result);
+ return rc;
+}
+
+/**********************************************************************
+ * VarDiv [OLEAUT32.143]
+ *
+ */
+HRESULT WINAPI VarDiv(LPVARIANT left, LPVARIANT right, LPVARIANT result)
+{
+ HRESULT rc = E_FAIL;
+ TRACE("left: ");dump_Variant(left);
+ TRACE("right: ");dump_Variant(right);
+ VARTYPE lvt,rvt,resvt;
+ VARIANT lv,rv;
+ BOOL found;
+
+ VariantInit(&lv);VariantInit(&rv);
+ lvt = V_VT(left)&VT_TYPEMASK;
+ rvt = V_VT(right)&VT_TYPEMASK;
+ found = FALSE;resvt = VT_VOID;
+ if (((1<<lvt) | (1<<rvt)) & ((1<<VT_R4)|(1<<VT_R8))) {
+ found = TRUE;
+ resvt = VT_R8;
+ }
+ if (!found && (((1<<lvt) | (1<<rvt)) & ((1<<VT_I1)|(1<<VT_I2)|(1<<VT_UI1)|(1<<VT_UI2)|(1<<VT_I4)|(1<<VT_UI4)|(1<<VT_INT)|(1<<VT_UINT)))) {
+ found = TRUE;
+ resvt = VT_I4;
+ }
+ if (!found) {
+ FIXME("can't expand vt %d vs %d to a target type.\n",lvt,rvt);
+ return E_FAIL;
+ }
+ rc = VariantChangeType(&lv, left, 0, resvt);
+ if (FAILED(rc)) {
+ FIXME("Could not convert 0x%x to %d?\n",V_VT(left),resvt);
+ return rc;
+ }
+ rc = VariantChangeType(&rv, right, 0, resvt);
+ if (FAILED(rc)) {
+ FIXME("Could not convert 0x%x to %d?\n",V_VT(right),resvt);
+ return rc;
+ }
+ switch (resvt) {
+ case VT_R8:
+ V_VT(result) = resvt;
+ V_R8(result) = V_R8(&lv) / V_R8(&rv);
+ rc = S_OK;
+ break;
+ case VT_I4:
+ V_VT(result) = resvt;
+ V_I4(result) = V_I4(&lv) / V_I4(&rv);
+ rc = S_OK;
+ break;
+ }
+ TRACE("rc=%d, Result:\n", (int) rc);
+ dump_Variant(result);
+ return rc;
+}
+
+/**********************************************************************
+ * VarSub [OLEAUT32.159]
+ *
+ */
+HRESULT WINAPI VarSub(LPVARIANT left, LPVARIANT right, LPVARIANT result)
+{
+ HRESULT rc = E_FAIL;
+ TRACE("left: ");dump_Variant(left);
+ TRACE("right: ");dump_Variant(right);
+ VARTYPE lvt,rvt,resvt;
+ VARIANT lv,rv;
+ BOOL found;
+
+ VariantInit(&lv);VariantInit(&rv);
+ lvt = V_VT(left)&VT_TYPEMASK;
+ rvt = V_VT(right)&VT_TYPEMASK;
+ found = FALSE;resvt = VT_VOID;
+ if (((1<<lvt) | (1<<rvt)) & ((1<<VT_R4)|(1<<VT_R8))) {
+ found = TRUE;
+ resvt = VT_R8;
+ }
+ if (!found && (((1<<lvt) | (1<<rvt)) & ((1<<VT_I1)|(1<<VT_I2)|(1<<VT_UI1)|(1<<VT_UI2)|(1<<VT_I4)|(1<<VT_UI4)|(1<<VT_INT)|(1<<VT_UINT)))) {
+ found = TRUE;
+ resvt = VT_I4;
+ }
+ if (!found) {
+ FIXME("can't expand vt %d vs %d to a target type.\n",lvt,rvt);
+ return E_FAIL;
+ }
+ rc = VariantChangeType(&lv, left, 0, resvt);
+ if (FAILED(rc)) {
+ FIXME("Could not convert 0x%x to %d?\n",V_VT(left),resvt);
+ return rc;
+ }
+ rc = VariantChangeType(&rv, right, 0, resvt);
+ if (FAILED(rc)) {
+ FIXME("Could not convert 0x%x to %d?\n",V_VT(right),resvt);
+ return rc;
+ }
+ switch (resvt) {
+ case VT_R8:
+ V_VT(result) = resvt;
+ V_R8(result) = V_R8(&lv) - V_R8(&rv);
+ rc = S_OK;
+ break;
+ case VT_I4:
+ V_VT(result) = resvt;
+ V_I4(result) = V_I4(&lv) - V_I4(&rv);
+ rc = S_OK;
+ break;
+ }
+ TRACE("rc=%d, Result:\n", (int) rc);
+ dump_Variant(result);
+ return rc;
+}
+
+/**********************************************************************
* VarOr [OLEAUT32.157]
*
*/
@@ -5895,9 +6092,14 @@
} else {
sprintf(pBuffer, "%f", V_UNION(varIn,dblVal));
}
-
*pbstrOut = StringDupAtoBstr( pBuffer );
-
+ } else if ((V_VT(varIn)&VT_TYPEMASK) == VT_I2) {
+ if (V_VT(varIn)&VT_BYREF) {
+ sprintf(pBuffer, "%d", *V_UNION(varIn,piVal));
+ } else {
+ sprintf(pBuffer, "%d", V_UNION(varIn,iVal));
+ }
+ *pbstrOut = StringDupAtoBstr( pBuffer );
} else if ((V_VT(varIn)&VT_TYPEMASK) == VT_BSTR) {
if (V_VT(varIn)&VT_BYREF)
*pbstrOut = SysAllocString( *V_UNION(varIn,pbstrVal) );
More information about the wine-patches
mailing list