Genex: Add EQUAL expression.
Support decimal, hex, octal and binary literals.
This commit is contained in:
parent
2d6638008c
commit
2af966d9ab
|
@ -55,6 +55,8 @@ otherwise expands to nothing.
|
|||
``0`` if ``?`` is ``1``, else ``1``
|
||||
``$<STREQUAL:a,b>``
|
||||
``1`` if ``a`` is STREQUAL ``b``, else ``0``
|
||||
``$<EQUAL:a,b>``
|
||||
``1`` if ``a`` is EQUAL ``b`` in a numeric comparison, else ``0``
|
||||
``$<CONFIG:cfg>``
|
||||
``1`` if config is ``cfg``, else ``0``. This is a case-insensitive comparison.
|
||||
The mapping in :prop_tgt:`MAP_IMPORTED_CONFIG_<CONFIG>` is also considered by
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <cmsys/String.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
#if !defined(__SUNPRO_CC) || __SUNPRO_CC > 0x510
|
||||
|
@ -196,6 +197,92 @@ static const struct StrEqualNode : public cmGeneratorExpressionNode
|
|||
}
|
||||
} strEqualNode;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
static const struct EqualNode : public cmGeneratorExpressionNode
|
||||
{
|
||||
EqualNode() {}
|
||||
|
||||
virtual int NumExpectedParameters() const { return 2; }
|
||||
|
||||
std::string Evaluate(const std::vector<std::string> ¶meters,
|
||||
cmGeneratorExpressionContext *context,
|
||||
const GeneratorExpressionContent *content,
|
||||
cmGeneratorExpressionDAGChecker *) const
|
||||
{
|
||||
char *pEnd;
|
||||
|
||||
int base = 0;
|
||||
bool flipSign = false;
|
||||
|
||||
const char *lhs = parameters[0].c_str();
|
||||
if (cmHasLiteralPrefix(lhs, "0b"))
|
||||
{
|
||||
base = 2;
|
||||
lhs += 2;
|
||||
}
|
||||
if (cmHasLiteralPrefix(lhs, "-0b"))
|
||||
{
|
||||
base = 2;
|
||||
lhs += 3;
|
||||
flipSign = true;
|
||||
}
|
||||
if (cmHasLiteralPrefix(lhs, "+0b"))
|
||||
{
|
||||
base = 2;
|
||||
lhs += 3;
|
||||
}
|
||||
|
||||
long lnum = strtol(lhs, &pEnd, base);
|
||||
if (pEnd == lhs || *pEnd != '\0' || errno == ERANGE)
|
||||
{
|
||||
reportError(context, content->GetOriginalExpression(),
|
||||
"$<EQUAL> parameter " + parameters[0] + " is not a valid integer.");
|
||||
return std::string();
|
||||
}
|
||||
|
||||
if (flipSign)
|
||||
{
|
||||
lnum = -lnum;
|
||||
}
|
||||
|
||||
base = 0;
|
||||
flipSign = false;
|
||||
|
||||
const char *rhs = parameters[1].c_str();
|
||||
if (cmHasLiteralPrefix(rhs, "0b"))
|
||||
{
|
||||
base = 2;
|
||||
rhs += 2;
|
||||
}
|
||||
if (cmHasLiteralPrefix(rhs, "-0b"))
|
||||
{
|
||||
base = 2;
|
||||
rhs += 3;
|
||||
flipSign = true;
|
||||
}
|
||||
if (cmHasLiteralPrefix(rhs, "+0b"))
|
||||
{
|
||||
base = 2;
|
||||
rhs += 3;
|
||||
}
|
||||
|
||||
long rnum = strtol(rhs, &pEnd, base);
|
||||
if (pEnd == rhs || *pEnd != '\0' || errno == ERANGE)
|
||||
{
|
||||
reportError(context, content->GetOriginalExpression(),
|
||||
"$<EQUAL> parameter " + parameters[1] + " is not a valid integer.");
|
||||
return std::string();
|
||||
}
|
||||
|
||||
if (flipSign)
|
||||
{
|
||||
rnum = -rnum;
|
||||
}
|
||||
|
||||
return lnum == rnum ? "1" : "0";
|
||||
}
|
||||
} equalNode;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
static const struct LowerCaseNode : public cmGeneratorExpressionNode
|
||||
{
|
||||
|
@ -1492,6 +1579,8 @@ cmGeneratorExpressionNode* GetNode(const std::string &identifier)
|
|||
return &targetSoNameFileDirNode;
|
||||
else if (identifier == "STREQUAL")
|
||||
return &strEqualNode;
|
||||
else if (identifier == "EQUAL")
|
||||
return &equalNode;
|
||||
else if (identifier == "LOWER_CASE")
|
||||
return &lowerCaseNode;
|
||||
else if (identifier == "UPPER_CASE")
|
||||
|
|
|
@ -60,7 +60,7 @@ set_property(TARGET CompatibleInterface PROPERTY STRING_PROP2 prop2)
|
|||
set_property(TARGET CompatibleInterface PROPERTY STRING_PROP3 prop3)
|
||||
set_property(TARGET CompatibleInterface PROPERTY NUMBER_MIN_PROP1 50)
|
||||
set_property(TARGET CompatibleInterface PROPERTY NUMBER_MIN_PROP2 250)
|
||||
set_property(TARGET CompatibleInterface PROPERTY NUMBER_MIN_PROP3 0xA)
|
||||
set_property(TARGET CompatibleInterface PROPERTY NUMBER_MIN_PROP3 0xa)
|
||||
set_property(TARGET CompatibleInterface PROPERTY NUMBER_MIN_PROP4 0x1A)
|
||||
set_property(TARGET CompatibleInterface PROPERTY NUMBER_MAX_PROP1 50)
|
||||
set_property(TARGET CompatibleInterface PROPERTY NUMBER_MAX_PROP2 250)
|
||||
|
@ -75,7 +75,7 @@ target_compile_definitions(CompatibleInterface
|
|||
$<$<STREQUAL:$<TARGET_PROPERTY:STRING_PROP3>,prop3>:STRING_PROP3>
|
||||
$<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MIN_PROP1>,50>:NUMBER_MIN_PROP1=50>
|
||||
$<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MIN_PROP2>,200>:NUMBER_MIN_PROP2=200>
|
||||
$<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MIN_PROP3>,0xA>:NUMBER_MIN_PROP3=0xA>
|
||||
$<$<EQUAL:$<TARGET_PROPERTY:NUMBER_MIN_PROP3>,0xA>:NUMBER_MIN_PROP3=0xA>
|
||||
$<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MIN_PROP4>,0x10>:NUMBER_MIN_PROP4=0x10>
|
||||
$<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MAX_PROP1>,100>:NUMBER_MAX_PROP1=100>
|
||||
$<$<STREQUAL:$<TARGET_PROPERTY:NUMBER_MAX_PROP2>,250>:NUMBER_MAX_PROP2=250>
|
||||
|
|
|
@ -196,6 +196,27 @@ add_custom_target(check-part3 ALL
|
|||
-Dlower_case=$<LOWER_CASE:Mi,XeD>
|
||||
-Dupper_case=$<UPPER_CASE:MiX,eD>
|
||||
-Dmake_c_identifier=$<MAKE_C_IDENTIFIER:4f,oo:+bar-$>
|
||||
-Dequal1=$<EQUAL:1,2>
|
||||
-Dequal2=$<EQUAL:1,1>
|
||||
-Dequal3=$<EQUAL:0x1,1>
|
||||
-Dequal4=$<EQUAL:0x1,2>
|
||||
-Dequal5=$<EQUAL:0xA,0xa>
|
||||
-Dequal6=$<EQUAL:0xA,10>
|
||||
-Dequal7=$<EQUAL:0xA,012>
|
||||
-Dequal8=$<EQUAL:10,012>
|
||||
-Dequal9=$<EQUAL:10,010>
|
||||
-Dequal10=$<EQUAL:10,0b1010>
|
||||
-Dequal11=$<EQUAL:-10,-0xa>
|
||||
-Dequal12=$<EQUAL:10,+0xa>
|
||||
-Dequal13=$<EQUAL:+10,+0xa>
|
||||
-Dequal14=$<EQUAL:+10,0xa>
|
||||
-Dequal15=$<EQUAL:-10,-0xa>
|
||||
-Dequal16=$<EQUAL:-10,-0b1010>
|
||||
-Dequal17=$<EQUAL:-10,+0b1010>
|
||||
-Dequal18=$<EQUAL:10,+0b1010>
|
||||
-Dequal19=$<EQUAL:10,+012>
|
||||
-Dequal20=$<EQUAL:10,-012>
|
||||
-Dequal21=$<EQUAL:-10,-012>
|
||||
-P ${CMAKE_CURRENT_SOURCE_DIR}/check-part3.cmake
|
||||
COMMAND ${CMAKE_COMMAND} -E echo "check done (part 3 of 3)"
|
||||
VERBATIM
|
||||
|
|
|
@ -37,3 +37,24 @@ endforeach()
|
|||
check(lower_case "mi,xed")
|
||||
check(upper_case "MIX,ED")
|
||||
check(make_c_identifier "_4f_oo__bar__")
|
||||
check(equal1 "0")
|
||||
check(equal2 "1")
|
||||
check(equal3 "1")
|
||||
check(equal4 "0")
|
||||
check(equal5 "1")
|
||||
check(equal6 "1")
|
||||
check(equal7 "1")
|
||||
check(equal8 "1")
|
||||
check(equal9 "0")
|
||||
check(equal10 "1")
|
||||
check(equal11 "1")
|
||||
check(equal12 "1")
|
||||
check(equal13 "1")
|
||||
check(equal14 "1")
|
||||
check(equal15 "1")
|
||||
check(equal16 "1")
|
||||
check(equal17 "0")
|
||||
check(equal18 "1")
|
||||
check(equal19 "1")
|
||||
check(equal20 "0")
|
||||
check(equal21 "1")
|
||||
|
|
Loading…
Reference in New Issue