Branch data Line data Source code
1 : : // Copyright (c) 2018-2022 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 : 248226 : bool Const(const std::string& str, Span<const char>& sp) 16 : : { 17 [ + + ][ + + ]: 248226 : if ((size_t)sp.size() >= str.size() && std::equal(str.begin(), str.end(), sp.begin())) { 18 : 51990 : sp = sp.subspan(str.size()); 19 : 51990 : return true; 20 : : } 21 : 196236 : return false; 22 : 248226 : } 23 : : 24 : 18891 : bool Func(const std::string& str, Span<const char>& sp) 25 : : { 26 [ + + ][ + + ]: 18891 : if ((size_t)sp.size() >= str.size() + 2 && sp[str.size()] == '(' && sp[sp.size() - 1] == ')' && std::equal(str.begin(), str.end(), sp.begin())) { [ + + ][ + + ] 27 : 922 : sp = sp.subspan(str.size() + 1, sp.size() - str.size() - 2); 28 : 922 : return true; 29 : : } 30 : 17969 : return false; 31 : 18891 : } 32 : : 33 : 9601 : Span<const char> Expr(Span<const char>& sp) 34 : : { 35 : 9601 : int level = 0; 36 : 9601 : auto it = sp.begin(); 37 [ + + ]: 3809850 : while (it != sp.end()) { 38 [ + + ][ + + ]: 3808268 : if (*it == '(' || *it == '{') { 39 : 21558 : ++level; 40 [ + + ][ + + ]: 3808268 : } else if (level && (*it == ')' || *it == '}')) { [ + + ] 41 : 13987 : --level; 42 [ + + ][ + + ]: 3786710 : } else if (level == 0 && (*it == ')' || *it == '}' || *it == ',')) { [ + + ][ + + ] 43 : 8019 : break; 44 : : } 45 : 3800249 : ++it; 46 : : } 47 : 9601 : Span<const char> ret = sp.first(it - sp.begin()); 48 : 9601 : sp = sp.subspan(it - sp.begin()); 49 : 9601 : return ret; 50 : : } 51 : : 52 : : } // namespace spanparsing