|
@@ -1,5 +1,7 @@
|
|
|
#include <string.h>
|
|
|
+#include <stdlib.h>
|
|
|
#include "string.h"
|
|
|
+#include "util.h"
|
|
|
|
|
|
static int hex(char ch)
|
|
|
{
|
|
@@ -43,3 +45,85 @@ char *strxfrchar(char *s, char from, char 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;
|
|
|
+}
|