void push_literal(data_chunk& raw_script, int64_t value) { BITCOIN_ASSERT(is_opx(value)); switch (value) { case -1: raw_script.push_back(static_cast<uint8_t>(opcode::negative_1)); return; #define PUSH_X(n) \ case n: \ raw_script.push_back(static_cast<uint8_t>(opcode::op_##n)); \ return; PUSH_X(1); PUSH_X(2); PUSH_X(3); PUSH_X(4); PUSH_X(5); PUSH_X(6); PUSH_X(7); PUSH_X(8); PUSH_X(9); PUSH_X(10); PUSH_X(11); PUSH_X(12); PUSH_X(13); PUSH_X(14); PUSH_X(15); PUSH_X(16); } }
bool parse_token(data_chunk& raw_script, std::string token) { boost::algorithm::trim(token); // skip this if (token.empty()) return true; static data_chunk hex_raw; if (token == "ENDING" || !is_hex_data(token)) { if (!hex_raw.empty()) { extend_data(raw_script, hex_raw); hex_raw.resize(0); } } if (token == "ENDING") { // Do nothing... } else if (is_number(token)) { int64_t value = boost::lexical_cast<int64_t>(token); if (is_opx(value)) push_literal(raw_script, value); else { script_number bignum(value); push_data(raw_script, bignum.data()); } } else if (is_hex_data(token)) { std::string hex_part(token.begin() + 2, token.end()); data_chunk raw_data; if (!decode_base16(raw_data, hex_part)) return false; extend_data(hex_raw, raw_data); } else if (is_quoted_string(token)) { data_chunk inner_value(token.begin() + 1, token.end() - 1); push_data(raw_script, inner_value); } else if (is_opcode(token)) { opcode tokenized_opcode = token_to_opcode(token); raw_script.push_back(static_cast<uint8_t>(tokenized_opcode)); } else { log_error() << "Token parsing failed with: " << token; return false; } return true; }
bool parse_token(data_chunk& raw_script, const std::string& token) { static data_chunk hex_raw; if (token == "ENDING" || !is_hex_data(token)) { if (!hex_raw.empty()) { extend_data(raw_script, hex_raw); hex_raw.resize(0); } } if (token == "ENDING") { // Do nothing... } else if (is_number(token)) { int64_t value = boost::lexical_cast<int64_t>(token); if (is_opx(value)) push_literal(raw_script, value); else { big_number bignum; bignum.set_int64(value); push_data(raw_script, bignum.data()); } } else if (is_hex_data(token)) { std::string hex_part(token.begin() + 2, token.end()); data_chunk raw_data = bytes_from_pretty(hex_part); extend_data(hex_raw, raw_data); } else if (is_quoted_string(token)) { data_chunk inner_value(token.begin() + 1, token.end() - 1); push_data(raw_script, inner_value); } else if (is_opcode(token)) { opcode tokenized_opcode = token_to_opcode(token); raw_script.push_back(static_cast<byte>(tokenized_opcode)); } else { log_error() << "Token parsing failed with: " << token; return false; } return true; }