1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#include <linux/export.h>
16#include <linux/kernel.h>
17#include <linux/string.h>
18
19
20
21
22
23
24
25static int get_range(char **str, int *pint)
26{
27 int x, inc_counter, upper_range;
28
29 (*str)++;
30 upper_range = simple_strtol((*str), NULL, 0);
31 inc_counter = upper_range - *pint;
32 for (x = *pint; x < upper_range; x++)
33 *pint++ = x;
34 return inc_counter;
35}
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52int get_option(char **str, int *pint)
53{
54 char *cur = *str;
55
56 if (!cur || !(*cur))
57 return 0;
58 *pint = simple_strtol(cur, str, 0);
59 if (cur == *str)
60 return 0;
61 if (**str == ',') {
62 (*str)++;
63 return 2;
64 }
65 if (**str == '-')
66 return 3;
67
68 return 1;
69}
70EXPORT_SYMBOL(get_option);
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89char *get_options(const char *str, int nints, int *ints)
90{
91 int res, i = 1;
92
93 while (i < nints) {
94 res = get_option((char **)&str, ints + i);
95 if (res == 0)
96 break;
97 if (res == 3) {
98 int range_nums;
99 range_nums = get_range((char **)&str, ints + i);
100 if (range_nums < 0)
101 break;
102
103
104
105
106
107 i += (range_nums - 1);
108 }
109 i++;
110 if (res == 1)
111 break;
112 }
113 ints[0] = i - 1;
114 return (char *)str;
115}
116EXPORT_SYMBOL(get_options);
117
118
119
120
121
122
123
124
125
126
127unsigned long long memparse(const char *ptr, char **retptr)
128{
129 char *endptr;
130
131 unsigned long long ret = simple_strtoull(ptr, &endptr, 0);
132
133 switch (*endptr) {
134 case 'E':
135 case 'e':
136 ret <<= 10;
137 case 'P':
138 case 'p':
139 ret <<= 10;
140 case 'T':
141 case 't':
142 ret <<= 10;
143 case 'G':
144 case 'g':
145 ret <<= 10;
146 case 'M':
147 case 'm':
148 ret <<= 10;
149 case 'K':
150 case 'k':
151 ret <<= 10;
152 endptr++;
153 default:
154 break;
155 }
156
157 if (retptr)
158 *retptr = endptr;
159
160 return ret;
161}
162EXPORT_SYMBOL(memparse);
163
164
165
166
167
168
169
170
171
172
173
174bool parse_option_str(const char *str, const char *option)
175{
176 while (*str) {
177 if (!strncmp(str, option, strlen(option))) {
178 str += strlen(option);
179 if (!*str || *str == ',')
180 return true;
181 }
182
183 while (*str && *str != ',')
184 str++;
185
186 if (*str == ',')
187 str++;
188 }
189
190 return false;
191}
192