// Copyright (c) 2018-2019 The Bitcoin Core developers // Copyright (c) 2016-2024 The Hush developers // Distributed under the GPLv3 software license, see the accompanying // file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html #include #include #include #include namespace spanparsing { bool Const(const std::string& str, Span& sp) { if ((size_t)sp.size() >= str.size() && std::equal(str.begin(), str.end(), sp.begin())) { sp = sp.subspan(str.size()); return true; } return false; } bool Func(const std::string& str, Span& sp) { if ((size_t)sp.size() >= str.size() + 2 && sp[str.size()] == '(' && sp[sp.size() - 1] == ')' && std::equal(str.begin(), str.end(), sp.begin())) { sp = sp.subspan(str.size() + 1, sp.size() - str.size() - 2); return true; } return false; } Span Expr(Span& sp) { int level = 0; auto it = sp.begin(); while (it != sp.end()) { if (*it == '(' || *it == '{') { ++level; } else if (level && (*it == ')' || *it == '}')) { --level; } else if (level == 0 && (*it == ')' || *it == '}' || *it == ',')) { break; } ++it; } Span ret = sp.first(it - sp.begin()); sp = sp.subspan(it - sp.begin()); return ret; } std::vector> Split(const Span& sp, char sep) { std::vector> ret; auto it = sp.begin(); auto start = it; while (it != sp.end()) { if (*it == sep) { ret.emplace_back(start, it); start = it + 1; } ++it; } ret.emplace_back(start, it); return ret; } } // namespace spanparsing