Line data Source code
1 : // Copyright (c) 2018-2021 The Bitcoin Core developers 2 : // Distributed under the MIT software license, see the accompanying 3 : // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 : 5 : #include <util/spanparsing.h> 6 : 7 : #include <span.h> 8 : 9 : #include <algorithm> 10 : #include <cstddef> 11 : #include <string> 12 : 13 : namespace spanparsing { 14 : 15 4094 : bool Const(const std::string& str, Span<const char>& sp) 16 : { 17 4094 : if ((size_t)sp.size() >= str.size() && std::equal(str.begin(), str.end(), sp.begin())) { 18 806 : sp = sp.subspan(str.size()); 19 806 : return true; 20 : } 21 3288 : return false; 22 4094 : } 23 : 24 42103 : bool Func(const std::string& str, Span<const char>& sp) 25 : { 26 42103 : if ((size_t)sp.size() >= str.size() + 2 && sp[str.size()] == '(' && sp[sp.size() - 1] == ')' && std::equal(str.begin(), str.end(), sp.begin())) { 27 6617 : sp = sp.subspan(str.size() + 1, sp.size() - str.size() - 2); 28 6617 : return true; 29 : } 30 35486 : return false; 31 42103 : } 32 : 33 7234 : Span<const char> Expr(Span<const char>& sp) 34 : { 35 7234 : int level = 0; 36 7234 : auto it = sp.begin(); 37 685987 : while (it != sp.end()) { 38 679208 : if (*it == '(') { 39 6894 : ++level; 40 679208 : } else if (level && *it == ')') { 41 6894 : --level; 42 672314 : } else if (level == 0 && (*it == ')' || *it == ',')) { 43 455 : break; 44 : } 45 678753 : ++it; 46 : } 47 7234 : Span<const char> ret = sp.first(it - sp.begin()); 48 7234 : sp = sp.subspan(it - sp.begin()); 49 7234 : return ret; 50 : } 51 : 52 : } // namespace spanparsing