Line data Source code
1 : // Copyright (c) 2018-2019 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 <string> 10 : #include <vector> 11 : 12 : namespace spanparsing { 13 : 14 925 : bool Const(const std::string& str, Span<const char>& sp) 15 : { 16 925 : if ((size_t)sp.size() >= str.size() && std::equal(str.begin(), str.end(), sp.begin())) { 17 923 : sp = sp.subspan(str.size()); 18 923 : return true; 19 : } 20 2 : return false; 21 925 : } 22 : 23 10110 : bool Func(const std::string& str, Span<const char>& sp) 24 : { 25 10110 : if ((size_t)sp.size() >= str.size() + 2 && sp[str.size()] == '(' && sp[sp.size() - 1] == ')' && std::equal(str.begin(), str.end(), sp.begin())) { 26 1772 : sp = sp.subspan(str.size() + 1, sp.size() - str.size() - 2); 27 1772 : return true; 28 : } 29 8338 : return false; 30 10110 : } 31 : 32 3041 : Span<const char> Expr(Span<const char>& sp) 33 : { 34 : int level = 0; 35 3041 : auto it = sp.begin(); 36 368931 : while (it != sp.end()) { 37 366825 : if (*it == '(') { 38 2547 : ++level; 39 366825 : } else if (level && *it == ')') { 40 2547 : --level; 41 364278 : } else if (level == 0 && (*it == ')' || *it == ',')) { 42 : break; 43 : } 44 365890 : ++it; 45 : } 46 3041 : Span<const char> ret = sp.first(it - sp.begin()); 47 3041 : sp = sp.subspan(it - sp.begin()); 48 : return ret; 49 3041 : } 50 : 51 5304 : std::vector<Span<const char>> Split(const Span<const char>& sp, char sep) 52 : { 53 5304 : std::vector<Span<const char>> ret; 54 5304 : auto it = sp.begin(); 55 5304 : auto start = it; 56 533865 : while (it != sp.end()) { 57 528561 : if (*it == sep) { 58 4840 : ret.emplace_back(start, it); 59 4840 : start = it + 1; 60 4840 : } 61 528561 : ++it; 62 : } 63 5304 : ret.emplace_back(start, it); 64 : return ret; 65 5304 : } 66 : 67 : } // namespace spanparsing