/ src / util / spanparsing.cpp
spanparsing.cpp
 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  bool Const(const std::string& str, Span<const char>& sp)
16  {
17      if ((size_t)sp.size() >= str.size() && std::equal(str.begin(), str.end(), sp.begin())) {
18          sp = sp.subspan(str.size());
19          return true;
20      }
21      return false;
22  }
23  
24  bool Func(const std::string& str, Span<const char>& sp)
25  {
26      if ((size_t)sp.size() >= str.size() + 2 && sp[str.size()] == '(' && sp[sp.size() - 1] == ')' && std::equal(str.begin(), str.end(), sp.begin())) {
27          sp = sp.subspan(str.size() + 1, sp.size() - str.size() - 2);
28          return true;
29      }
30      return false;
31  }
32  
33  Span<const char> Expr(Span<const char>& sp)
34  {
35      int level = 0;
36      auto it = sp.begin();
37      while (it != sp.end()) {
38          if (*it == '(' || *it == '{') {
39              ++level;
40          } else if (level && (*it == ')' || *it == '}')) {
41              --level;
42          } else if (level == 0 && (*it == ')' || *it == '}' || *it == ',')) {
43              break;
44          }
45          ++it;
46      }
47      Span<const char> ret = sp.first(it - sp.begin());
48      sp = sp.subspan(it - sp.begin());
49      return ret;
50  }
51  
52  } // namespace spanparsing