diff --git a/toolsrc/src/vcpkg/parse.cpp b/toolsrc/src/vcpkg/parse.cpp index 91b2b2786..a3f4186fc 100644 --- a/toolsrc/src/vcpkg/parse.cpp +++ b/toolsrc/src/vcpkg/parse.cpp @@ -2,8 +2,8 @@ #include -#include #include +#include namespace vcpkg::Parse { @@ -45,10 +45,7 @@ namespace vcpkg::Parse return nullptr; } - static bool is_whitespace(char c) - { - return c == ' ' || c == '\t' || c == '\n' || c == '\r'; - } + static bool is_whitespace(char c) { return c == ' ' || c == '\t' || c == '\n' || c == '\r'; } std::vector parse_comma_list(const std::string& str) { @@ -59,73 +56,86 @@ namespace vcpkg::Parse std::vector out; - auto iter = str.cbegin(); + auto iter = str.cbegin(); - do { - // Trim leading whitespace of each element - while (iter != str.cend() && is_whitespace(*iter)) - { - ++iter; - } + do + { + // Trim leading whitespace of each element + while (iter != str.cend() && is_whitespace(*iter)) + { + ++iter; + } - // Allow commas inside of []. - bool bracket_nesting = false; + // Allow commas inside of []. + bool bracket_nesting = false; - auto element_begin = iter; - auto element_end = iter; - while (iter != str.cend() && (*iter != ',' || bracket_nesting)) - { - char value = *iter; + auto element_begin = iter; + auto element_end = iter; + while (iter != str.cend() && (*iter != ',' || bracket_nesting)) + { + char value = *iter; - // do not support nested [] - if (value == '[') - { - bracket_nesting = true; - } - else if (value == ']') - { - bracket_nesting = false; - } + // do not support nested [] + if (value == '[') + { + Checks::check_exit(VCPKG_LINE_INFO, + !bracket_nesting, + "Lists do not support nested brackets, Did you forget a ']'?\n" + "> '%s'\n" + "> %s^\n", + str, + std::string(static_cast(iter - str.cbegin()), ' ')); + bracket_nesting = true; + } + else if (value == ']') + { + Checks::check_exit(VCPKG_LINE_INFO, + bracket_nesting, + "Found unmatched ']'. Did you forget a '['?\n" + "> '%s'\n" + "> %s^\n", + str, + std::string(static_cast(iter - str.cbegin()), ' ')); + bracket_nesting = false; + } - ++iter; + ++iter; - // Trim ending whitespace - if (!is_whitespace(value)) - { - // Update element_end after iter is incremented so it will be one past. - element_end = iter; - } - } + // Trim ending whitespace + if (!is_whitespace(value)) + { + // Update element_end after iter is incremented so it will be one past. + element_end = iter; + } + } - if (element_begin == element_end) - { - System::print2( System::Color::warning, - "Warning: empty element in list\n" - "> '", str, "'\n" - "> ", std::string(static_cast(element_begin - str.cbegin()), ' '), "^\n" - ); - } - else - { - out.push_back({ element_begin, element_end }); - } + Checks::check_exit(VCPKG_LINE_INFO, + element_begin != element_end, + "Empty element in list\n" + "> '%s'\n" + "> %s^\n", + str, + std::string(static_cast(element_begin - str.cbegin()), ' ')); - if (iter != str.cend()) - { - //Not at the end, must be at a comma that needs to be stepped over - ++iter; + out.push_back({element_begin, element_end}); - if (iter == str.end()) - { - System::print2(System::Color::warning, - "Warning: empty element in list\n" - "> '", str, "'\n" - "> ", std::string(str.length(), ' '), "^\n" - ); - } - } + if (iter != str.cend()) + { + Checks::check_exit(VCPKG_LINE_INFO, *iter == ',', "Internal parsing error - expected comma"); - } while (iter != str.cend()); + // Not at the end, must be at a comma that needs to be stepped over + ++iter; + + Checks::check_exit(VCPKG_LINE_INFO, + iter != str.end(), + "Empty element in list\n" + "> '%s'\n" + "> %s^\n", + str, + std::string(str.length(), ' ')); + } + + } while (iter != str.cend()); return out; }