From: Jens Axboe Date: Thu, 26 Oct 2006 11:48:34 +0000 (+0200) Subject: [PATCH] Split config name parse functions into parse.c X-Git-Tag: fio-1.8~37 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=cb2c86fdf03241fee32fd2e2caff43af1022403c;ds=sidebyside [PATCH] Split config name parse functions into parse.c The plan is to add command line options that mirror the config options, so fio will be easier to script. Signed-off-by: Jens Axboe --- diff --git a/Makefile b/Makefile index 312f8ded..7951751d 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ CFLAGS = -W -Wall -O2 -g -D_GNU_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=6 PROGS = fio SCRIPTS = fio_generate_plots OBJS = fio.o ioengines.o init.o stat.o log.o time.o md5.o crc32.o \ - filesetup.o eta.o verify.o memory.o io_u.o + filesetup.o eta.o verify.o memory.o io_u.o parse.o INSTALL = install prefix = /usr/local diff --git a/init.c b/init.c index 76d8d816..ddca4c5f 100644 --- a/init.c +++ b/init.c @@ -1,6 +1,5 @@ /* - * This file contains the ini and command liner parser. It will create - * and initialize the specified jobs. + * This file contains job initialization and setup functions. */ #include #include @@ -15,6 +14,7 @@ #include #include "fio.h" +#include "parse.h" /* * The default options @@ -336,230 +336,6 @@ static void fill_cpu_mask(os_cpu_mask_t cpumask, int cpu) #endif } -static unsigned long get_mult_time(char c) -{ - 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; - } -} - -static unsigned long get_mult_bytes(char c) -{ - switch (c) { - case 'k': - case 'K': - return 1024; - case 'm': - case 'M': - return 1024 * 1024; - case 'g': - case 'G': - return 1024 * 1024 * 1024; - default: - return 1; - } -} - -/* - * convert string after '=' into decimal value, noting any size suffix - */ -static int str_to_decimal(char *p, unsigned long long *val, int kilo) -{ - char *str; - int len; - - str = strchr(p, '='); - if (!str) - return 1; - - str++; - len = strlen(str); - - *val = strtoul(str, NULL, 10); - if (*val == ULONG_MAX && errno == ERANGE) - return 1; - - if (kilo) - *val *= get_mult_bytes(str[len - 1]); - else - *val *= get_mult_time(str[len - 1]); - return 0; -} - -static int check_str_bytes(char *p, char *name, unsigned long long *val) -{ - if (strncmp(p, name, strlen(name) - 1)) - return 1; - - return str_to_decimal(p, val, 1); -} - -static int check_str_time(char *p, char *name, unsigned long long *val) -{ - if (strncmp(p, name, strlen(name) - 1)) - return 1; - - return str_to_decimal(p, val, 0); -} - -static void strip_blank_front(char **p) -{ - char *s = *p; - - while (isspace(*s)) - s++; -} - -static void strip_blank_end(char *p) -{ - char *s = p + strlen(p) - 1; - - while (isspace(*s) || iscntrl(*s)) - s--; - - *(s + 1) = '\0'; -} - -typedef int (str_cb_fn)(struct thread_data *, char *); - -static int check_str(char *p, char *name, str_cb_fn *cb, struct thread_data *td) -{ - char *s; - - if (strncmp(p, name, strlen(name))) - return 1; - - s = strstr(p, name); - if (!s) - return 1; - - s = strchr(s, '='); - if (!s) - return 1; - - s++; - strip_blank_front(&s); - return cb(td, s); -} - -static int check_strstore(char *p, char *name, char *dest) -{ - char *s; - - if (strncmp(p, name, strlen(name))) - return 1; - - s = strstr(p, name); - if (!s) - return 1; - - s = strchr(p, '='); - if (!s) - return 1; - - s++; - strip_blank_front(&s); - - strcpy(dest, s); - return 0; -} - -static int __check_range_bytes(char *str, unsigned long *val) -{ - char suffix; - - if (sscanf(str, "%lu%c", val, &suffix) == 2) { - *val *= get_mult_bytes(suffix); - return 0; - } - - if (sscanf(str, "%lu", val) == 1) - return 0; - - return 1; -} - -static int check_range_bytes(char *p, char *name, unsigned long *s, - unsigned long *e) -{ - char option[128]; - char *str, *p1, *p2; - - if (strncmp(p, name, strlen(name))) - return 1; - - strcpy(option, p); - p = option; - - str = strstr(p, name); - if (!str) - return 1; - - p += strlen(name); - - str = strchr(p, '='); - if (!str) - return 1; - - /* - * 'p' now holds whatever is after the '=' sign - */ - p1 = str + 1; - - /* - * terminate p1 at the '-' sign - */ - p = strchr(p1, '-'); - if (!p) - return 1; - - p2 = p + 1; - *p = '\0'; - - if (!__check_range_bytes(p1, s) && !__check_range_bytes(p2, e)) - return 0; - - return 1; -} - -static int check_int(char *p, char *name, unsigned int *val) -{ - char *str; - - if (strncmp(p, name, strlen(name))) - return 1; - - str = strstr(p, name); - if (!str) - return 1; - - str = strchr(p, '='); - if (!str) - return 1; - - str++; - - if (sscanf(str, "%u", val) == 1) - return 0; - - return 1; -} - -static int check_strset(char *p, char *name) -{ - return strncmp(p, name, strlen(name)); -} - static int is_empty_or_comment(char *line) { unsigned int i; @@ -574,8 +350,10 @@ static int is_empty_or_comment(char *line) return 1; } -static int str_rw_cb(struct thread_data *td, char *mem) +static int str_rw_cb(void *data, char *mem) { + struct thread_data *td = data; + if (!strncmp(mem, "read", 4) || !strncmp(mem, "0", 1)) { td->ddir = DDIR_READ; td->sequential = 1; @@ -608,8 +386,10 @@ static int str_rw_cb(struct thread_data *td, char *mem) return 1; } -static int str_verify_cb(struct thread_data *td, char *mem) +static int str_verify_cb(void *data, char *mem) { + struct thread_data *td = data; + if (!strncmp(mem, "0", 1)) { td->verify = VERIFY_NONE; return 0; @@ -625,8 +405,10 @@ static int str_verify_cb(struct thread_data *td, char *mem) return 1; } -static int str_mem_cb(struct thread_data *td, char *mem) +static int str_mem_cb(void *data, char *mem) { + struct thread_data *td = data; + if (!strncmp(mem, "malloc", 6)) { td->mem_type = MEM_MALLOC; return 0; @@ -642,8 +424,10 @@ static int str_mem_cb(struct thread_data *td, char *mem) return 1; } -static int str_ioengine_cb(struct thread_data *td, char *str) +static int str_ioengine_cb(void *data, char *str) { + struct thread_data *td = data; + td->io_ops = load_ioengine(td, str); if (td->io_ops) return 0; diff --git a/parse.c b/parse.c new file mode 100644 index 00000000..82cdf8a7 --- /dev/null +++ b/parse.c @@ -0,0 +1,234 @@ +/* + * This file contains the ini and command liner parser main. + */ +#include +#include +#include +#include +#include +#include +#include + +#include "parse.h" + +static unsigned long get_mult_time(char c) +{ + 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; + } +} + +static unsigned long get_mult_bytes(char c) +{ + switch (c) { + case 'k': + case 'K': + return 1024; + case 'm': + case 'M': + return 1024 * 1024; + case 'g': + case 'G': + return 1024 * 1024 * 1024; + default: + return 1; + } +} + +/* + * convert string after '=' into decimal value, noting any size suffix + */ +static int str_to_decimal(char *p, unsigned long long *val, int kilo) +{ + char *str; + int len; + + str = strchr(p, '='); + if (!str) + return 1; + + str++; + len = strlen(str); + + *val = strtoul(str, NULL, 10); + if (*val == ULONG_MAX && errno == ERANGE) + return 1; + + if (kilo) + *val *= get_mult_bytes(str[len - 1]); + else + *val *= get_mult_time(str[len - 1]); + return 0; +} + +int check_str_bytes(char *p, char *name, unsigned long long *val) +{ + if (strncmp(p, name, strlen(name) - 1)) + return 1; + + return str_to_decimal(p, val, 1); +} + +int check_str_time(char *p, char *name, unsigned long long *val) +{ + if (strncmp(p, name, strlen(name) - 1)) + return 1; + + return str_to_decimal(p, val, 0); +} + +void strip_blank_front(char **p) +{ + char *s = *p; + + while (isspace(*s)) + s++; +} + +void strip_blank_end(char *p) +{ + char *s = p + strlen(p) - 1; + + while (isspace(*s) || iscntrl(*s)) + s--; + + *(s + 1) = '\0'; +} + +int check_str(char *p, char *name, str_cb_fn *cb, void *data) +{ + char *s; + + if (strncmp(p, name, strlen(name))) + return 1; + + s = strstr(p, name); + if (!s) + return 1; + + s = strchr(s, '='); + if (!s) + return 1; + + s++; + strip_blank_front(&s); + return cb(data, s); +} + +int check_strstore(char *p, char *name, char *dest) +{ + char *s; + + if (strncmp(p, name, strlen(name))) + return 1; + + s = strstr(p, name); + if (!s) + return 1; + + s = strchr(p, '='); + if (!s) + return 1; + + s++; + strip_blank_front(&s); + + strcpy(dest, s); + return 0; +} + +static int __check_range_bytes(char *str, unsigned long *val) +{ + char suffix; + + if (sscanf(str, "%lu%c", val, &suffix) == 2) { + *val *= get_mult_bytes(suffix); + return 0; + } + + if (sscanf(str, "%lu", val) == 1) + return 0; + + return 1; +} + +int check_range_bytes(char *p, char *name, unsigned long *s, unsigned long *e) +{ + char option[128]; + char *str, *p1, *p2; + + if (strncmp(p, name, strlen(name))) + return 1; + + strcpy(option, p); + p = option; + + str = strstr(p, name); + if (!str) + return 1; + + p += strlen(name); + + str = strchr(p, '='); + if (!str) + return 1; + + /* + * 'p' now holds whatever is after the '=' sign + */ + p1 = str + 1; + + /* + * terminate p1 at the '-' sign + */ + p = strchr(p1, '-'); + if (!p) + return 1; + + p2 = p + 1; + *p = '\0'; + + if (!__check_range_bytes(p1, s) && !__check_range_bytes(p2, e)) + return 0; + + return 1; +} + +int check_int(char *p, char *name, unsigned int *val) +{ + char *str; + + if (strncmp(p, name, strlen(name))) + return 1; + + str = strstr(p, name); + if (!str) + return 1; + + str = strchr(p, '='); + if (!str) + return 1; + + str++; + + if (sscanf(str, "%u", val) == 1) + return 0; + + return 1; +} + +int check_strset(char *p, char *name) +{ + return strncmp(p, name, strlen(name)); +} +