/* * convert string into decimal value, noting any size suffix */ int str_to_decimal(const char *str, long long *val, int kilo, void *data, int is_seconds) { int len, base; len = strlen(str); if (!len) return 1; if (strstr(str, "0x") || strstr(str, "0X")) base = 16; else base = 10; *val = strtoll(str, NULL, base); if (*val == LONG_MAX && errno == ERANGE) return 1; if (kilo) { unsigned long long mult; int perc = 0; mult = get_mult_bytes(str, len, data, &perc); if (perc) *val = -1ULL - *val; else *val *= mult; } else *val *= get_mult_time(str, len, is_seconds); return 0; }
/* * convert string into decimal value, noting any size suffix */ int str_to_decimal(const char *str, long long *val, int kilo, void *data) { int len, base; len = strlen(str); if (!len) return 1; if (strstr(str, "0x") || strstr(str, "0X")) base = 16; else base = 10; *val = strtoll(str, NULL, base); if (*val == LONG_MAX && errno == ERANGE) return 1; if (kilo) { const char *p; /* * if the last char is 'b' or 'B', the user likely used * "1gb" instead of just "1g". If the second to last is also * a letter, adjust. */ p = str + len - 1; if ((*p == 'b' || *p == 'B') && isalpha(*(p - 1))) --p; *val *= get_mult_bytes(*p, data); } else *val *= get_mult_time(str[len - 1]); return 0; }
/* * convert string into decimal value, noting any size suffix */ int str_to_decimal(const char *str, long long *val, int kilo, void *data, int is_seconds) { int len, base; int rc = 1; #ifdef CONFIG_ARITHMETIC long long ival; double dval; double implied_units = 1.0; #endif len = strlen(str); if (!len) return 1; #ifdef CONFIG_ARITHMETIC if (is_seconds) implied_units = 1000000.0; if (str[0] == '(') rc = evaluate_arithmetic_expression(str, &ival, &dval, implied_units); if (str[0] == '(' && !rc) { if (!kilo && is_seconds) *val = ival / 1000000LL; else *val = ival; } #endif if (rc == 1) { if (strstr(str, "0x") || strstr(str, "0X")) base = 16; else base = 10; *val = strtoll(str, NULL, base); if (*val == LONG_MAX && errno == ERANGE) return 1; } if (kilo) { unsigned long long mult; int perc = 0; mult = get_mult_bytes(str, len, data, &perc); if (perc) *val = -1ULL - *val; else *val *= mult; } else *val *= get_mult_time(str, len, is_seconds); #ifdef CONFIG_ARITHMETIC verify_exp_parser_decimal(str, *val, kilo, is_seconds); #endif return 0; }
/* * convert string into decimal value, noting any size suffix */ int str_to_decimal(const char *str, long long *val, int kilo, void *data) { int len, base; len = strlen(str); if (!len) return 1; if (strstr(str, "0x") || strstr(str, "0X")) base = 16; else base = 10; *val = strtoll(str, NULL, base); if (*val == LONG_MAX && errno == ERANGE) return 1; if (kilo) *val *= get_mult_bytes(str[len - 1], data); else *val *= get_mult_time(str[len - 1]); return 0; }