X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=parse.c;h=c8bae0335a4e90365022e946d24136b1a1cc501b;hp=e46fc14ef236e8bb59dac9fb448f2d22b92d4e92;hb=74454ce40f1a5e1e682da0a8acb824a7f6910270;hpb=56e2a5fc76067c91738f7eb0efbd6ec6d349e0f2 diff --git a/parse.c b/parse.c index e46fc14e..c8bae033 100644 --- a/parse.c +++ b/parse.c @@ -122,21 +122,41 @@ static void show_option_help(struct fio_option *o, int is_err) show_option_values(o); } -static unsigned long get_mult_time(char c) +static unsigned long long get_mult_time(const char *str, int len) { - switch (c) { - case 'm': - case 'M': - return 60; - case 'h': - case 'H': - return 60 * 60; - case 'd': - case 'D': - return 24 * 60 * 60; - default: - return 1; + const char *p = str; + char *c; + unsigned long long mult = 1000; + + /* + * Go forward until we hit a non-digit, or +/- sign + */ + while ((p - str) <= len) { + if (!isdigit((int) *p) && (*p != '+') && (*p != '-')) + break; + p++; } + + if (!isalpha((int) *p)) + return 1000; + + c = strdup(p); + for (int i = 0; i < strlen(c); i++) + c[i] = tolower(c[i]); + + if (!strncmp("ms", c, 2)) + mult = 1; + else if (!strcmp("s", c)) + mult = 1000; + else if (!strcmp("m", c)) + mult = 60 * 1000; + else if (!strcmp("h", c)) + mult = 60 * 60 * 1000; + else if (!strcmp("d", c)) + mult = 24 * 60 * 60 * 1000; + + free(c); + return mult; } static int is_separator(char c) @@ -275,7 +295,7 @@ int str_to_decimal(const char *str, long long *val, int kilo, void *data) else *val *= mult; } else - *val *= get_mult_time(str[len - 1]); + *val *= get_mult_time(str, len); return 0; }