1
0
Fork 0
mirror of synced 2025-03-06 20:59:54 +01:00

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:
Al Viro 2014-08-29 12:37:29 -04:00
parent 849f3127bb
commit 8ba7f6c2fa

View file

@ -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;
} }
/* /*