From fc0cc66b54601f15bd65a40dc3f85a02c21eb0c9 Mon Sep 17 00:00:00 2001 From: Mike McCormack Date: Mon, 14 Nov 2005 11:24:14 +0000 Subject: [PATCH] Fix comparison of empty properties to numbers and add test cases. --- dlls/msi/cond.y | 30 +++++++++++++++++++++++++-- dlls/msi/tests/package.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 2 deletions(-) diff --git a/dlls/msi/cond.y b/dlls/msi/cond.y index 1d55ac3997e..62215c51727 100644 --- a/dlls/msi/cond.y +++ b/dlls/msi/cond.y @@ -75,6 +75,30 @@ static INT compare_and_free_strings( LPWSTR a, INT op, LPWSTR b ) 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 { diff --git a/dlls/msi/tests/package.c b/dlls/msi/tests/package.c index 24c11b0ba1e..dce8e57bc17 100644 --- a/dlls/msi/tests/package.c +++ b/dlls/msi/tests/package.c @@ -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 ); } -- 2.11.4.GIT