VarOr() implementation
Andreas Mohr
andi at rhlx01.fht-esslingen.de
Sun Dec 15 16:26:19 CST 2002
Hi all,
*sigh* I just did it...
- implemented VarOr()
(no guarantee for 100% correctness of any sort, however, since it was
almost a mere copy&paste from VarAnd ;-)
Index: dlls/oleaut32/oleaut32.spec
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/oleaut32.spec,v
retrieving revision 1.44
diff -u -r1.44 oleaut32.spec
--- dlls/oleaut32/oleaut32.spec 10 Dec 2002 19:06:28 -0000 1.44
+++ dlls/oleaut32/oleaut32.spec 15 Dec 2002 22:14:16 -0000
@@ -152,7 +152,7 @@
154 stub VarImp # stdcall (ptr ptr ptr)
155 stub VarMod # stdcall (ptr ptr ptr)
156 stub VarMul # stdcall (ptr ptr ptr)
-157 stub VarOr # stdcall (ptr ptr ptr)
+157 stdcall VarOr(ptr ptr ptr) VarOr
158 stub VarPow # stdcall (ptr ptr ptr)
159 stub VarSub # stdcall (ptr ptr ptr)
160 stdcall CreateTypeLib(long wstr ptr) CreateTypeLib
Index: dlls/oleaut32/variant.c
===================================================================
RCS file: /home/wine/wine/dlls/oleaut32/variant.c,v
retrieving revision 1.48
diff -u -r1.48 variant.c
--- dlls/oleaut32/variant.c 10 Dec 2002 19:06:28 -0000 1.48
+++ dlls/oleaut32/variant.c 15 Dec 2002 22:14:19 -0000
@@ -5155,13 +5155,13 @@
/**********************************************************************
* VarAdd [OLEAUT32.141]
- * FIXME: From MSDN: If ... Then
- * Both expressions are of the string type Concatenated.
- * One expression is a string type and the other a character Addition.
- * One expression is numeric and the other is a string Addition.
- * Both expressions are numeric Addition.
- * Either expression is NULL NULL is returned.
- * Both expressions are empty Integer subtype is returned.
+ * FIXME: From MSDN: If ... Then
+ * Both expressions are of the string type Concatenated.
+ * One expression is a string type and the other a character Addition.
+ * One expression is numeric and the other is a string Addition.
+ * Both expressions are numeric Addition.
+ * Either expression is NULL NULL is returned.
+ * Both expressions are empty Integer subtype is returned.
*
*/
HRESULT WINAPI VarAdd(LPVARIANT left, LPVARIANT right, LPVARIANT result)
@@ -5186,7 +5186,7 @@
LONGLONG lVal = -1;
LONGLONG rVal = -1;
LONGLONG res = -1;
- int resT = 0; /* Testing has shown I2 + I2 == I2, all else
+ int resT = 0; /* Testing has shown I2 + I2 == I2, all else
becomes I4 */
lOk = TRUE;
@@ -5228,7 +5228,89 @@
rc = S_OK;
} else {
- FIXME("VarAdd stub\n");
+ FIXME("unimplemented part\n");
+ }
+ }
+
+ TRACE("rc=%d, Result:\n", (int) rc);
+ dump_Variant(result);
+ return rc;
+}
+
+/**********************************************************************
+ * VarOr [OLEAUT32.157]
+ *
+ */
+HRESULT WINAPI VarOr(LPVARIANT left, LPVARIANT right, LPVARIANT result)
+{
+ HRESULT rc = E_FAIL;
+
+ TRACE("Left Var:\n");
+ dump_Variant(left);
+ TRACE("Right Var:\n");
+ dump_Variant(right);
+
+ if ((V_VT(left)&VT_TYPEMASK) == VT_BOOL &&
+ (V_VT(right)&VT_TYPEMASK) == VT_BOOL) {
+
+ V_VT(result) = VT_BOOL;
+ if (V_BOOL(left) || V_BOOL(right)) {
+ V_BOOL(result) = VARIANT_TRUE;
+ } else {
+ V_BOOL(result) = VARIANT_FALSE;
+ }
+ rc = S_OK;
+
+ } else {
+ /* Integers */
+ BOOL lOk = TRUE;
+ BOOL rOk = TRUE;
+ LONGLONG lVal = -1;
+ LONGLONG rVal = -1;
+ LONGLONG res = -1;
+ int resT = 0; /* Testing has shown I2 & I2 == I2, all else
+ becomes I4, even unsigned ints (incl. UI2) */
+
+ lOk = TRUE;
+ switch (V_VT(left)&VT_TYPEMASK) {
+ case VT_I1 : lVal = V_UNION(left,cVal); resT=VT_I4; break;
+ case VT_I2 : lVal = V_UNION(left,iVal); resT=VT_I2; break;
+ case VT_I4 : lVal = V_UNION(left,lVal); resT=VT_I4; break;
+ case VT_INT : lVal = V_UNION(left,lVal); resT=VT_I4; break;
+ case VT_UI1 : lVal = V_UNION(left,bVal); resT=VT_I4; break;
+ case VT_UI2 : lVal = V_UNION(left,uiVal); resT=VT_I4; break;
+ case VT_UI4 : lVal = V_UNION(left,ulVal); resT=VT_I4; break;
+ case VT_UINT : lVal = V_UNION(left,ulVal); resT=VT_I4; break;
+ default: lOk = FALSE;
+ }
+
+ rOk = TRUE;
+ switch (V_VT(right)&VT_TYPEMASK) {
+ case VT_I1 : rVal = V_UNION(right,cVal); resT=VT_I4; break;
+ case VT_I2 : rVal = V_UNION(right,iVal); resT=max(VT_I2, resT); break;
+ case VT_I4 : rVal = V_UNION(right,lVal); resT=VT_I4; break;
+ case VT_INT : rVal = V_UNION(right,lVal); resT=VT_I4; break;
+ case VT_UI1 : rVal = V_UNION(right,bVal); resT=VT_I4; break;
+ case VT_UI2 : rVal = V_UNION(right,uiVal); resT=VT_I4; break;
+ case VT_UI4 : rVal = V_UNION(right,ulVal); resT=VT_I4; break;
+ case VT_UINT : rVal = V_UNION(right,ulVal); resT=VT_I4; break;
+ default: rOk = FALSE;
+ }
+
+ if (lOk && rOk) {
+ res = (lVal | rVal);
+ V_VT(result) = resT;
+ switch (resT) {
+ case VT_I2 : V_UNION(result,iVal) = res; break;
+ case VT_I4 : V_UNION(result,lVal) = res; break;
+ default:
+ FIXME("Unexpected result variant type %x\n", resT);
+ V_UNION(result,lVal) = res;
+ }
+ rc = S_OK;
+
+ } else {
+ FIXME("unimplemented part\n");
}
}
--
Andreas Mohr Stauferstr. 6, D-71272 Renningen, Germany
More information about the wine-patches
mailing list