diff options
Diffstat (limited to 'src/support/string.cpp')
-rw-r--r-- | src/support/string.cpp | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/src/support/string.cpp b/src/support/string.cpp index c7f8a5ff6..09924849b 100644 --- a/src/support/string.cpp +++ b/src/support/string.cpp @@ -20,6 +20,92 @@ namespace wasm::String { +Split::Split(const std::string& input, const NewLineOr& newLineOrDelim) { + auto first = input.find("\n", 0); + if (first != std::string::npos && first != input.length() - 1) { + split(input, "\n"); + } else { + split(input, newLineOrDelim.delim); + } +} + +void Split::split(const std::string& input, const std::string& delim) { + size_t lastEnd = 0; + while (lastEnd < input.size()) { + auto nextDelim = input.find(delim, lastEnd); + if (nextDelim == std::string::npos) { + nextDelim = input.size(); + } + (*this).push_back(input.substr(lastEnd, nextDelim - lastEnd)); + lastEnd = nextDelim + delim.size(); + } + needToHandleBracketingOperations = delim != "\n"; +} + +Split handleBracketingOperators(Split split) { + if (!split.needToHandleBracketingOperations) { + return split; + } + + Split ret; + std::string last; + int nesting = 0; + auto handlePart = [&](std::string part) { + if (part.empty()) { + return; + } + for (const char c : part) { + if (c == '(' || c == '<' || c == '[' || c == '{') { + nesting++; + } else if (c == ')' || c == '>' || c == ']' || c == '}') { + nesting--; + } + } + if (last.empty()) { + last = part; + } else { + last += ',' + part; + } + if (nesting == 0) { + ret.push_back(last); + last.clear(); + } + }; + for (auto& part : split) { + handlePart(part); + } + handlePart(""); + if (nesting != 0) { + Fatal() << "Asyncify: failed to parse lists"; + } + return ret; +} + +bool wildcardMatch(const std::string& pattern, const std::string& value) { + for (size_t i = 0; i < pattern.size(); i++) { + if (pattern[i] == '*') { + return wildcardMatch(pattern.substr(i + 1), value.substr(i)) || + (value.size() > 0 && + wildcardMatch(pattern.substr(i), value.substr(i + 1))); + } + if (i >= value.size()) { + return false; + } + if (pattern[i] != value[i]) { + return false; + } + } + return value.size() == pattern.size(); +} + +std::string trim(const std::string& input) { + size_t size = input.size(); + while (size > 0 && (isspace(input[size - 1]) || input[size - 1] == '\0')) { + size--; + } + return input.substr(0, size); +} + std::ostream& printEscaped(std::ostream& os, std::string_view str) { os << '"'; for (unsigned char c : str) { |