Changeset View
Changeset View
Standalone View
Standalone View
src/util/spanparsing.cpp
- This file was added.
// Copyright (c) 2018 The Bitcoin Core developers | |||||
// Distributed under the MIT software license, see the accompanying | |||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | |||||
#include <util/spanparsing.h> | |||||
#include <span.h> | |||||
#include <string> | |||||
#include <vector> | |||||
namespace spanparsing { | |||||
bool Const(const std::string &str, Span<const char> &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<const char> &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<const char> Expr(Span<const char> &sp) { | |||||
int level = 0; | |||||
auto it = sp.begin(); | |||||
while (it != sp.end()) { | |||||
if (*it == '(') { | |||||
++level; | |||||
} else if (level && *it == ')') { | |||||
--level; | |||||
} else if (level == 0 && (*it == ')' || *it == ',')) { | |||||
break; | |||||
} | |||||
++it; | |||||
} | |||||
Span<const char> ret = sp.first(it - sp.begin()); | |||||
sp = sp.subspan(it - sp.begin()); | |||||
return ret; | |||||
} | |||||
std::vector<Span<const char>> Split(const Span<const char> &sp, char sep) { | |||||
std::vector<Span<const char>> 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 |