| // SPDX-License-Identifier: GPL-2.0-only | |
| /* | |
| * From lib/cmdline.c | |
| */ | |
| #include <stdlib.h> | |
| #if __has_attribute(__fallthrough__) | |
| # define fallthrough __attribute__((__fallthrough__)) | |
| #else | |
| # define fallthrough do {} while (0) /* fallthrough */ | |
| #endif | |
| unsigned long long memparse(const char *ptr, char **retptr) | |
| { | |
| char *endptr; /* local pointer to end of parsed string */ | |
| unsigned long long ret = strtoll(ptr, &endptr, 0); | |
| switch (*endptr) { | |
| case 'E': | |
| case 'e': | |
| ret <<= 10; | |
| fallthrough; | |
| case 'P': | |
| case 'p': | |
| ret <<= 10; | |
| fallthrough; | |
| case 'T': | |
| case 't': | |
| ret <<= 10; | |
| fallthrough; | |
| case 'G': | |
| case 'g': | |
| ret <<= 10; | |
| fallthrough; | |
| case 'M': | |
| case 'm': | |
| ret <<= 10; | |
| fallthrough; | |
| case 'K': | |
| case 'k': | |
| ret <<= 10; | |
| endptr++; | |
| fallthrough; | |
| default: | |
| break; | |
| } | |
| if (retptr) | |
| *retptr = endptr; | |
| return ret; | |
| } |