}
}
-static unsigned long long __get_mult_bytes(const char *p, void *data)
+static unsigned long long __get_mult_bytes(const char *p, void *data,
+ int *percent)
{
unsigned int kb_base = fio_get_kb_base(data);
unsigned long long ret = 1;
pow = 2;
else if (!strcmp("k", c) || !strcmp("kb", c))
pow = 1;
+ else if (!strcmp("%", c)) {
+ *percent = 1;
+ return ret;
+ }
while (pow--)
ret *= (unsigned long long) mult;
return ret;
}
-static unsigned long long get_mult_bytes(const char *str, int len, void *data)
+static unsigned long long get_mult_bytes(const char *str, int len, void *data,
+ int *percent)
{
const char *p = str;
if (len < 2)
- return __get_mult_bytes(str, data);
+ return __get_mult_bytes(str, data, percent);
/*
* Go forward until we hit a non-digit
*/
while ((p - str) <= len) {
- if (!isdigit(*p))
+ if (!isdigit((int) *p))
break;
p++;
}
- if (!isalpha(*p))
+ if (!isalpha((int) *p) && (*p != '%'))
p = NULL;
- return __get_mult_bytes(p, data);
+ return __get_mult_bytes(p, data, percent);
}
/*
if (*val == LONG_MAX && errno == ERANGE)
return 1;
- if (kilo)
- *val *= get_mult_bytes(str, len, data);
- else
+ 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 - 1]);
return 0;
{
char *s = *p;
- while (isspace(*s))
+ while (isspace((int) *s))
s++;
*p = s;
p = s;
s = p + strlen(p);
- while ((isspace(*s) || iscntrl(*s)) && (s > start))
+ while ((isspace((int) *s) || iscntrl((int) *s)) && (s > start))
s--;
*(s + 1) = '\0';
strncpy(tmp, ptr, sizeof(tmp) - 1);
+ /* Handle bsrange with separate read,write values: */
+ p1 = strchr(tmp, ',');
+ if (p1)
+ *p1 = '\0';
+
p1 = strchr(tmp, '-');
if (!p1) {
p1 = strchr(tmp, ':');
break;
}
- case FIO_OPT_BOOL: {
+ case FIO_OPT_BOOL:
+ case FIO_OPT_STR_SET: {
fio_opt_int_fn *fn = o->cb;
- ret = check_int(ptr, &il);
+ if (ptr)
+ ret = check_int(ptr, &il);
+ else if (o->type == FIO_OPT_BOOL)
+ ret = 1;
+ else
+ il = 1;
+
if (ret)
break;
}
break;
}
- case FIO_OPT_STR_SET: {
- fio_opt_str_set_fn *fn = o->cb;
-
- if (fn)
- ret = fn(data);
- else {
- if (first) {
- if (o->roff1)
- *(unsigned int *) o->roff1 = 1;
- else
- val_store(ilp, 1, o->off1, 0, data);
- }
- if (!more) {
- if (o->roff2)
- *(unsigned int *) o->roff2 = 1;
- else if (o->off2)
- val_store(ilp, 1, o->off2, 0, data);
- }
- }
- break;
- }
case FIO_OPT_DEPRECATED:
fprintf(stdout, "Option %s is deprecated\n", o->name);
break;