#include <string.h> | |
#include <stdlib.h> | |
#include "string.h" | |
#include "util.h" | |
static int hex(char ch) | |
{ | |
if ((ch >= '0') && (ch <= '9')) | |
return ch - '0'; | |
if ((ch >= 'a') && (ch <= 'f')) | |
return ch - 'a' + 10; | |
if ((ch >= 'A') && (ch <= 'F')) | |
return ch - 'A' + 10; | |
return -1; | |
} | |
/* | |
* While we find nice hex chars, build a long_val. | |
* Return number of chars processed. | |
*/ | |
int hex2u64(const char *ptr, u64 *long_val) | |
{ | |
const char *p = ptr; | |
*long_val = 0; | |
while (*p) { | |
const int hex_val = hex(*p); | |
if (hex_val < 0) | |
break; | |
*long_val = (*long_val << 4) | hex_val; | |
p++; | |
} | |
return p - ptr; | |
} | |
char *strxfrchar(char *s, char from, char to) | |
{ | |
char *p = s; | |
while ((p = strchr(p, from)) != NULL) | |
*p++ = to; | |
return s; | |
} | |
#define K 1024LL | |
/* | |
* perf_atoll() | |
* Parse (\d+)(b|B|kb|KB|mb|MB|gb|GB|tb|TB) (e.g. "256MB") | |
* and return its numeric value | |
*/ | |
s64 perf_atoll(const char *str) | |
{ | |
unsigned int i; | |
s64 length = -1, unit = 1; | |
if (!isdigit(str[0])) | |
goto out_err; | |
for (i = 1; i < strlen(str); i++) { | |
switch (str[i]) { | |
case 'B': | |
case 'b': | |
break; | |
case 'K': | |
if (str[i + 1] != 'B') | |
goto out_err; | |
else | |
goto kilo; | |
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: | |
if (!isdigit(str[i])) | |
goto out_err; | |
break; | |
} | |
} | |
length = atoll(str) * unit; | |
goto out; | |
out_err: | |
length = -1; | |
out: | |
return length; | |
} |