diff --git a/src/core_read.cpp b/src/core_read.cpp --- a/src/core_read.cpp +++ b/src/core_read.cpp @@ -49,44 +49,56 @@ boost::algorithm::split(words, s, boost::algorithm::is_any_of(" \t\n"), boost::algorithm::token_compress_on); - for (std::vector::const_iterator w = words.begin(); - w != words.end(); ++w) { - if (w->empty()) { + for (const auto &w : words) { + if (w.empty()) { // Empty string, ignore. (boost::split given '' will return one // word) - } else if (all(*w, boost::algorithm::is_digit()) || - (boost::algorithm::starts_with(*w, "-") && - all(std::string(w->begin() + 1, w->end()), - boost::algorithm::is_digit()))) { + continue; + } + + if (all(w, boost::algorithm::is_digit()) || + (boost::algorithm::starts_with(w, "-") && + all(std::string(w.begin() + 1, w.end()), + boost::algorithm::is_digit()))) { // Number - int64_t n = atoi64(*w); + int64_t n = atoi64(w); result << n; - } else if (boost::algorithm::starts_with(*w, "0x") && - (w->begin() + 2 != w->end())) { - if (IsHex(std::string(w->begin() + 2, w->end()))) { - // Raw hex data, inserted NOT pushed onto stack: - std::vector raw = - ParseHex(std::string(w->begin() + 2, w->end())); - result.insert(result.end(), raw.begin(), raw.end()); - } else { + continue; + } + + if (boost::algorithm::starts_with(w, "0x") && + (w.begin() + 2 != w.end())) { + if (!IsHex(std::string(w.begin() + 2, w.end()))) { // Should only arrive here for improperly formatted hex values throw std::runtime_error("Hex numbers expected to be formatted " "in full-byte chunks (ex: 0x00 " "instead of 0x0)"); } - } else if (w->size() >= 2 && boost::algorithm::starts_with(*w, "'") && - boost::algorithm::ends_with(*w, "'")) { + + // Raw hex data, inserted NOT pushed onto stack: + std::vector raw = + ParseHex(std::string(w.begin() + 2, w.end())); + result.insert(result.end(), raw.begin(), raw.end()); + continue; + } + + if (w.size() >= 2 && boost::algorithm::starts_with(w, "'") && + boost::algorithm::ends_with(w, "'")) { // Single-quoted string, pushed as data. NOTE: this is poor-man's // parsing, spaces/tabs/newlines in single-quoted strings won't // work. - std::vector value(w->begin() + 1, w->end() - 1); + std::vector value(w.begin() + 1, w.end() - 1); result << value; - } else if (mapOpNames.count(*w)) { + continue; + } + + if (mapOpNames.count(w)) { // opcode, e.g. OP_ADD or ADD: - result << mapOpNames[*w]; - } else { - throw std::runtime_error("Error parsing script: " + s); + result << mapOpNames[w]; + continue; } + + throw std::runtime_error("Error parsing script: " + s); } return result;