// SPDX-License-Identifier: GPL-2.0 #include "units.h" #include <inttypes.h> #include <limits.h> #include <stdlib.h> #include <string.h> #include <linux/kernel.h> #include <linux/time64.h> unsigned long parse_tag_value(const char *str, struct parse_tag *tags) { struct parse_tag *i = tags; while (i->tag) { char *s = strchr(str, i->tag); if (s) { unsigned long int value; char *endptr; value = strtoul(str, &endptr, 10); if (s != endptr) break; if (value > ULONG_MAX / i->mult) break; value *= i->mult; return value; } i++; } return (unsigned long) -1; } double convert_unit_double(double value, char *unit) { *unit = ' '; if (value > 1000.0) { value /= 1000.0; *unit = 'K'; } if (value > 1000.0) { value /= 1000.0; *unit = 'M'; } if (value > 1000.0) { value /= 1000.0; *unit = 'G'; } return value; } unsigned long convert_unit(unsigned long value, char *unit) { double v = convert_unit_double((double)value, unit); return (unsigned long)v; } int unit_number__scnprintf(char *buf, size_t size, u64 n) { char unit[4] = "BKMG"; int i = 0; while (((n / 1024) > 1) && (i < 3)) { n /= 1024; i++; } return scnprintf(buf, size, "%" PRIu64 "%c", n, unit[i]); }