]> Git Repo - VerusCoin.git/blob - src/core_read.cpp
Merge pull request #5148
[VerusCoin.git] / src / core_read.cpp
1 // Copyright (c) 2009-2014 The Bitcoin developers
2 // Distributed under the MIT/X11 software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5 #include "core_io.h"
6
7 #include "core/transaction.h"
8 #include "script/script.h"
9 #include "serialize.h"
10 #include "streams.h"
11 #include "univalue/univalue.h"
12 #include "util.h"
13 #include "utilstrencodings.h"
14 #include "version.h"
15
16 #include <boost/algorithm/string/classification.hpp>
17 #include <boost/algorithm/string/predicate.hpp>
18 #include <boost/algorithm/string/replace.hpp>
19 #include <boost/algorithm/string/split.hpp>
20 #include <boost/assign/list_of.hpp>
21
22 using namespace boost;
23 using namespace boost::algorithm;
24 using namespace std;
25
26 CScript ParseScript(std::string s)
27 {
28     CScript result;
29
30     static map<string, opcodetype> mapOpNames;
31
32     if (mapOpNames.empty())
33     {
34         for (int op = 0; op <= OP_NOP10; op++)
35         {
36             // Allow OP_RESERVED to get into mapOpNames
37             if (op < OP_NOP && op != OP_RESERVED)
38                 continue;
39
40             const char* name = GetOpName((opcodetype)op);
41             if (strcmp(name, "OP_UNKNOWN") == 0)
42                 continue;
43             string strName(name);
44             mapOpNames[strName] = (opcodetype)op;
45             // Convenience: OP_ADD and just ADD are both recognized:
46             replace_first(strName, "OP_", "");
47             mapOpNames[strName] = (opcodetype)op;
48         }
49     }
50
51     vector<string> words;
52     split(words, s, is_any_of(" \t\n"), token_compress_on);
53
54     for (std::vector<std::string>::const_iterator w = words.begin(); w != words.end(); ++w)
55     {
56         if (w->empty())
57         {
58             // Empty string, ignore. (boost::split given '' will return one word)
59         }
60         else if (all(*w, is_digit()) ||
61             (starts_with(*w, "-") && all(string(w->begin()+1, w->end()), is_digit())))
62         {
63             // Number
64             int64_t n = atoi64(*w);
65             result << n;
66         }
67         else if (starts_with(*w, "0x") && (w->begin()+2 != w->end()) && IsHex(string(w->begin()+2, w->end())))
68         {
69             // Raw hex data, inserted NOT pushed onto stack:
70             std::vector<unsigned char> raw = ParseHex(string(w->begin()+2, w->end()));
71             result.insert(result.end(), raw.begin(), raw.end());
72         }
73         else if (w->size() >= 2 && starts_with(*w, "'") && ends_with(*w, "'"))
74         {
75             // Single-quoted string, pushed as data. NOTE: this is poor-man's
76             // parsing, spaces/tabs/newlines in single-quoted strings won't work.
77             std::vector<unsigned char> value(w->begin()+1, w->end()-1);
78             result << value;
79         }
80         else if (mapOpNames.count(*w))
81         {
82             // opcode, e.g. OP_ADD or ADD:
83             result << mapOpNames[*w];
84         }
85         else
86         {
87             throw runtime_error("script parse error");
88         }
89     }
90
91     return result;
92 }
93
94 bool DecodeHexTx(CTransaction& tx, const std::string& strHexTx)
95 {
96     if (!IsHex(strHexTx))
97         return false;
98
99     vector<unsigned char> txData(ParseHex(strHexTx));
100     CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION);
101     try {
102         ssData >> tx;
103     }
104     catch (const std::exception &) {
105         return false;
106     }
107
108     return true;
109 }
110
111 uint256 ParseHashUV(const UniValue& v, const string& strName)
112 {
113     string strHex;
114     if (v.isStr())
115         strHex = v.getValStr();
116     if (!IsHex(strHex)) // Note: IsHex("") is false
117         throw runtime_error(strName+" must be hexadecimal string (not '"+strHex+"')");
118
119     uint256 result;
120     result.SetHex(strHex);
121     return result;
122 }
123
124 vector<unsigned char> ParseHexUV(const UniValue& v, const string& strName)
125 {
126     string strHex;
127     if (v.isStr())
128         strHex = v.getValStr();
129     if (!IsHex(strHex))
130         throw runtime_error(strName+" must be hexadecimal string (not '"+strHex+"')");
131     return ParseHex(strHex);
132 }
This page took 0.03512 seconds and 4 git commands to generate.