blob: 227043577e06b4800a094d8e8e7f414d46d950e4 [file] [log] [blame]
Arnaldo Carvalho de Meloa2a99e82009-10-05 14:26:18 -03001#include <string.h>
Hitoshi Mitaked2fb8b42009-11-15 20:36:53 +09002#include <stdlib.h>
Arnaldo Carvalho de Meloea5cc872009-06-01 22:31:03 -03003#include "string.h"
Hitoshi Mitaked2fb8b42009-11-15 20:36:53 +09004#include "util.h"
Arnaldo Carvalho de Meloea5cc872009-06-01 22:31:03 -03005
6static int hex(char ch)
7{
8 if ((ch >= '0') && (ch <= '9'))
9 return ch - '0';
10 if ((ch >= 'a') && (ch <= 'f'))
11 return ch - 'a' + 10;
12 if ((ch >= 'A') && (ch <= 'F'))
13 return ch - 'A' + 10;
14 return -1;
15}
16
17/*
18 * While we find nice hex chars, build a long_val.
19 * Return number of chars processed.
20 */
Paul Mackerras9cffa8d2009-06-19 22:21:42 +100021int hex2u64(const char *ptr, u64 *long_val)
Arnaldo Carvalho de Meloea5cc872009-06-01 22:31:03 -030022{
23 const char *p = ptr;
24 *long_val = 0;
25
26 while (*p) {
27 const int hex_val = hex(*p);
28
29 if (hex_val < 0)
30 break;
31
32 *long_val = (*long_val << 4) | hex_val;
33 p++;
34 }
35
36 return p - ptr;
37}
Arnaldo Carvalho de Meloa2a99e82009-10-05 14:26:18 -030038
39char *strxfrchar(char *s, char from, char to)
40{
41 char *p = s;
42
43 while ((p = strchr(p, from)) != NULL)
44 *p++ = to;
45
46 return s;
47}
Hitoshi Mitaked2fb8b42009-11-15 20:36:53 +090048
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 */
55s64 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;
76kilo:
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;
87mega:
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;
98giga:
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;
109tera:
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
125out_err:
126 length = -1;
127out:
128 return length;
129}