Commit 837d01dd authored by Wayne Davison's avatar Wayne Davison

Improved parse_size_arg() a little more.

parent 926d86d1
......@@ -648,11 +648,11 @@ static int count_args(const char **argv)
}
static OFF_T parse_size_arg(char **size_arg)
static OFF_T parse_size_arg(char **size_arg, char def_suf)
{
const char *arg;
OFF_T size;
int mult, make_compatible = 0;
const char *arg, *p;
OFF_T size = 0;
for (arg = *size_arg; isdigit(*(uchar*)arg); arg++) {}
if (*arg == '.')
......@@ -661,27 +661,31 @@ static OFF_T parse_size_arg(char **size_arg)
mult = 1000, make_compatible = 1;
else
mult = 1024;
switch (*arg) {
if ((p = strstr(arg, "+1")) != NULL
|| (p = strstr(arg, "-1")) != NULL) {
if (p[2] == '\0') {
size = atoi(p + (*p == '+'));
make_compatible = 1;
} else
p = NULL;
}
switch (*arg && arg != p ? *arg : def_suf) {
case 'b': case 'B':
size += atof(*size_arg);
break;
case 'k': case 'K':
size = atof(*size_arg) * mult;
size += atof(*size_arg) * mult;
break;
case 'm': case 'M':
size = atof(*size_arg) * mult*mult;
size += atof(*size_arg) * mult*mult;
break;
case 'g': case 'G':
size = atof(*size_arg) * mult*mult*mult;
break;
case '\0': case '+': case '-':
size = atof(*size_arg);
size += atof(*size_arg) * mult*mult*mult;
break;
default:
size = -1;
break;
}
if (strchr(arg, '+'))
size++, make_compatible = 1;
else if (strchr(arg, '-'))
size--, make_compatible = 1;
if (size > 0 && make_compatible) {
/* We convert this manually because we many need %lld
* precision, and that's not portable. */
......@@ -911,7 +915,7 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
break;
case OPT_MAX_SIZE:
if ((max_size = parse_size_arg(&max_size_arg)) <= 0) {
if ((max_size = parse_size_arg(&max_size_arg, 'b')) <= 0) {
snprintf(err_buf, sizeof err_buf,
"--max-size value is invalid: %s\n",
max_size_arg);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment