| 1317 | bool AcceptsArbitraryContentParameter() const override { return true; } |
| 1318 | |
| 1319 | std::string Evaluate( |
| 1320 | std::vector<std::string> const& parameters, cm::GenEx::Evaluation* eval, |
| 1321 | GeneratorExpressionContent const* content, |
| 1322 | cmGeneratorExpressionDAGChecker* /*dagChecker*/) const override |
| 1323 | { |
| 1324 | static std::unordered_map< |
| 1325 | cm::string_view, |
| 1326 | std::function<std::string(cm::GenEx::Evaluation*, |
| 1327 | GeneratorExpressionContent const*, |
| 1328 | Arguments&)>> |
| 1329 | stringCommands{ |
| 1330 | { "LENGTH"_s, |
| 1331 | [](cm::GenEx::Evaluation* ev, GeneratorExpressionContent const* cnt, |
| 1332 | Arguments& args) -> std::string { |
| 1333 | if (CheckStringParameters(ev, cnt, "LENGTH"_s, args)) { |
| 1334 | return std::to_string(cm::CMakeString{ args.front() }.Length()); |
| 1335 | } |
| 1336 | return std::string{}; |
| 1337 | } }, |
| 1338 | { "SUBSTRING"_s, |
| 1339 | [](cm::GenEx::Evaluation* ev, GeneratorExpressionContent const* cnt, |
| 1340 | Arguments& args) -> std::string { |
| 1341 | if (CheckStringParameters(ev, cnt, "SUBSTRING"_s, args, 3)) { |
| 1342 | cm::CMakeString str{ args.front() }; |
| 1343 | std::vector<long> indexes; |
| 1344 | if (GetNumericArguments(ev, cnt, args.advance(1), indexes)) { |
| 1345 | try { |
| 1346 | return str.Substring(indexes.front(), indexes.back()); |
| 1347 | } catch (std::out_of_range const& e) { |
| 1348 | reportError(ev, cnt->GetOriginalExpression(), e.what()); |
| 1349 | return std::string{}; |
| 1350 | } |
| 1351 | } |
| 1352 | } |
| 1353 | return std::string{}; |
| 1354 | } }, |
| 1355 | { "FIND"_s, |
| 1356 | [](cm::GenEx::Evaluation* ev, GeneratorExpressionContent const* cnt, |
| 1357 | Arguments& args) -> std::string { |
| 1358 | if (CheckStringParametersEx(ev, cnt, "FIND"_s, args.size(), 2, |
| 1359 | false)) { |
| 1360 | if (args.size() > 3) { |
| 1361 | reportError(ev, cnt->GetOriginalExpression(), |
| 1362 | "$<STRING:FIND> expression expects at " |
| 1363 | "most three parameters."); |
| 1364 | return std::string{}; |
| 1365 | } |
| 1366 | |
| 1367 | auto const FROM = "FROM:"_s; |
| 1368 | |
| 1369 | cm::CMakeString str{ args.front() }; |
| 1370 | cm::CMakeString::FindFrom from = |
| 1371 | cm::CMakeString::FindFrom::Begin; |
| 1372 | cm::string_view substring; |
| 1373 | |
| 1374 | args.advance(1); |
| 1375 | if (args.size() == 2) { |
| 1376 | cm::CMakeString::FindFrom opt = |
nothing calls this directly
no test coverage detected