diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/util/string.c | 84 | ||||
-rw-r--r-- | tools/perf/util/string.h | 1 |
2 files changed, 85 insertions, 0 deletions
diff --git a/tools/perf/util/string.c b/tools/perf/util/string.c index 04743d3e9039..227043577e06 100644 --- a/tools/perf/util/string.c +++ b/tools/perf/util/string.c | |||
@@ -1,5 +1,7 @@ | |||
1 | #include <string.h> | 1 | #include <string.h> |
2 | #include <stdlib.h> | ||
2 | #include "string.h" | 3 | #include "string.h" |
4 | #include "util.h" | ||
3 | 5 | ||
4 | static int hex(char ch) | 6 | static int hex(char ch) |
5 | { | 7 | { |
@@ -43,3 +45,85 @@ char *strxfrchar(char *s, char from, char to) | |||
43 | 45 | ||
44 | return s; | 46 | return s; |
45 | } | 47 | } |
48 | |||
49 | #define K 1024LL | ||
50 | /* | ||
51 | * perf_atoll() | ||
52 | * Parse (\d+)(b|B|kb|KB|mb|MB|gb|GB|tb|TB) (e.g. "256MB") | ||
53 | * and return its numeric value | ||
54 | */ | ||
55 | s64 perf_atoll(const char *str) | ||
56 | { | ||
57 | unsigned int i; | ||
58 | s64 length = -1, unit = 1; | ||
59 | |||
60 | if (!isdigit(str[0])) | ||
61 | goto out_err; | ||
62 | |||
63 | for (i = 1; i < strlen(str); i++) { | ||
64 | switch (str[i]) { | ||
65 | case 'B': | ||
66 | case 'b': | ||
67 | break; | ||
68 | case 'K': | ||
69 | if (str[i + 1] != 'B') | ||
70 | goto out_err; | ||
71 | else | ||
72 | goto kilo; | ||
73 | case 'k': | ||
74 | if (str[i + 1] != 'b') | ||
75 | goto out_err; | ||
76 | kilo: | ||
77 | unit = K; | ||
78 | break; | ||
79 | case 'M': | ||
80 | if (str[i + 1] != 'B') | ||
81 | goto out_err; | ||
82 | else | ||
83 | goto mega; | ||
84 | case 'm': | ||
85 | if (str[i + 1] != 'b') | ||
86 | goto out_err; | ||
87 | mega: | ||
88 | unit = K * K; | ||
89 | break; | ||
90 | case 'G': | ||
91 | if (str[i + 1] != 'B') | ||
92 | goto out_err; | ||
93 | else | ||
94 | goto giga; | ||
95 | case 'g': | ||
96 | if (str[i + 1] != 'b') | ||
97 | goto out_err; | ||
98 | giga: | ||
99 | unit = K * K * K; | ||
100 | break; | ||
101 | case 'T': | ||
102 | if (str[i + 1] != 'B') | ||
103 | goto out_err; | ||
104 | else | ||
105 | goto tera; | ||
106 | case 't': | ||
107 | if (str[i + 1] != 'b') | ||
108 | goto out_err; | ||
109 | tera: | ||
110 | unit = K * K * K * K; | ||
111 | break; | ||
112 | case '\0': /* only specified figures */ | ||
113 | unit = 1; | ||
114 | break; | ||
115 | default: | ||
116 | if (!isdigit(str[i])) | ||
117 | goto out_err; | ||
118 | break; | ||
119 | } | ||
120 | } | ||
121 | |||
122 | length = atoll(str) * unit; | ||
123 | goto out; | ||
124 | |||
125 | out_err: | ||
126 | length = -1; | ||
127 | out: | ||
128 | return length; | ||
129 | } | ||
diff --git a/tools/perf/util/string.h b/tools/perf/util/string.h index 2c84bf65ba0f..e50b07f80827 100644 --- a/tools/perf/util/string.h +++ b/tools/perf/util/string.h | |||
@@ -5,6 +5,7 @@ | |||
5 | 5 | ||
6 | int hex2u64(const char *ptr, u64 *val); | 6 | int hex2u64(const char *ptr, u64 *val); |
7 | char *strxfrchar(char *s, char from, char to); | 7 | char *strxfrchar(char *s, char from, char to); |
8 | s64 perf_atoll(const char *str); | ||
8 | 9 | ||
9 | #define _STR(x) #x | 10 | #define _STR(x) #x |
10 | #define STR(x) _STR(x) | 11 | #define STR(x) _STR(x) |