Browse Source

More towards an implementation.

cl-refactor
Gav Wood 10 years ago
parent
commit
42e6a29144
  1. 75
      abi/main.cpp

75
abi/main.cpp

@ -39,8 +39,10 @@ void help()
<< " abi dec -a <abi.json> [ <signature> | <unique_method_name> ]" << endl
<< "Options:" << endl
<< " -a,--abi-file <filename> Specify the JSON ABI file." << endl
<< "Input options (enc mode):" << endl
<< " -p,--prefix Require all arguments to be prefixed 0x (hex), . (decimal), # (binary)." << endl
<< "Output options (dec mode):" << endl
<< " -i,--index <n> When decoding, output only the nth (counting from 0) return value." << endl
<< " -i,--index <n> Output only the nth (counting from 0) return value." << endl
<< " -d,--decimal All data should be displayed as decimal." << endl
<< " -x,--hex Display all data as hex." << endl
<< " -b,--binary Display all data as binary." << endl
@ -72,16 +74,57 @@ enum class Encoding {
Binary,
};
struct InvalidUserString: public Exception {};
pair<bytes, bool> fromUser(std::string const& _arg, bool _requirePrefix)
{
if (_requirePrefix)
{
if (_arg.substr(0, 2) == "0x")
return make_pair(fromHex(_arg), false);
if (_arg.substr(0, 1) == ".")
return make_pair(toCompactBigEndian(bigint(_arg.substr(1))), false);
if (_arg.substr(0, 1) == "#")
return make_pair(asBytes(_arg.substr(1)), true);
throw InvalidUserString();
}
else
{
if (_arg.substr(0, 2) == "0x")
return make_pair(fromHex(_arg), false);
if (_arg.find_first_not_of("0123456789"))
return make_pair(toCompactBigEndian(bigint(_arg)), false);
return make_pair(asBytes(_arg), true);
}
}
bytes aligned(bytes const& _b, bool _left, unsigned _length)
{
bytes ret = _b;
while (ret.size() < _length)
if (_left)
ret.push_back(0);
else
ret.insert(ret.begin(), 0);
while (ret.size() > _length)
if (_left)
ret.pop_back();
else
ret.erase(ret.begin());
return ret;
}
int main(int argc, char** argv)
{
Encoding encoding = Encoding::Auto;
Mode mode = Mode::Encode;
string abiFile;
string methodName;
bool outputPrefix = false;
string method;
bool prefix = false;
bool clearZeroes = false;
bool clearNulls = false;
int outputIndex = -1;
vector<pair<bytes, bool>> args;
for (int i = 1; i < argc; ++i)
{
@ -97,7 +140,7 @@ int main(int argc, char** argv)
else if ((arg == "-i" || arg == "--index") && argc > i)
outputIndex = atoi(argv[++i]);
else if (arg == "-p" || arg == "--prefix")
outputPrefix = true;
prefix = true;
else if (arg == "-z" || arg == "--no-zeroes")
clearZeroes = true;
else if (arg == "-n" || arg == "--no-nulls")
@ -110,8 +153,10 @@ int main(int argc, char** argv)
encoding = Encoding::Binary;
else if (arg == "-V" || arg == "--version")
version();
else if (method.empty())
method = arg;
else
methodName = arg;
args.push_back(fromUser(arg, prefix));
}
string abi;
@ -122,16 +167,28 @@ int main(int argc, char** argv)
abi = contentsString(abiFile);
if (mode == Mode::Encode)
{
if (abi.empty())
{
bytes ret;
if (!method.empty())
ret = FixedHash<32>(sha3(method)).asBytes();
if (method.empty())
for (pair<bytes, bool> const& arg: args)
ret += aligned(arg.first, arg.second, 32);
}
else
{
// TODO: read abi.
}
}
else if (mode == Mode::Decode)
{
(void)encoding;
(void)outputPrefix;
(void)clearZeroes;
(void)clearNulls;
(void)outputIndex;
}
else if (mode == Mode::Decode)
{
}
return 0;
}

Loading…
Cancel
Save