wine/dlls/msi tests/package.c cond.y

Alexandre Julliard julliard at wine.codeweavers.com
Mon Nov 14 05:24:14 CST 2005


ChangeSet ID:	21250
CVSROOT:	/opt/cvs-commit
Module name:	wine
Changes by:	julliard at winehq.org	2005/11/14 05:24:14

Modified files:
	dlls/msi/tests : package.c 
	dlls/msi       : cond.y 

Log message:
	Mike McCormack <mike at codeweavers.com>
	Fix comparison of empty properties to numbers and add test cases.

Patch: http://cvs.winehq.org/patch.py?id=21250

Old revision  New revision  Changes     Path
 1.10          1.11          +54 -0      wine/dlls/msi/tests/package.c
 1.25          1.26          +28 -2      wine/dlls/msi/cond.y

Index: wine/dlls/msi/tests/package.c
diff -u -p wine/dlls/msi/tests/package.c:1.10 wine/dlls/msi/tests/package.c:1.11
--- wine/dlls/msi/tests/package.c:1.10	14 Nov 2005 11:24:14 -0000
+++ wine/dlls/msi/tests/package.c	14 Nov 2005 11:24:14 -0000
@@ -593,6 +593,60 @@ void test_condition(void)
     r = MsiEvaluateCondition(hpkg, "Installed<>\"\"");
     ok( r == MSICONDITION_FALSE, "wrong return val\n");
 
+    r = MsiEvaluateCondition(hpkg, "NOT 1 AND 0");
+    ok( r == MSICONDITION_FALSE, "wrong return val\n");
+
+    r = MsiEvaluateCondition(hpkg, "bandalmael=0");
+    ok( r == MSICONDITION_FALSE, "wrong return val\n");
+
+    MsiSetProperty(hpkg, "bandalmael", "0" );
+    r = MsiEvaluateCondition(hpkg, "bandalmael=0");
+    ok( r == MSICONDITION_TRUE, "wrong return val\n");
+
+    MsiSetProperty(hpkg, "bandalmael", "" );
+    r = MsiEvaluateCondition(hpkg, "bandalmael=0");
+    ok( r == MSICONDITION_FALSE, "wrong return val\n");
+
+    MsiSetProperty(hpkg, "bandalmael", "asdf" );
+    r = MsiEvaluateCondition(hpkg, "bandalmael=0");
+    ok( r == MSICONDITION_FALSE, "wrong return val\n");
+
+    MsiSetProperty(hpkg, "bandalmael", "0asdf" );
+    r = MsiEvaluateCondition(hpkg, "bandalmael=0");
+    ok( r == MSICONDITION_FALSE, "wrong return val\n");
+
+    MsiSetProperty(hpkg, "bandalmael", "0 " );
+    r = MsiEvaluateCondition(hpkg, "bandalmael=0");
+    ok( r == MSICONDITION_FALSE, "wrong return val\n");
+
+    MsiSetProperty(hpkg, "bandalmael", "-0" );
+    r = MsiEvaluateCondition(hpkg, "bandalmael=0");
+    ok( r == MSICONDITION_TRUE, "wrong return val\n");
+
+    MsiSetProperty(hpkg, "bandalmael", "0000000000000" );
+    r = MsiEvaluateCondition(hpkg, "bandalmael=0");
+    ok( r == MSICONDITION_TRUE, "wrong return val\n");
+
+    MsiSetProperty(hpkg, "bandalmael", "--0" );
+    r = MsiEvaluateCondition(hpkg, "bandalmael=0");
+    ok( r == MSICONDITION_FALSE, "wrong return val\n");
+
+    MsiSetProperty(hpkg, "bandalmael", "0x00" );
+    r = MsiEvaluateCondition(hpkg, "bandalmael=0");
+    ok( r == MSICONDITION_FALSE, "wrong return val\n");
+
+    MsiSetProperty(hpkg, "bandalmael", "-" );
+    r = MsiEvaluateCondition(hpkg, "bandalmael=0");
+    ok( r == MSICONDITION_FALSE, "wrong return val\n");
+
+    MsiSetProperty(hpkg, "bandalmael", "+0" );
+    r = MsiEvaluateCondition(hpkg, "bandalmael=0");
+    ok( r == MSICONDITION_FALSE, "wrong return val\n");
+
+    MsiSetProperty(hpkg, "bandalmael", "0.0" );
+    r = MsiEvaluateCondition(hpkg, "bandalmael=0");
+    ok( r == MSICONDITION_FALSE, "wrong return val\n");
+
     MsiCloseHandle( hpkg );
 }
 
Index: wine/dlls/msi/cond.y
diff -u -p wine/dlls/msi/cond.y:1.25 wine/dlls/msi/cond.y:1.26
--- wine/dlls/msi/cond.y:1.25	14 Nov 2005 11:24:14 -0000
+++ wine/dlls/msi/cond.y	14 Nov 2005 11:24:14 -0000
@@ -75,6 +75,30 @@ static INT compare_and_free_strings( LPW
     return r;
 }
 
+static BOOL num_from_prop( LPCWSTR p, INT *val )
+{
+    INT ret = 0, sign = 1;
+
+    if (!p)
+        return FALSE;
+    if (*p == '-')
+    {
+        sign = -1;
+        p++;
+    }
+    if (!*p)
+        return FALSE;
+    while (*p)
+    {
+        if( *p < '0' || *p > '9' )
+            return FALSE;
+        ret = ret*10 + (*p - '0');
+        p++;
+    }
+    *val = ret*sign;
+    return TRUE;
+}
+
 %}
 
 %pure-parser
@@ -169,11 +193,13 @@ boolean_factor:
         }
   | symbol_s operator value_i
         {
-            $$ = compare_int( $1 ? atoiW($1) : 0, $2, $3 );
+            int num;
+            $$ = num_from_prop( $1, &num ) && compare_int( num, $2, $3 );
         }
   | value_i operator symbol_s
         {
-            $$ = compare_int( $1, $2, $3 ? atoiW($3) : 0 );
+            int num;
+            $$ = num_from_prop( $3, &num ) && compare_int( $1, $2, num );
         }
   | symbol_s operator symbol_s
         {



More information about the wine-cvs mailing list