Revert "msi: Comparisons with null in conditions are special."
This reverts commit 9dce96b315
.
This commit is contained in:
parent
598f2be54b
commit
fadc820fe5
|
@ -431,104 +431,59 @@ static INT compare_substring( LPCWSTR a, INT operator, LPCWSTR b )
|
||||||
case COND_ISS:
|
case COND_ISS:
|
||||||
return strstriW( a, b ) ? 1 : 0;
|
return strstriW( a, b ) ? 1 : 0;
|
||||||
case COND_LHS:
|
case COND_LHS:
|
||||||
return 0 == strncmpW( a, b, lstrlenW( b ) );
|
return 0 == strncmpW( a, b, lstrlenW( b ) );
|
||||||
case COND_RHS:
|
case COND_RHS:
|
||||||
return 0 == lstrcmpW( a + (lstrlenW( a ) - lstrlenW( b )), b );
|
return 0 == lstrcmpW( a + (lstrlenW( a ) - lstrlenW( b )), b );
|
||||||
case COND_ILHS:
|
case COND_ILHS:
|
||||||
return 0 == strncmpiW( a, b, lstrlenW( b ) );
|
return 0 == strncmpiW( a, b, lstrlenW( b ) );
|
||||||
case COND_IRHS:
|
case COND_IRHS:
|
||||||
return 0 == lstrcmpiW( a + (lstrlenW( a ) - lstrlenW( b )), b );
|
return 0 == lstrcmpiW( a + (lstrlenW( a ) - lstrlenW( b )), b );
|
||||||
default:
|
default:
|
||||||
ERR("invalid substring operator\n");
|
ERR("invalid substring operator\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL is_empty( LPCWSTR p )
|
|
||||||
{
|
|
||||||
return !p || !p[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
static BOOL is_alphaless( LPCWSTR p )
|
|
||||||
{
|
|
||||||
while (*p)
|
|
||||||
{
|
|
||||||
if (isalphaW( *p ) || (*p == '_'))
|
|
||||||
return FALSE;
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b )
|
static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b )
|
||||||
{
|
{
|
||||||
int r;
|
|
||||||
|
|
||||||
if (operator >= COND_SS && operator <= COND_RHS)
|
if (operator >= COND_SS && operator <= COND_RHS)
|
||||||
return compare_substring( a, operator, b );
|
return compare_substring( a, operator, b );
|
||||||
|
|
||||||
|
/* null and empty string are equivalent */
|
||||||
|
if (!a) a = szEmpty;
|
||||||
|
if (!b) b = szEmpty;
|
||||||
|
|
||||||
if (is_empty( a ) && is_empty( b ))
|
/* a or b may be NULL */
|
||||||
r = 0;
|
|
||||||
|
|
||||||
else if (is_empty( a ) && is_alphaless( b ))
|
|
||||||
r = 1;
|
|
||||||
|
|
||||||
else if (is_empty( b ) && is_alphaless( a ))
|
|
||||||
r = -1;
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* null and empty string are equivalent */
|
|
||||||
if (!a) a = szEmpty;
|
|
||||||
if (!b) b = szEmpty;
|
|
||||||
|
|
||||||
switch (operator)
|
|
||||||
{
|
|
||||||
case COND_LT:
|
|
||||||
case COND_GT:
|
|
||||||
case COND_EQ:
|
|
||||||
case COND_NE:
|
|
||||||
case COND_GE:
|
|
||||||
case COND_LE:
|
|
||||||
r = lstrcmpW( a, b );
|
|
||||||
break;
|
|
||||||
case COND_ILT:
|
|
||||||
case COND_IGT:
|
|
||||||
case COND_IEQ:
|
|
||||||
case COND_INE:
|
|
||||||
case COND_IGE:
|
|
||||||
case COND_ILE:
|
|
||||||
r = lstrcmpiW( a, b );
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ERR("invalid string operator\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (operator)
|
switch (operator)
|
||||||
{
|
{
|
||||||
case COND_LT:
|
case COND_LT:
|
||||||
case COND_ILT:
|
return -1 == lstrcmpW( a, b );
|
||||||
return -1 == r;
|
|
||||||
case COND_GT:
|
case COND_GT:
|
||||||
case COND_IGT:
|
return 1 == lstrcmpW( a, b );
|
||||||
return 1 == r;
|
|
||||||
case COND_EQ:
|
case COND_EQ:
|
||||||
case COND_IEQ:
|
return 0 == lstrcmpW( a, b );
|
||||||
return 0 == r;
|
|
||||||
case COND_NE:
|
case COND_NE:
|
||||||
case COND_INE:
|
return 0 != lstrcmpW( a, b );
|
||||||
return 0 != r;
|
|
||||||
case COND_GE:
|
case COND_GE:
|
||||||
case COND_IGE:
|
return -1 != lstrcmpW( a, b );
|
||||||
return -1 != r;
|
|
||||||
case COND_LE:
|
case COND_LE:
|
||||||
|
return 1 != lstrcmpW( a, b );
|
||||||
|
case COND_ILT:
|
||||||
|
return -1 == lstrcmpiW( a, b );
|
||||||
|
case COND_IGT:
|
||||||
|
return 1 == lstrcmpiW( a, b );
|
||||||
|
case COND_IEQ:
|
||||||
|
return 0 == lstrcmpiW( a, b );
|
||||||
|
case COND_INE:
|
||||||
|
return 0 != lstrcmpiW( a, b );
|
||||||
|
case COND_IGE:
|
||||||
|
return -1 != lstrcmpiW( a, b );
|
||||||
case COND_ILE:
|
case COND_ILE:
|
||||||
return 1 != r;
|
return 1 != lstrcmpiW( a, b );
|
||||||
default:
|
default:
|
||||||
ERR("invalid string operator\n");
|
ERR("invalid string operator\n");
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue