mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #14499 from ethereum/purge-using-namespace-std-from-libsolutil
Purge using namespace std from libsolutil
This commit is contained in:
commit
d2f86ffb16
@ -29,7 +29,6 @@
|
|||||||
|
|
||||||
#include <boost/algorithm/string.hpp>
|
#include <boost/algorithm/string.hpp>
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace solidity;
|
using namespace solidity;
|
||||||
using namespace solidity::util;
|
using namespace solidity::util;
|
||||||
|
|
||||||
@ -41,7 +40,7 @@ static char const* lowerHexChars = "0123456789abcdef";
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
string solidity::util::toHex(uint8_t _data, HexCase _case)
|
std::string solidity::util::toHex(uint8_t _data, HexCase _case)
|
||||||
{
|
{
|
||||||
assertThrow(_case != HexCase::Mixed, BadHexCase, "Mixed case can only be used for byte arrays.");
|
assertThrow(_case != HexCase::Mixed, BadHexCase, "Mixed case can only be used for byte arrays.");
|
||||||
|
|
||||||
@ -53,7 +52,7 @@ string solidity::util::toHex(uint8_t _data, HexCase _case)
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
string solidity::util::toHex(bytes const& _data, HexPrefix _prefix, HexCase _case)
|
std::string solidity::util::toHex(bytes const& _data, HexPrefix _prefix, HexCase _case)
|
||||||
{
|
{
|
||||||
std::string ret(_data.size() * 2 + (_prefix == HexPrefix::Add ? 2 : 0), 0);
|
std::string ret(_data.size() * 2 + (_prefix == HexPrefix::Add ? 2 : 0), 0);
|
||||||
|
|
||||||
@ -90,7 +89,7 @@ int solidity::util::fromHex(char _i, WhenError _throw)
|
|||||||
if (_i >= 'A' && _i <= 'F')
|
if (_i >= 'A' && _i <= 'F')
|
||||||
return _i - 'A' + 10;
|
return _i - 'A' + 10;
|
||||||
if (_throw == WhenError::Throw)
|
if (_throw == WhenError::Throw)
|
||||||
assertThrow(false, BadHexCharacter, to_string(_i));
|
assertThrow(false, BadHexCharacter, std::to_string(_i));
|
||||||
else
|
else
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -125,31 +124,31 @@ bytes solidity::util::fromHex(std::string const& _s, WhenError _throw)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool solidity::util::passesAddressChecksum(string const& _str, bool _strict)
|
bool solidity::util::passesAddressChecksum(std::string const& _str, bool _strict)
|
||||||
{
|
{
|
||||||
string s = _str.substr(0, 2) == "0x" ? _str : "0x" + _str;
|
std::string s = _str.substr(0, 2) == "0x" ? _str : "0x" + _str;
|
||||||
|
|
||||||
if (s.length() != 42)
|
if (s.length() != 42)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!_strict && (
|
if (!_strict && (
|
||||||
s.find_first_of("abcdef") == string::npos ||
|
s.find_first_of("abcdef") == std::string::npos ||
|
||||||
s.find_first_of("ABCDEF") == string::npos
|
s.find_first_of("ABCDEF") == std::string::npos
|
||||||
))
|
))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return s == solidity::util::getChecksummedAddress(s);
|
return s == solidity::util::getChecksummedAddress(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
string solidity::util::getChecksummedAddress(string const& _addr)
|
std::string solidity::util::getChecksummedAddress(std::string const& _addr)
|
||||||
{
|
{
|
||||||
string s = _addr.substr(0, 2) == "0x" ? _addr.substr(2) : _addr;
|
std::string s = _addr.substr(0, 2) == "0x" ? _addr.substr(2) : _addr;
|
||||||
assertThrow(s.length() == 40, InvalidAddress, "");
|
assertThrow(s.length() == 40, InvalidAddress, "");
|
||||||
assertThrow(s.find_first_not_of("0123456789abcdefABCDEF") == string::npos, InvalidAddress, "");
|
assertThrow(s.find_first_not_of("0123456789abcdefABCDEF") == std::string::npos, InvalidAddress, "");
|
||||||
|
|
||||||
h256 hash = keccak256(boost::algorithm::to_lower_copy(s, std::locale::classic()));
|
h256 hash = keccak256(boost::algorithm::to_lower_copy(s, std::locale::classic()));
|
||||||
|
|
||||||
string ret = "0x";
|
std::string ret = "0x";
|
||||||
for (unsigned i = 0; i < 40; ++i)
|
for (unsigned i = 0; i < 40; ++i)
|
||||||
{
|
{
|
||||||
char addressCharacter = s[i];
|
char addressCharacter = s[i];
|
||||||
@ -162,16 +161,16 @@ string solidity::util::getChecksummedAddress(string const& _addr)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool solidity::util::isValidHex(string const& _string)
|
bool solidity::util::isValidHex(std::string const& _string)
|
||||||
{
|
{
|
||||||
if (_string.substr(0, 2) != "0x")
|
if (_string.substr(0, 2) != "0x")
|
||||||
return false;
|
return false;
|
||||||
if (_string.find_first_not_of("0123456789abcdefABCDEF", 2) != string::npos)
|
if (_string.find_first_not_of("0123456789abcdefABCDEF", 2) != std::string::npos)
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool solidity::util::isValidDecimal(string const& _string)
|
bool solidity::util::isValidDecimal(std::string const& _string)
|
||||||
{
|
{
|
||||||
if (_string.empty())
|
if (_string.empty())
|
||||||
return false;
|
return false;
|
||||||
@ -180,12 +179,12 @@ bool solidity::util::isValidDecimal(string const& _string)
|
|||||||
// No leading zeros
|
// No leading zeros
|
||||||
if (_string.front() == '0')
|
if (_string.front() == '0')
|
||||||
return false;
|
return false;
|
||||||
if (_string.find_first_not_of("0123456789") != string::npos)
|
if (_string.find_first_not_of("0123456789") != std::string::npos)
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
string solidity::util::formatAsStringOrNumber(string const& _value)
|
std::string solidity::util::formatAsStringOrNumber(std::string const& _value)
|
||||||
{
|
{
|
||||||
assertThrow(_value.length() <= 32, StringTooLong, "String to be formatted longer than 32 bytes.");
|
assertThrow(_value.length() <= 32, StringTooLong, "String to be formatted longer than 32 bytes.");
|
||||||
|
|
||||||
@ -197,9 +196,9 @@ string solidity::util::formatAsStringOrNumber(string const& _value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
string solidity::util::escapeAndQuoteString(string const& _input)
|
std::string solidity::util::escapeAndQuoteString(std::string const& _input)
|
||||||
{
|
{
|
||||||
string out;
|
std::string out;
|
||||||
|
|
||||||
for (char c: _input)
|
for (char c: _input)
|
||||||
if (c == '\\')
|
if (c == '\\')
|
||||||
@ -214,8 +213,8 @@ string solidity::util::escapeAndQuoteString(string const& _input)
|
|||||||
out += "\\t";
|
out += "\\t";
|
||||||
else if (!isPrint(c))
|
else if (!isPrint(c))
|
||||||
{
|
{
|
||||||
ostringstream o;
|
std::ostringstream o;
|
||||||
o << "\\x" << std::hex << setfill('0') << setw(2) << (unsigned)(unsigned char)(c);
|
o << "\\x" << std::hex << std::setfill('0') << std::setw(2) << (unsigned)(unsigned char)(c);
|
||||||
out += o.str();
|
out += o.str();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -31,7 +31,6 @@
|
|||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace solidity::util;
|
using namespace solidity::util;
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
@ -55,35 +54,35 @@ inline T readFile(boost::filesystem::path const& _file)
|
|||||||
|
|
||||||
// get length of file:
|
// get length of file:
|
||||||
is.seekg(0, is.end);
|
is.seekg(0, is.end);
|
||||||
streamoff length = is.tellg();
|
std::streamoff length = is.tellg();
|
||||||
if (length == 0)
|
if (length == 0)
|
||||||
return ret; // do not read empty file (MSVC does not like it)
|
return ret; // do not read empty file (MSVC does not like it)
|
||||||
is.seekg(0, is.beg);
|
is.seekg(0, is.beg);
|
||||||
|
|
||||||
ret.resize((static_cast<size_t>(length) + c_elementSize - 1) / c_elementSize);
|
ret.resize((static_cast<size_t>(length) + c_elementSize - 1) / c_elementSize);
|
||||||
is.read(const_cast<char*>(reinterpret_cast<char const*>(ret.data())), static_cast<streamsize>(length));
|
is.read(const_cast<char*>(reinterpret_cast<char const*>(ret.data())), static_cast<std::streamsize>(length));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
string solidity::util::readFileAsString(boost::filesystem::path const& _file)
|
std::string solidity::util::readFileAsString(boost::filesystem::path const& _file)
|
||||||
{
|
{
|
||||||
return readFile<string>(_file);
|
return readFile<std::string>(_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
string solidity::util::readUntilEnd(istream& _stdin)
|
std::string solidity::util::readUntilEnd(std::istream& _stdin)
|
||||||
{
|
{
|
||||||
ostringstream ss;
|
std::ostringstream ss;
|
||||||
ss << _stdin.rdbuf();
|
ss << _stdin.rdbuf();
|
||||||
return ss.str();
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
string solidity::util::readBytes(istream& _input, size_t _length)
|
std::string solidity::util::readBytes(std::istream& _input, size_t _length)
|
||||||
{
|
{
|
||||||
string output;
|
std::string output;
|
||||||
output.resize(_length);
|
output.resize(_length);
|
||||||
_input.read(output.data(), static_cast<streamsize>(_length));
|
_input.read(output.data(), static_cast<std::streamsize>(_length));
|
||||||
// If read() reads fewer bytes it sets failbit in addition to eofbit.
|
// If read() reads fewer bytes it sets failbit in addition to eofbit.
|
||||||
if (_input.fail())
|
if (_input.fail())
|
||||||
output.resize(static_cast<size_t>(_input.gcount()));
|
output.resize(static_cast<size_t>(_input.gcount()));
|
||||||
@ -135,10 +134,10 @@ private:
|
|||||||
int solidity::util::readStandardInputChar()
|
int solidity::util::readStandardInputChar()
|
||||||
{
|
{
|
||||||
DisableConsoleBuffering disableConsoleBuffering;
|
DisableConsoleBuffering disableConsoleBuffering;
|
||||||
return cin.get();
|
return std::cin.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
string solidity::util::absolutePath(string const& _path, string const& _reference)
|
std::string solidity::util::absolutePath(std::string const& _path, std::string const& _reference)
|
||||||
{
|
{
|
||||||
boost::filesystem::path p(_path);
|
boost::filesystem::path p(_path);
|
||||||
// Anything that does not start with `.` is an absolute path.
|
// Anything that does not start with `.` is an absolute path.
|
||||||
@ -158,6 +157,6 @@ string solidity::util::absolutePath(string const& _path, string const& _referenc
|
|||||||
return result.generic_string();
|
return result.generic_string();
|
||||||
}
|
}
|
||||||
|
|
||||||
string solidity::util::sanitizePath(string const& _path) {
|
std::string solidity::util::sanitizePath(std::string const& _path) {
|
||||||
return boost::filesystem::path(_path).generic_string();
|
return boost::filesystem::path(_path).generic_string();
|
||||||
}
|
}
|
||||||
|
@ -18,13 +18,12 @@
|
|||||||
|
|
||||||
#include <libsolutil/Exceptions.h>
|
#include <libsolutil/Exceptions.h>
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace solidity::util;
|
using namespace solidity::util;
|
||||||
|
|
||||||
char const* Exception::what() const noexcept
|
char const* Exception::what() const noexcept
|
||||||
{
|
{
|
||||||
// Return the comment if available.
|
// Return the comment if available.
|
||||||
if (string const* cmt = comment())
|
if (std::string const* cmt = comment())
|
||||||
return cmt->data();
|
return cmt->data();
|
||||||
|
|
||||||
// Fallback to base what().
|
// Fallback to base what().
|
||||||
@ -33,20 +32,20 @@ char const* Exception::what() const noexcept
|
|||||||
return std::exception::what();
|
return std::exception::what();
|
||||||
}
|
}
|
||||||
|
|
||||||
string Exception::lineInfo() const
|
std::string Exception::lineInfo() const
|
||||||
{
|
{
|
||||||
char const* const* file = boost::get_error_info<boost::throw_file>(*this);
|
char const* const* file = boost::get_error_info<boost::throw_file>(*this);
|
||||||
int const* line = boost::get_error_info<boost::throw_line>(*this);
|
int const* line = boost::get_error_info<boost::throw_line>(*this);
|
||||||
string ret;
|
std::string ret;
|
||||||
if (file)
|
if (file)
|
||||||
ret += *file;
|
ret += *file;
|
||||||
ret += ':';
|
ret += ':';
|
||||||
if (line)
|
if (line)
|
||||||
ret += to_string(*line);
|
ret += std::to_string(*line);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
string const* Exception::comment() const noexcept
|
std::string const* Exception::comment() const noexcept
|
||||||
{
|
{
|
||||||
return boost::get_error_info<errinfo_comment>(*this);
|
return boost::get_error_info<errinfo_comment>(*this);
|
||||||
}
|
}
|
||||||
|
@ -23,21 +23,20 @@
|
|||||||
#include <libsolutil/IndentedWriter.h>
|
#include <libsolutil/IndentedWriter.h>
|
||||||
#include <libsolutil/Assertions.h>
|
#include <libsolutil/Assertions.h>
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace solidity::util;
|
using namespace solidity::util;
|
||||||
|
|
||||||
string IndentedWriter::format() const
|
std::string IndentedWriter::format() const
|
||||||
{
|
{
|
||||||
string result;
|
std::string result;
|
||||||
for (auto const& line: m_lines)
|
for (auto const& line: m_lines)
|
||||||
result += string(line.indentation * 4, ' ') + line.contents + "\n";
|
result += std::string(line.indentation * 4, ' ') + line.contents + "\n";
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IndentedWriter::newLine()
|
void IndentedWriter::newLine()
|
||||||
{
|
{
|
||||||
if (!m_lines.back().contents.empty())
|
if (!m_lines.back().contents.empty())
|
||||||
m_lines.emplace_back(Line{string(), m_lines.back().indentation});
|
m_lines.emplace_back(Line{std::string(), m_lines.back().indentation});
|
||||||
}
|
}
|
||||||
|
|
||||||
void IndentedWriter::indent()
|
void IndentedWriter::indent()
|
||||||
@ -53,12 +52,12 @@ void IndentedWriter::unindent()
|
|||||||
m_lines.back().indentation--;
|
m_lines.back().indentation--;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IndentedWriter::add(string const& _str)
|
void IndentedWriter::add(std::string const& _str)
|
||||||
{
|
{
|
||||||
m_lines.back().contents += _str;
|
m_lines.back().contents += _str;
|
||||||
}
|
}
|
||||||
|
|
||||||
void IndentedWriter::addLine(string const& _line)
|
void IndentedWriter::addLine(std::string const& _line)
|
||||||
{
|
{
|
||||||
newLine();
|
newLine();
|
||||||
add(_line);
|
add(_line);
|
||||||
|
@ -23,7 +23,6 @@
|
|||||||
#include <libsolutil/CommonData.h>
|
#include <libsolutil/CommonData.h>
|
||||||
#include <libsolutil/Numeric.h>
|
#include <libsolutil/Numeric.h>
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace solidity;
|
using namespace solidity;
|
||||||
using namespace solidity::util;
|
using namespace solidity::util;
|
||||||
|
|
||||||
@ -56,11 +55,11 @@ bytes encodeLinkData(bytes const& _data)
|
|||||||
return bytes{0x12} + varintEncoding(_data.size()) + _data;
|
return bytes{0x12} + varintEncoding(_data.size()) + _data;
|
||||||
}
|
}
|
||||||
|
|
||||||
string base58Encode(bytes const& _data)
|
std::string base58Encode(bytes const& _data)
|
||||||
{
|
{
|
||||||
static string const alphabet{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"};
|
static std::string const alphabet{"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"};
|
||||||
bigint data(util::toHex(_data, HexPrefix::Add));
|
bigint data(util::toHex(_data, HexPrefix::Add));
|
||||||
string output;
|
std::string output;
|
||||||
while (data)
|
while (data)
|
||||||
{
|
{
|
||||||
output += alphabet[static_cast<size_t>(data % alphabet.size())];
|
output += alphabet[static_cast<size_t>(data % alphabet.size())];
|
||||||
@ -84,7 +83,7 @@ struct Chunk
|
|||||||
size_t blockSize = 0;
|
size_t blockSize = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
using Chunks = vector<Chunk>;
|
using Chunks = std::vector<Chunk>;
|
||||||
|
|
||||||
Chunk combineLinks(Chunks& _links)
|
Chunk combineLinks(Chunks& _links)
|
||||||
{
|
{
|
||||||
@ -153,7 +152,7 @@ bytes groupChunksBottomUp(Chunks _currentLevel)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bytes solidity::util::ipfsHash(string _data)
|
bytes solidity::util::ipfsHash(std::string _data)
|
||||||
{
|
{
|
||||||
size_t const maxChunkSize = 1024 * 256;
|
size_t const maxChunkSize = 1024 * 256;
|
||||||
size_t chunkCount = _data.length() / maxChunkSize + (_data.length() % maxChunkSize > 0 ? 1 : 0);
|
size_t chunkCount = _data.length() / maxChunkSize + (_data.length() % maxChunkSize > 0 ? 1 : 0);
|
||||||
@ -164,7 +163,7 @@ bytes solidity::util::ipfsHash(string _data)
|
|||||||
for (size_t chunkIndex = 0; chunkIndex < chunkCount; chunkIndex++)
|
for (size_t chunkIndex = 0; chunkIndex < chunkCount; chunkIndex++)
|
||||||
{
|
{
|
||||||
bytes chunkBytes = asBytes(
|
bytes chunkBytes = asBytes(
|
||||||
_data.substr(chunkIndex * maxChunkSize, min(maxChunkSize, _data.length() - chunkIndex * maxChunkSize))
|
_data.substr(chunkIndex * maxChunkSize, std::min(maxChunkSize, _data.length() - chunkIndex * maxChunkSize))
|
||||||
);
|
);
|
||||||
|
|
||||||
bytes lengthAsVarint = varintEncoding(chunkBytes.size());
|
bytes lengthAsVarint = varintEncoding(chunkBytes.size());
|
||||||
@ -197,7 +196,7 @@ bytes solidity::util::ipfsHash(string _data)
|
|||||||
return groupChunksBottomUp(std::move(allChunks));
|
return groupChunksBottomUp(std::move(allChunks));
|
||||||
}
|
}
|
||||||
|
|
||||||
string solidity::util::ipfsHashBase58(string _data)
|
std::string solidity::util::ipfsHashBase58(std::string _data)
|
||||||
{
|
{
|
||||||
return base58Encode(ipfsHash(std::move(_data)));
|
return base58Encode(ipfsHash(std::move(_data)));
|
||||||
}
|
}
|
||||||
|
@ -30,8 +30,6 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
static_assert(
|
static_assert(
|
||||||
(JSONCPP_VERSION_MAJOR == 1) && (JSONCPP_VERSION_MINOR == 9) && (JSONCPP_VERSION_PATCH == 3),
|
(JSONCPP_VERSION_MAJOR == 1) && (JSONCPP_VERSION_MINOR == 9) && (JSONCPP_VERSION_PATCH == 3),
|
||||||
"Unexpected jsoncpp version: " JSONCPP_VERSION_STRING ". Expecting 1.9.3."
|
"Unexpected jsoncpp version: " JSONCPP_VERSION_STRING ". Expecting 1.9.3."
|
||||||
@ -47,7 +45,7 @@ namespace
|
|||||||
class StreamWriterBuilder: public Json::StreamWriterBuilder
|
class StreamWriterBuilder: public Json::StreamWriterBuilder
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit StreamWriterBuilder(map<string, Json::Value> const& _settings)
|
explicit StreamWriterBuilder(std::map<std::string, Json::Value> const& _settings)
|
||||||
{
|
{
|
||||||
for (auto const& iter: _settings)
|
for (auto const& iter: _settings)
|
||||||
this->settings_[iter.first] = iter.second;
|
this->settings_[iter.first] = iter.second;
|
||||||
@ -68,10 +66,10 @@ public:
|
|||||||
/// \param _input JSON input string
|
/// \param _input JSON input string
|
||||||
/// \param _builder StreamWriterBuilder that is used to create new Json::StreamWriter
|
/// \param _builder StreamWriterBuilder that is used to create new Json::StreamWriter
|
||||||
/// \return serialized json object
|
/// \return serialized json object
|
||||||
string print(Json::Value const& _input, Json::StreamWriterBuilder const& _builder)
|
std::string print(Json::Value const& _input, Json::StreamWriterBuilder const& _builder)
|
||||||
{
|
{
|
||||||
stringstream stream;
|
std::stringstream stream;
|
||||||
unique_ptr<Json::StreamWriter> writer(_builder.newStreamWriter());
|
std::unique_ptr<Json::StreamWriter> writer(_builder.newStreamWriter());
|
||||||
writer->write(_input, &stream);
|
writer->write(_input, &stream);
|
||||||
return stream.str();
|
return stream.str();
|
||||||
}
|
}
|
||||||
@ -82,9 +80,9 @@ string print(Json::Value const& _input, Json::StreamWriterBuilder const& _builde
|
|||||||
/// \param _json [out] resulting JSON object
|
/// \param _json [out] resulting JSON object
|
||||||
/// \param _errs [out] Formatted error messages
|
/// \param _errs [out] Formatted error messages
|
||||||
/// \return \c true if the document was successfully parsed, \c false if an error occurred.
|
/// \return \c true if the document was successfully parsed, \c false if an error occurred.
|
||||||
bool parse(Json::CharReaderBuilder& _builder, string const& _input, Json::Value& _json, string* _errs)
|
bool parse(Json::CharReaderBuilder& _builder, std::string const& _input, Json::Value& _json, std::string* _errs)
|
||||||
{
|
{
|
||||||
unique_ptr<Json::CharReader> reader(_builder.newCharReader());
|
std::unique_ptr<Json::CharReader> reader(_builder.newCharReader());
|
||||||
return reader->parse(_input.c_str(), _input.c_str() + _input.length(), &_json, _errs);
|
return reader->parse(_input.c_str(), _input.c_str() + _input.length(), &_json, _errs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,34 +111,34 @@ Json::Value removeNullMembers(Json::Value _json)
|
|||||||
return _json;
|
return _json;
|
||||||
}
|
}
|
||||||
|
|
||||||
string jsonPrettyPrint(Json::Value const& _input)
|
std::string jsonPrettyPrint(Json::Value const& _input)
|
||||||
{
|
{
|
||||||
return jsonPrint(_input, JsonFormat{ JsonFormat::Pretty });
|
return jsonPrint(_input, JsonFormat{ JsonFormat::Pretty });
|
||||||
}
|
}
|
||||||
|
|
||||||
string jsonCompactPrint(Json::Value const& _input)
|
std::string jsonCompactPrint(Json::Value const& _input)
|
||||||
{
|
{
|
||||||
return jsonPrint(_input, JsonFormat{ JsonFormat::Compact });
|
return jsonPrint(_input, JsonFormat{ JsonFormat::Compact });
|
||||||
}
|
}
|
||||||
|
|
||||||
string jsonPrint(Json::Value const& _input, JsonFormat const& _format)
|
std::string jsonPrint(Json::Value const& _input, JsonFormat const& _format)
|
||||||
{
|
{
|
||||||
map<string, Json::Value> settings;
|
std::map<std::string, Json::Value> settings;
|
||||||
if (_format.format == JsonFormat::Pretty)
|
if (_format.format == JsonFormat::Pretty)
|
||||||
{
|
{
|
||||||
settings["indentation"] = string(_format.indent, ' ');
|
settings["indentation"] = std::string(_format.indent, ' ');
|
||||||
settings["enableYAMLCompatibility"] = true;
|
settings["enableYAMLCompatibility"] = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
settings["indentation"] = "";
|
settings["indentation"] = "";
|
||||||
StreamWriterBuilder writerBuilder(settings);
|
StreamWriterBuilder writerBuilder(settings);
|
||||||
string result = print(_input, writerBuilder);
|
std::string result = print(_input, writerBuilder);
|
||||||
if (_format.format == JsonFormat::Pretty)
|
if (_format.format == JsonFormat::Pretty)
|
||||||
boost::replace_all(result, " \n", "\n");
|
boost::replace_all(result, " \n", "\n");
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool jsonParseStrict(string const& _input, Json::Value& _json, string* _errs /* = nullptr */)
|
bool jsonParseStrict(std::string const& _input, Json::Value& _json, std::string* _errs /* = nullptr */)
|
||||||
{
|
{
|
||||||
static StrictModeCharReaderBuilder readerBuilder;
|
static StrictModeCharReaderBuilder readerBuilder;
|
||||||
return parse(readerBuilder, _input, _json, _errs);
|
return parse(readerBuilder, _input, _json, _errs);
|
||||||
|
@ -25,8 +25,6 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
|
|
||||||
namespace solidity::util
|
namespace solidity::util
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -26,11 +26,10 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace solidity;
|
using namespace solidity;
|
||||||
using namespace solidity::util;
|
using namespace solidity::util;
|
||||||
|
|
||||||
bool solidity::util::stringWithinDistance(string const& _str1, string const& _str2, size_t _maxDistance, size_t _lenThreshold)
|
bool solidity::util::stringWithinDistance(std::string const& _str1, std::string const& _str2, size_t _maxDistance, size_t _lenThreshold)
|
||||||
{
|
{
|
||||||
if (_str1 == _str2)
|
if (_str1 == _str2)
|
||||||
return true;
|
return true;
|
||||||
@ -47,13 +46,13 @@ bool solidity::util::stringWithinDistance(string const& _str1, string const& _st
|
|||||||
return distance <= _maxDistance && distance < n1 && distance < n2;
|
return distance <= _maxDistance && distance < n1 && distance < n2;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t solidity::util::stringDistance(string const& _str1, string const& _str2)
|
size_t solidity::util::stringDistance(std::string const& _str1, std::string const& _str2)
|
||||||
{
|
{
|
||||||
size_t n1 = _str1.size();
|
size_t n1 = _str1.size();
|
||||||
size_t n2 = _str2.size();
|
size_t n2 = _str2.size();
|
||||||
// Optimize by storing only last 2 rows and current row. So first index is considered modulo 3
|
// Optimize by storing only last 2 rows and current row. So first index is considered modulo 3
|
||||||
// This is a two-dimensional array of size 3 x (n2 + 1).
|
// This is a two-dimensional array of size 3 x (n2 + 1).
|
||||||
vector<size_t> dp(3 * (n2 + 1));
|
std::vector<size_t> dp(3 * (n2 + 1));
|
||||||
|
|
||||||
// In this dp formulation of Damerau–Levenshtein distance we are assuming that the strings are 1-based to make base case storage easier.
|
// In this dp formulation of Damerau–Levenshtein distance we are assuming that the strings are 1-based to make base case storage easier.
|
||||||
// So index accesser to _name1 and _name2 have to be adjusted accordingly
|
// So index accesser to _name1 and _name2 have to be adjusted accordingly
|
||||||
@ -61,25 +60,25 @@ size_t solidity::util::stringDistance(string const& _str1, string const& _str2)
|
|||||||
for (size_t i2 = 0; i2 <= n2; ++i2)
|
for (size_t i2 = 0; i2 <= n2; ++i2)
|
||||||
{
|
{
|
||||||
size_t x = 0;
|
size_t x = 0;
|
||||||
if (min(i1, i2) == 0) // base case
|
if (std::min(i1, i2) == 0) // base case
|
||||||
x = max(i1, i2);
|
x = std::max(i1, i2);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
size_t left = dp[(i1 - 1) % 3 + i2 * 3];
|
size_t left = dp[(i1 - 1) % 3 + i2 * 3];
|
||||||
size_t up = dp[(i1 % 3) + (i2 - 1) * 3];
|
size_t up = dp[(i1 % 3) + (i2 - 1) * 3];
|
||||||
size_t upleft = dp[((i1 - 1) % 3) + (i2 - 1) * 3];
|
size_t upleft = dp[((i1 - 1) % 3) + (i2 - 1) * 3];
|
||||||
// deletion and insertion
|
// deletion and insertion
|
||||||
x = min(left + 1, up + 1);
|
x = std::min(left + 1, up + 1);
|
||||||
if (_str1[i1-1] == _str2[i2-1])
|
if (_str1[i1-1] == _str2[i2-1])
|
||||||
// same chars, can skip
|
// same chars, can skip
|
||||||
x = min(x, upleft);
|
x = std::min(x, upleft);
|
||||||
else
|
else
|
||||||
// different chars so try substitution
|
// different chars so try substitution
|
||||||
x = min(x, upleft + 1);
|
x = std::min(x, upleft + 1);
|
||||||
|
|
||||||
// transposing
|
// transposing
|
||||||
if (i1 > 1 && i2 > 1 && _str1[i1 - 1] == _str2[i2 - 2] && _str1[i1 - 2] == _str2[i2 - 1])
|
if (i1 > 1 && i2 > 1 && _str1[i1 - 1] == _str2[i2 - 2] && _str1[i1 - 2] == _str2[i2 - 1])
|
||||||
x = min(x, dp[((i1 - 2) % 3) + (i2 - 2) * 3] + 1);
|
x = std::min(x, dp[((i1 - 2) % 3) + (i2 - 2) * 3] + 1);
|
||||||
}
|
}
|
||||||
dp[(i1 % 3) + i2 * 3] = x;
|
dp[(i1 % 3) + i2 * 3] = x;
|
||||||
}
|
}
|
||||||
@ -87,9 +86,9 @@ size_t solidity::util::stringDistance(string const& _str1, string const& _str2)
|
|||||||
return dp[(n1 % 3) + n2 * 3];
|
return dp[(n1 % 3) + n2 * 3];
|
||||||
}
|
}
|
||||||
|
|
||||||
string solidity::util::quotedAlternativesList(vector<string> const& suggestions)
|
std::string solidity::util::quotedAlternativesList(std::vector<std::string> const& suggestions)
|
||||||
{
|
{
|
||||||
vector<string> quotedSuggestions;
|
std::vector<std::string> quotedSuggestions;
|
||||||
|
|
||||||
for (auto& suggestion: suggestions)
|
for (auto& suggestion: suggestions)
|
||||||
quotedSuggestions.emplace_back("\"" + suggestion + "\"");
|
quotedSuggestions.emplace_back("\"" + suggestion + "\"");
|
||||||
@ -97,20 +96,20 @@ string solidity::util::quotedAlternativesList(vector<string> const& suggestions)
|
|||||||
return joinHumanReadable(quotedSuggestions, ", ", " or ");
|
return joinHumanReadable(quotedSuggestions, ", ", " or ");
|
||||||
}
|
}
|
||||||
|
|
||||||
string solidity::util::suffixedVariableNameList(string const& _baseName, size_t _startSuffix, size_t _endSuffix)
|
std::string solidity::util::suffixedVariableNameList(std::string const& _baseName, size_t _startSuffix, size_t _endSuffix)
|
||||||
{
|
{
|
||||||
string result;
|
std::string result;
|
||||||
if (_startSuffix < _endSuffix)
|
if (_startSuffix < _endSuffix)
|
||||||
{
|
{
|
||||||
result = _baseName + to_string(_startSuffix++);
|
result = _baseName + std::to_string(_startSuffix++);
|
||||||
while (_startSuffix < _endSuffix)
|
while (_startSuffix < _endSuffix)
|
||||||
result += ", " + _baseName + to_string(_startSuffix++);
|
result += ", " + _baseName + std::to_string(_startSuffix++);
|
||||||
}
|
}
|
||||||
else if (_endSuffix < _startSuffix)
|
else if (_endSuffix < _startSuffix)
|
||||||
{
|
{
|
||||||
result = _baseName + to_string(_endSuffix++);
|
result = _baseName + std::to_string(_endSuffix++);
|
||||||
while (_endSuffix < _startSuffix)
|
while (_endSuffix < _startSuffix)
|
||||||
result = _baseName + to_string(_endSuffix++) + ", " + result;
|
result = _baseName + std::to_string(_endSuffix++) + ", " + result;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -119,7 +118,7 @@ namespace
|
|||||||
{
|
{
|
||||||
|
|
||||||
/// Try to format as N * 2**x
|
/// Try to format as N * 2**x
|
||||||
optional<string> tryFormatPowerOfTwo(bigint const& _value)
|
std::optional<std::string> tryFormatPowerOfTwo(bigint const& _value)
|
||||||
{
|
{
|
||||||
bigint prefix = _value;
|
bigint prefix = _value;
|
||||||
|
|
||||||
@ -128,7 +127,7 @@ optional<string> tryFormatPowerOfTwo(bigint const& _value)
|
|||||||
for (; (prefix & 0xff) == 0; prefix >>= 8)
|
for (; (prefix & 0xff) == 0; prefix >>= 8)
|
||||||
++i;
|
++i;
|
||||||
if (i <= 2)
|
if (i <= 2)
|
||||||
return nullopt;
|
return std::nullopt;
|
||||||
|
|
||||||
// 0x100 yields 2**8 (N is 1 and redundant)
|
// 0x100 yields 2**8 (N is 1 and redundant)
|
||||||
if (prefix == 1)
|
if (prefix == 1)
|
||||||
@ -150,11 +149,11 @@ optional<string> tryFormatPowerOfTwo(bigint const& _value)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
string solidity::util::formatNumberReadable(bigint const& _value, bool _useTruncation)
|
std::string solidity::util::formatNumberReadable(bigint const& _value, bool _useTruncation)
|
||||||
{
|
{
|
||||||
bool const isNegative = _value < 0;
|
bool const isNegative = _value < 0;
|
||||||
bigint const absValue = isNegative ? (bigint(-1) * _value) : bigint(_value);
|
bigint const absValue = isNegative ? (bigint(-1) * _value) : bigint(_value);
|
||||||
string const sign = isNegative ? "-" : "";
|
std::string const sign = isNegative ? "-" : "";
|
||||||
|
|
||||||
// smaller numbers return as decimal
|
// smaller numbers return as decimal
|
||||||
if (absValue <= 0x1000000)
|
if (absValue <= 0x1000000)
|
||||||
@ -165,7 +164,7 @@ string solidity::util::formatNumberReadable(bigint const& _value, bool _useTrunc
|
|||||||
else if (auto result = tryFormatPowerOfTwo(absValue + 1))
|
else if (auto result = tryFormatPowerOfTwo(absValue + 1))
|
||||||
return {sign + *result + (isNegative ? " + 1" : " - 1")};
|
return {sign + *result + (isNegative ? " + 1" : " - 1")};
|
||||||
|
|
||||||
string str = toHex(toCompactBigEndian(absValue), HexPrefix::Add, HexCase::Mixed);
|
std::string str = toHex(toCompactBigEndian(absValue), HexPrefix::Add, HexCase::Mixed);
|
||||||
|
|
||||||
if (_useTruncation)
|
if (_useTruncation)
|
||||||
{
|
{
|
||||||
|
@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#include <libsolutil/Keccak256.h>
|
#include <libsolutil/Keccak256.h>
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace solidity;
|
using namespace solidity;
|
||||||
using namespace solidity::util;
|
using namespace solidity::util;
|
||||||
|
|
||||||
@ -42,7 +41,7 @@ h256 swarmHashSimple(bytesConstRef _data, size_t _size)
|
|||||||
return keccak256(toLittleEndian(_size) + _data.toBytes());
|
return keccak256(toLittleEndian(_size) + _data.toBytes());
|
||||||
}
|
}
|
||||||
|
|
||||||
h256 swarmHashIntermediate(string const& _input, size_t _offset, size_t _length)
|
h256 swarmHashIntermediate(std::string const& _input, size_t _offset, size_t _length)
|
||||||
{
|
{
|
||||||
bytesConstRef ref;
|
bytesConstRef ref;
|
||||||
bytes innerNodes;
|
bytes innerNodes;
|
||||||
@ -104,7 +103,7 @@ h256 chunkHash(bytesConstRef const _data, bool _forceHigherLevel = false)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
h256 solidity::util::bzzr0Hash(string const& _input)
|
h256 solidity::util::bzzr0Hash(std::string const& _input)
|
||||||
{
|
{
|
||||||
return swarmHashIntermediate(_input, 0, _input.size());
|
return swarmHashIntermediate(_input, 0, _input.size());
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,6 @@
|
|||||||
#include <regex>
|
#include <regex>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace solidity;
|
using namespace solidity;
|
||||||
using namespace solidity::util;
|
using namespace solidity::util;
|
||||||
|
|
||||||
@ -42,8 +41,8 @@ TemporaryDirectory::TemporaryDirectory(std::string const& _prefix):
|
|||||||
}
|
}
|
||||||
|
|
||||||
TemporaryDirectory::TemporaryDirectory(
|
TemporaryDirectory::TemporaryDirectory(
|
||||||
vector<boost::filesystem::path> const& _subdirectories,
|
std::vector<boost::filesystem::path> const& _subdirectories,
|
||||||
string const& _prefix
|
std::string const& _prefix
|
||||||
):
|
):
|
||||||
TemporaryDirectory(_prefix)
|
TemporaryDirectory(_prefix)
|
||||||
{
|
{
|
||||||
@ -71,9 +70,9 @@ TemporaryDirectory::~TemporaryDirectory()
|
|||||||
uintmax_t numRemoved = fs::remove_all(m_path, errorCode);
|
uintmax_t numRemoved = fs::remove_all(m_path, errorCode);
|
||||||
if (errorCode.value() != boost::system::errc::success)
|
if (errorCode.value() != boost::system::errc::success)
|
||||||
{
|
{
|
||||||
cerr << "Failed to completely remove temporary directory '" << m_path << "'. ";
|
std::cerr << "Failed to completely remove temporary directory '" << m_path << "'. ";
|
||||||
cerr << "Only " << numRemoved << " files were actually removed." << endl;
|
std::cerr << "Only " << numRemoved << " files were actually removed." << std::endl;
|
||||||
cerr << "Reason: " << errorCode.message() << endl;
|
std::cerr << "Reason: " << errorCode.message() << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,16 +28,15 @@
|
|||||||
|
|
||||||
#include <regex>
|
#include <regex>
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace solidity::util;
|
using namespace solidity::util;
|
||||||
|
|
||||||
Whiskers::Whiskers(string _template):
|
Whiskers::Whiskers(std::string _template):
|
||||||
m_template(std::move(_template))
|
m_template(std::move(_template))
|
||||||
{
|
{
|
||||||
checkTemplateValid();
|
checkTemplateValid();
|
||||||
}
|
}
|
||||||
|
|
||||||
Whiskers& Whiskers::operator()(string _parameter, string _value)
|
Whiskers& Whiskers::operator()(std::string _parameter, std::string _value)
|
||||||
{
|
{
|
||||||
checkParameterValid(_parameter);
|
checkParameterValid(_parameter);
|
||||||
checkParameterUnknown(_parameter);
|
checkParameterUnknown(_parameter);
|
||||||
@ -46,7 +45,7 @@ Whiskers& Whiskers::operator()(string _parameter, string _value)
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
Whiskers& Whiskers::operator()(string _parameter, bool _value)
|
Whiskers& Whiskers::operator()(std::string _parameter, bool _value)
|
||||||
{
|
{
|
||||||
checkParameterValid(_parameter);
|
checkParameterValid(_parameter);
|
||||||
checkParameterUnknown(_parameter);
|
checkParameterUnknown(_parameter);
|
||||||
@ -56,8 +55,8 @@ Whiskers& Whiskers::operator()(string _parameter, bool _value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Whiskers& Whiskers::operator()(
|
Whiskers& Whiskers::operator()(
|
||||||
string _listParameter,
|
std::string _listParameter,
|
||||||
vector<map<string, string>> _values
|
std::vector<std::map<std::string, std::string>> _values
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
checkParameterValid(_listParameter);
|
checkParameterValid(_listParameter);
|
||||||
@ -70,15 +69,15 @@ Whiskers& Whiskers::operator()(
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
string Whiskers::render() const
|
std::string Whiskers::render() const
|
||||||
{
|
{
|
||||||
return replace(m_template, m_parameters, m_conditions, m_listParameters);
|
return replace(m_template, m_parameters, m_conditions, m_listParameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Whiskers::checkTemplateValid() const
|
void Whiskers::checkTemplateValid() const
|
||||||
{
|
{
|
||||||
regex validTemplate("<[#?!\\/]\\+{0,1}[a-zA-Z0-9_$-]+(?:[^a-zA-Z0-9_$>-]|$)");
|
std::regex validTemplate("<[#?!\\/]\\+{0,1}[a-zA-Z0-9_$-]+(?:[^a-zA-Z0-9_$>-]|$)");
|
||||||
smatch match;
|
std::smatch match;
|
||||||
assertThrow(
|
assertThrow(
|
||||||
!regex_search(m_template, match, validTemplate),
|
!regex_search(m_template, match, validTemplate),
|
||||||
WhiskersError,
|
WhiskersError,
|
||||||
@ -86,9 +85,9 @@ void Whiskers::checkTemplateValid() const
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Whiskers::checkParameterValid(string const& _parameter) const
|
void Whiskers::checkParameterValid(std::string const& _parameter) const
|
||||||
{
|
{
|
||||||
static regex validParam("^" + paramRegex() + "$");
|
static std::regex validParam("^" + paramRegex() + "$");
|
||||||
assertThrow(
|
assertThrow(
|
||||||
regex_match(_parameter, validParam),
|
regex_match(_parameter, validParam),
|
||||||
WhiskersError,
|
WhiskersError,
|
||||||
@ -96,7 +95,7 @@ void Whiskers::checkParameterValid(string const& _parameter) const
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Whiskers::checkParameterUnknown(string const& _parameter) const
|
void Whiskers::checkParameterUnknown(std::string const& _parameter) const
|
||||||
{
|
{
|
||||||
assertThrow(
|
assertThrow(
|
||||||
!m_parameters.count(_parameter),
|
!m_parameters.count(_parameter),
|
||||||
@ -115,13 +114,13 @@ void Whiskers::checkParameterUnknown(string const& _parameter) const
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Whiskers::checkTemplateContainsTags(string const& _parameter, vector<string> const& _prefixes) const
|
void Whiskers::checkTemplateContainsTags(std::string const& _parameter, std::vector<std::string> const& _prefixes) const
|
||||||
{
|
{
|
||||||
for (auto const& prefix: _prefixes)
|
for (auto const& prefix: _prefixes)
|
||||||
{
|
{
|
||||||
string tag{"<" + prefix + _parameter + ">"};
|
std::string tag{"<" + prefix + _parameter + ">"};
|
||||||
assertThrow(
|
assertThrow(
|
||||||
m_template.find(tag) != string::npos,
|
m_template.find(tag) != std::string::npos,
|
||||||
WhiskersError,
|
WhiskersError,
|
||||||
"Tag '" + tag + "' not found in template:\n" + m_template
|
"Tag '" + tag + "' not found in template:\n" + m_template
|
||||||
);
|
);
|
||||||
@ -131,17 +130,17 @@ void Whiskers::checkTemplateContainsTags(string const& _parameter, vector<string
|
|||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
template<class ReplaceCallback>
|
template<class ReplaceCallback>
|
||||||
string regex_replace(
|
std::string regex_replace(
|
||||||
string const& _source,
|
std::string const& _source,
|
||||||
regex const& _pattern,
|
std::regex const& _pattern,
|
||||||
ReplaceCallback _replace,
|
ReplaceCallback _replace,
|
||||||
regex_constants::match_flag_type _flags = regex_constants::match_default
|
std::regex_constants::match_flag_type _flags = std::regex_constants::match_default
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
sregex_iterator curMatch(_source.begin(), _source.end(), _pattern, _flags);
|
std::sregex_iterator curMatch(_source.begin(), _source.end(), _pattern, _flags);
|
||||||
sregex_iterator matchEnd;
|
std::sregex_iterator matchEnd;
|
||||||
string::const_iterator lastMatchedPos(_source.cbegin());
|
std::string::const_iterator lastMatchedPos(_source.cbegin());
|
||||||
string result;
|
std::string result;
|
||||||
while (curMatch != matchEnd)
|
while (curMatch != matchEnd)
|
||||||
{
|
{
|
||||||
result.append(curMatch->prefix().first, curMatch->prefix().second);
|
result.append(curMatch->prefix().first, curMatch->prefix().second);
|
||||||
@ -154,23 +153,23 @@ string regex_replace(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
string Whiskers::replace(
|
std::string Whiskers::replace(
|
||||||
string const& _template,
|
std::string const& _template,
|
||||||
StringMap const& _parameters,
|
StringMap const& _parameters,
|
||||||
map<string, bool> const& _conditions,
|
std::map<std::string, bool> const& _conditions,
|
||||||
map<string, vector<StringMap>> const& _listParameters
|
std::map<std::string, std::vector<StringMap>> const& _listParameters
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
static regex listOrTag(
|
static std::regex listOrTag(
|
||||||
"<(" + paramRegex() + ")>|"
|
"<(" + paramRegex() + ")>|"
|
||||||
"<#(" + paramRegex() + ")>((?:.|\\r|\\n)*?)</\\2>|"
|
"<#(" + paramRegex() + ")>((?:.|\\r|\\n)*?)</\\2>|"
|
||||||
"<\\?(\\+?" + paramRegex() + ")>((?:.|\\r|\\n)*?)(<!\\4>((?:.|\\r|\\n)*?))?</\\4>"
|
"<\\?(\\+?" + paramRegex() + ")>((?:.|\\r|\\n)*?)(<!\\4>((?:.|\\r|\\n)*?))?</\\4>"
|
||||||
);
|
);
|
||||||
return regex_replace(_template, listOrTag, [&](match_results<string::const_iterator> _match) -> string
|
return regex_replace(_template, listOrTag, [&](std::match_results<std::string::const_iterator> _match) -> std::string
|
||||||
{
|
{
|
||||||
string tagName(_match[1]);
|
std::string tagName(_match[1]);
|
||||||
string listName(_match[2]);
|
std::string listName(_match[2]);
|
||||||
string conditionName(_match[4]);
|
std::string conditionName(_match[4]);
|
||||||
if (!tagName.empty())
|
if (!tagName.empty())
|
||||||
{
|
{
|
||||||
assertThrow(
|
assertThrow(
|
||||||
@ -184,12 +183,12 @@ string Whiskers::replace(
|
|||||||
}
|
}
|
||||||
else if (!listName.empty())
|
else if (!listName.empty())
|
||||||
{
|
{
|
||||||
string templ(_match[3]);
|
std::string templ(_match[3]);
|
||||||
assertThrow(
|
assertThrow(
|
||||||
_listParameters.count(listName),
|
_listParameters.count(listName),
|
||||||
WhiskersError, "List parameter " + listName + " not set."
|
WhiskersError, "List parameter " + listName + " not set."
|
||||||
);
|
);
|
||||||
string replacement;
|
std::string replacement;
|
||||||
for (auto const& parameters: _listParameters.at(listName))
|
for (auto const& parameters: _listParameters.at(listName))
|
||||||
replacement += replace(templ, joinMaps(_parameters, parameters), _conditions);
|
replacement += replace(templ, joinMaps(_parameters, parameters), _conditions);
|
||||||
return replacement;
|
return replacement;
|
||||||
@ -200,7 +199,7 @@ string Whiskers::replace(
|
|||||||
bool conditionValue = false;
|
bool conditionValue = false;
|
||||||
if (conditionName[0] == '+')
|
if (conditionName[0] == '+')
|
||||||
{
|
{
|
||||||
string tag = conditionName.substr(1);
|
std::string tag = conditionName.substr(1);
|
||||||
|
|
||||||
if (_parameters.count(tag))
|
if (_parameters.count(tag))
|
||||||
conditionValue = !_parameters.at(tag).empty();
|
conditionValue = !_parameters.at(tag).empty();
|
||||||
|
@ -33,6 +33,7 @@ NAMESPACE_STD_FREE_FILES=(
|
|||||||
libsolidity/interface/*
|
libsolidity/interface/*
|
||||||
libsolidity/lsp/*
|
libsolidity/lsp/*
|
||||||
libsolidity/parsing/*
|
libsolidity/parsing/*
|
||||||
|
libsolutil/*
|
||||||
)
|
)
|
||||||
|
|
||||||
(
|
(
|
||||||
|
Loading…
Reference in New Issue
Block a user