Add --hex_prefix flag
This commit is contained in:
parent
2282d8455a
commit
de1e9000a2
|
@ -43,6 +43,7 @@ enum {
|
|||
OPT_BUILD_FLAGS,
|
||||
OPT_LIST_ONLY,
|
||||
OPT_KEY_PREFIX,
|
||||
OPT_HEX_KEY_PREFIX,
|
||||
OPT_BEGIN_VERSION_FILTER,
|
||||
OPT_END_VERSION_FILTER,
|
||||
OPT_HELP
|
||||
|
@ -68,6 +69,7 @@ CSimpleOpt::SOption gConverterOptions[] = { { OPT_CONTAINER, "-r", SO_REQ_SEP },
|
|||
{ OPT_BUILD_FLAGS, "--build_flags", SO_NONE },
|
||||
{ OPT_LIST_ONLY, "--list_only", SO_NONE },
|
||||
{ OPT_KEY_PREFIX, "-k", SO_REQ_SEP },
|
||||
{ OPT_HEX_KEY_PREFIX, "--hex_prefix", SO_REQ_SEP },
|
||||
{ OPT_BEGIN_VERSION_FILTER, "--begin_version_filter", SO_REQ_SEP },
|
||||
{ OPT_END_VERSION_FILTER, "--end_version_filter", SO_REQ_SEP },
|
||||
{ OPT_HELP, "-?", SO_NONE },
|
||||
|
|
|
@ -73,6 +73,8 @@ void printDecodeUsage() {
|
|||
" --build_flags Print build information and exit.\n"
|
||||
" --list_only Print file list and exit.\n"
|
||||
" -k KEY_PREFIX Use the prefix for filtering mutations\n"
|
||||
" --hex_prefix HEX_PREFIX\n"
|
||||
" The prefix specified in HEX format, e.g., \\x05\\x01.\n"
|
||||
" --begin_version_filter BEGIN_VERSION\n"
|
||||
" The version range's begin version (inclusive) for filtering.\n"
|
||||
" --end_version_filter END_VERSION\n"
|
||||
|
@ -131,10 +133,57 @@ struct DecodeParams {
|
|||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
// Decode an ASCII string, e.g., "\x15\x1b\x19\x04\xaf\x0c\x28\x0a",
|
||||
// into the binary string.
|
||||
std::string decode_hex_string(std::string line) {
|
||||
size_t i = 0;
|
||||
std::string ret;
|
||||
|
||||
while (i <= line.length()) {
|
||||
switch (line[i]) {
|
||||
case '\\':
|
||||
if (i + 2 > line.length()) {
|
||||
std::cerr << "Invalid hex string at: " << i << "\n";
|
||||
return ret;
|
||||
}
|
||||
switch (line[i + 1]) {
|
||||
char ent, save;
|
||||
case '"':
|
||||
case '\\':
|
||||
case ' ':
|
||||
case ';':
|
||||
line.erase(i, 1);
|
||||
break;
|
||||
case 'x':
|
||||
if (i + 4 > line.length()) {
|
||||
std::cerr << "Invalid hex string at: " << i << "\n";
|
||||
return ret;
|
||||
}
|
||||
char* pEnd;
|
||||
save = line[i + 4];
|
||||
line[i + 4] = 0;
|
||||
ent = char(strtoul(line.data() + i + 2, &pEnd, 16));
|
||||
if (*pEnd) {
|
||||
std::cerr << "Invalid hex string at: " << i << "\n";
|
||||
return ret;
|
||||
}
|
||||
line[i + 4] = save;
|
||||
line.replace(i, 4, 1, ent);
|
||||
break;
|
||||
default:
|
||||
std::cerr << "Invalid hex string at: " << i << "\n";
|
||||
return ret;
|
||||
}
|
||||
default:
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
return line.substr(0, i);
|
||||
}
|
||||
|
||||
int parseDecodeCommandLine(DecodeParams* param, CSimpleOpt* args) {
|
||||
while (args->Next()) {
|
||||
auto lastError = args->LastError();
|
||||
|
@ -164,6 +213,10 @@ int parseDecodeCommandLine(DecodeParams* param, CSimpleOpt* args) {
|
|||
param->prefix = args->OptionArg();
|
||||
break;
|
||||
|
||||
case OPT_HEX_KEY_PREFIX:
|
||||
param->prefix = decode_hex_string(args->OptionArg());
|
||||
break;
|
||||
|
||||
case OPT_BEGIN_VERSION_FILTER:
|
||||
param->beginVersionFilter = std::atoll(args->OptionArg());
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue