Hans Leidekker : wbemprox: Add support for evaluating string comparisons.

Alexandre Julliard julliard at winehq.org
Wed Jul 11 17:39:20 CDT 2012


Module: wine
Branch: master
Commit: bd1bdb167d528b2d57d0d49bdf29be5f7273c1d9
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=bd1bdb167d528b2d57d0d49bdf29be5f7273c1d9

Author: Hans Leidekker <hans at codeweavers.com>
Date:   Wed Jul 11 14:02:16 2012 +0200

wbemprox: Add support for evaluating string comparisons.

---

 dlls/wbemprox/query.c |   58 ++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 50 insertions(+), 8 deletions(-)

diff --git a/dlls/wbemprox/query.c b/dlls/wbemprox/query.c
index 798fda3..1d2eca7 100644
--- a/dlls/wbemprox/query.c
+++ b/dlls/wbemprox/query.c
@@ -226,9 +226,9 @@ void destroy_view( struct view *view )
     heap_free( view );
 }
 
-static BOOL eval_like( LONGLONG lval, LONGLONG rval )
+static BOOL eval_like( const WCHAR *lstr, const WCHAR *rstr )
 {
-    const WCHAR *p = (const WCHAR *)(INT_PTR)lval, *q = (const WCHAR *)(INT_PTR)rval;
+    const WCHAR *p = lstr, *q = rstr;
 
     while (*p && *q)
     {
@@ -244,10 +244,48 @@ static BOOL eval_like( LONGLONG lval, LONGLONG rval )
     return TRUE;
 }
 
+static HRESULT eval_strcmp( UINT op, const WCHAR *lstr, const WCHAR *rstr, LONGLONG *val )
+{
+    switch (op)
+    {
+    case OP_EQ:
+        *val = !strcmpW( lstr, rstr );
+        break;
+    case OP_GT:
+        *val = strcmpW( lstr, rstr ) > 0;
+        break;
+    case OP_LT:
+        *val = strcmpW( lstr, rstr ) < 0;
+        break;
+    case OP_LE:
+        *val = strcmpW( lstr, rstr ) <= 0;
+        break;
+    case OP_GE:
+        *val = strcmpW( lstr, rstr ) >= 0;
+        break;
+    case OP_NE:
+        *val = strcmpW( lstr, rstr );
+        break;
+    case OP_LIKE:
+        *val = eval_like( lstr, rstr );
+        break;
+    default:
+        ERR("unhandled operator %u\n", op);
+        return WBEM_E_INVALID_QUERY;
+    }
+    return S_OK;
+}
+
+static inline BOOL is_strcmp( const struct complex_expr *expr )
+{
+    return ((expr->left->type == EXPR_PROPVAL && expr->right->type == EXPR_SVAL) ||
+            (expr->left->type == EXPR_SVAL && expr->right->type == EXPR_PROPVAL));
+}
+
 static HRESULT eval_cond( const struct table *, UINT, const struct expr *, LONGLONG * );
 
-static BOOL eval_binary( const struct table *table, UINT row, const struct complex_expr *expr,
-                         LONGLONG *val )
+static HRESULT eval_binary( const struct table *table, UINT row, const struct complex_expr *expr,
+                            LONGLONG *val )
 {
     HRESULT lret, rret;
     LONGLONG lval, rval;
@@ -256,6 +294,13 @@ static BOOL eval_binary( const struct table *table, UINT row, const struct compl
     rret = eval_cond( table, row, expr->right, &rval );
     if (lret != S_OK || rret != S_OK) return WBEM_E_INVALID_QUERY;
 
+    if (is_strcmp( expr ))
+    {
+        const WCHAR *lstr = (const WCHAR *)(INT_PTR)lval;
+        const WCHAR *rstr = (const WCHAR *)(INT_PTR)rval;
+
+        return eval_strcmp( expr->op, lstr, rstr, val );
+    }
     switch (expr->op)
     {
     case OP_EQ:
@@ -282,11 +327,8 @@ static BOOL eval_binary( const struct table *table, UINT row, const struct compl
     case OP_NE:
         *val = (lval != rval);
         break;
-    case OP_LIKE:
-        *val = eval_like( lval, rval );
-        break;
     default:
-        ERR("unknown operator %u\n", expr->op);
+        ERR("unhandled operator %u\n", expr->op);
         return WBEM_E_INVALID_QUERY;
     }
     return S_OK;




More information about the wine-cvs mailing list