saner perf_atoll()
That loop in there is both anti-idiomatic *and* completely pointless. strtoll() is there for purpose; use it and compare what's left with acceptable suffices. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
849f3127bb
commit
8ba7f6c2fa
1 changed files with 32 additions and 62 deletions
|
@ -9,78 +9,48 @@
|
||||||
*/
|
*/
|
||||||
s64 perf_atoll(const char *str)
|
s64 perf_atoll(const char *str)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
s64 length;
|
||||||
s64 length = -1, unit = 1;
|
char *p;
|
||||||
|
char c;
|
||||||
|
|
||||||
if (!isdigit(str[0]))
|
if (!isdigit(str[0]))
|
||||||
goto out_err;
|
goto out_err;
|
||||||
|
|
||||||
for (i = 1; i < strlen(str); i++) {
|
length = strtoll(str, &p, 10);
|
||||||
switch (str[i]) {
|
switch (c = *p++) {
|
||||||
case 'B':
|
case 'b': case 'B':
|
||||||
case 'b':
|
if (*p)
|
||||||
break;
|
|
||||||
case 'K':
|
|
||||||
if (str[i + 1] != 'B')
|
|
||||||
goto out_err;
|
goto out_err;
|
||||||
else
|
case '\0':
|
||||||
goto kilo;
|
return length;
|
||||||
case 'k':
|
|
||||||
if (str[i + 1] != 'b')
|
|
||||||
goto out_err;
|
|
||||||
kilo:
|
|
||||||
unit = K;
|
|
||||||
break;
|
|
||||||
case 'M':
|
|
||||||
if (str[i + 1] != 'B')
|
|
||||||
goto out_err;
|
|
||||||
else
|
|
||||||
goto mega;
|
|
||||||
case 'm':
|
|
||||||
if (str[i + 1] != 'b')
|
|
||||||
goto out_err;
|
|
||||||
mega:
|
|
||||||
unit = K * K;
|
|
||||||
break;
|
|
||||||
case 'G':
|
|
||||||
if (str[i + 1] != 'B')
|
|
||||||
goto out_err;
|
|
||||||
else
|
|
||||||
goto giga;
|
|
||||||
case 'g':
|
|
||||||
if (str[i + 1] != 'b')
|
|
||||||
goto out_err;
|
|
||||||
giga:
|
|
||||||
unit = K * K * K;
|
|
||||||
break;
|
|
||||||
case 'T':
|
|
||||||
if (str[i + 1] != 'B')
|
|
||||||
goto out_err;
|
|
||||||
else
|
|
||||||
goto tera;
|
|
||||||
case 't':
|
|
||||||
if (str[i + 1] != 'b')
|
|
||||||
goto out_err;
|
|
||||||
tera:
|
|
||||||
unit = K * K * K * K;
|
|
||||||
break;
|
|
||||||
case '\0': /* only specified figures */
|
|
||||||
unit = 1;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
if (!isdigit(str[i]))
|
goto out_err;
|
||||||
goto out_err;
|
/* two-letter suffices */
|
||||||
|
case 'k': case 'K':
|
||||||
|
length <<= 10;
|
||||||
|
break;
|
||||||
|
case 'm': case 'M':
|
||||||
|
length <<= 20;
|
||||||
|
break;
|
||||||
|
case 'g': case 'G':
|
||||||
|
length <<= 30;
|
||||||
|
break;
|
||||||
|
case 't': case 'T':
|
||||||
|
length <<= 40;
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
/* we want the cases to match */
|
||||||
length = atoll(str) * unit;
|
if (islower(c)) {
|
||||||
goto out;
|
if (strcmp(p, "b") != 0)
|
||||||
|
goto out_err;
|
||||||
|
} else {
|
||||||
|
if (strcmp(p, "B") != 0)
|
||||||
|
goto out_err;
|
||||||
|
}
|
||||||
|
return length;
|
||||||
|
|
||||||
out_err:
|
out_err:
|
||||||
length = -1;
|
return -1;
|
||||||
out:
|
|
||||||
return length;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Reference in a new issue