+ HRESULT hres;\r
+ VARTYPE lvt, rvt, resvt, tvt;\r
+ VARIANT lv, rv, tv;\r
+ double r8res;\r
+\r
+ /* Variant priority for coercion. Sorted from lowest to highest.\r
+ VT_ERROR shows an invalid input variant type. */\r
+ enum coerceprio { vt_UI1 = 0, vt_I2, vt_I4, vt_I8, vt_CY, vt_R4, vt_R8,\r
+ vt_DECIMAL, vt_NULL, vt_ERROR };\r
+ /* Mapping from priority to variant type. Keep in sync with coerceprio! */\r
+ VARTYPE prio2vt[] = { VT_UI1, VT_I2, VT_I4, VT_I8, VT_CY, VT_R4, VT_R8,\r
+ VT_DECIMAL, VT_NULL, VT_ERROR };\r
+\r
+ /* Mapping for coercion from input variant to priority of result variant. */\r
+ static VARTYPE coerce[] = {\r
+ /* VT_EMPTY, VT_NULL, VT_I2, VT_I4, VT_R4 */\r
+ vt_UI1, vt_NULL, vt_I2, vt_I4, vt_R4,\r
+ /* VT_R8, VT_CY, VT_DATE, VT_BSTR, VT_DISPATCH */\r
+ vt_R8, vt_CY, vt_R8, vt_R8, vt_ERROR,\r
+ /* VT_ERROR, VT_BOOL, VT_VARIANT, VT_UNKNOWN, VT_DECIMAL */\r
+ vt_ERROR, vt_I2, vt_ERROR, vt_ERROR, vt_DECIMAL,\r
+ /* 15, VT_I1, VT_UI1, VT_UI2, VT_UI4 VT_I8 */\r
+ vt_ERROR, vt_ERROR, vt_UI1, vt_ERROR, vt_ERROR, vt_I8\r
+ };\r