diff options
author | Pieter Wuille <pieter.wuille@gmail.com> | 2018-04-04 09:14:13 -0700 |
---|---|---|
committer | Pieter Wuille <pieter.wuille@gmail.com> | 2018-04-13 09:07:29 -0700 |
commit | 54a5a21158f740990048b1d43c641630744cf3ee (patch) | |
tree | 4d133b4c58fee0933019b05926c6df188bc313ab /src/script/script.cpp | |
parent | 6a7456ad6072f405e8b02bffa0fb4e9f0cfe71e0 (diff) |
[MOVEONLY] Turn CScript::GetOp2 into a function and move to cpp
Diffstat (limited to 'src/script/script.cpp')
-rw-r--r-- | src/script/script.cpp | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/script/script.cpp b/src/script/script.cpp index 65e5405ebd..7f25d915a8 100644 --- a/src/script/script.cpp +++ b/src/script/script.cpp @@ -280,3 +280,55 @@ bool CScript::HasValidOps() const } return true; } + +bool GetScriptOp(CScriptBase::const_iterator& pc, CScriptBase::const_iterator end, opcodetype& opcodeRet, std::vector<unsigned char>* pvchRet) +{ + opcodeRet = OP_INVALIDOPCODE; + if (pvchRet) + pvchRet->clear(); + if (pc >= end) + return false; + + // Read instruction + if (end - pc < 1) + return false; + unsigned int opcode = *pc++; + + // Immediate operand + if (opcode <= OP_PUSHDATA4) + { + unsigned int nSize = 0; + if (opcode < OP_PUSHDATA1) + { + nSize = opcode; + } + else if (opcode == OP_PUSHDATA1) + { + if (end - pc < 1) + return false; + nSize = *pc++; + } + else if (opcode == OP_PUSHDATA2) + { + if (end - pc < 2) + return false; + nSize = ReadLE16(&pc[0]); + pc += 2; + } + else if (opcode == OP_PUSHDATA4) + { + if (end - pc < 4) + return false; + nSize = ReadLE32(&pc[0]); + pc += 4; + } + if (end - pc < 0 || (unsigned int)(end - pc) < nSize) + return false; + if (pvchRet) + pvchRet->assign(pc, pc + nSize); + pc += nSize; + } + + opcodeRet = static_cast<opcodetype>(opcode); + return true; +} |