xref: /linux/tools/lib/cmdline.c (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * From lib/cmdline.c
4  */
5 #include <stdlib.h>
6 
7 #if __has_attribute(__fallthrough__)
8 # define fallthrough                    __attribute__((__fallthrough__))
9 #else
10 # define fallthrough                    do {} while (0)  /* fallthrough */
11 #endif
12 
13 unsigned long long memparse(const char *ptr, char **retptr)
14 {
15 	char *endptr;	/* local pointer to end of parsed string */
16 
17 	unsigned long long ret = strtoll(ptr, &endptr, 0);
18 
19 	switch (*endptr) {
20 	case 'E':
21 	case 'e':
22 		ret <<= 10;
23 		fallthrough;
24 	case 'P':
25 	case 'p':
26 		ret <<= 10;
27 		fallthrough;
28 	case 'T':
29 	case 't':
30 		ret <<= 10;
31 		fallthrough;
32 	case 'G':
33 	case 'g':
34 		ret <<= 10;
35 		fallthrough;
36 	case 'M':
37 	case 'm':
38 		ret <<= 10;
39 		fallthrough;
40 	case 'K':
41 	case 'k':
42 		ret <<= 10;
43 		endptr++;
44 		fallthrough;
45 	default:
46 		break;
47 	}
48 
49 	if (retptr)
50 		*retptr = endptr;
51 
52 	return ret;
53 }
54