summaryrefslogtreecommitdiff
path: root/parse.h
blob: 54e3948338fb5c2ab9a8c5921c2eaddc353dee83 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#ifndef FIO_PARSE_H
#define FIO_PARSE_H

#include <inttypes.h>
#include "flist.h"

/*
 * Option types
 */
enum fio_opt_type {
	FIO_OPT_INVALID = 0,
	FIO_OPT_STR,
	FIO_OPT_STR_MULTI,
	FIO_OPT_STR_VAL,
	FIO_OPT_STR_VAL_TIME,
	FIO_OPT_STR_STORE,
	FIO_OPT_RANGE,
	FIO_OPT_INT,
	FIO_OPT_BOOL,
	FIO_OPT_FLOAT_LIST,
	FIO_OPT_STR_SET,
	FIO_OPT_DEPRECATED,
	FIO_OPT_UNSUPPORTED,
};

/*
 * Match a possible value string with the integer option.
 */
struct value_pair {
	const char *ival;		/* string option */
	unsigned int oval;		/* output value */
	const char *help;		/* help text for sub option */
	int orval;			/* OR value */
	void *cb;			/* sub-option callback */
};

#define OPT_LEN_MAX 	4096
#define PARSE_MAX_VP	24

/*
 * Option define
 */
struct fio_option {
	const char *name;		/* option name */
	const char *lname;		/* long option name */
	const char *alias;		/* possible old allowed name */
	enum fio_opt_type type;		/* option type */
	unsigned int off1;		/* potential parameters */
	unsigned int off2;
	unsigned int off3;
	unsigned int off4;
	unsigned int off5;
	unsigned int off6;
	unsigned int maxval;		/* max and min value */
	int minval;
	double maxfp;			/* max and min floating value */
	double minfp;
	unsigned int interval;		/* client hint for suitable interval */
	unsigned int maxlen;		/* max length */
	int neg;			/* negate value stored */
	int prio;
	void *cb;			/* callback */
	const char *help;		/* help text for option */
	const char *def;		/* default setting */
	struct value_pair posval[PARSE_MAX_VP];/* possible values */
	const char *parent;		/* parent option */
	int hide;			/* hide if parent isn't set */
	int hide_on_set;		/* hide on set, not on unset */
	const char *inverse;		/* if set, apply opposite action to this option */
	struct fio_option *inv_opt;	/* cached lookup */
	int (*verify)(struct fio_option *, void *);
	const char *prof_name;		/* only valid for specific profile */
	void *prof_opts;
	uint64_t category;		/* what type of option */
	uint64_t group;			/* who to group with */
	void *gui_data;
	int is_seconds;			/* time value with seconds base */
	int is_time;			/* time based value */
	int no_warn_def;
	int pow2;			/* must be a power-of-2 */
};

extern int parse_option(char *, const char *, struct fio_option *, struct fio_option **, void *, struct flist_head *);
extern void sort_options(char **, struct fio_option *, int);
extern int parse_cmd_option(const char *t, const char *l, struct fio_option *, void *, struct flist_head *);
extern int show_cmd_help(struct fio_option *, const char *);
extern void fill_default_options(void *, struct fio_option *);
extern void options_init(struct fio_option *);
extern void options_mem_dupe(struct fio_option *, void *);
extern void options_free(struct fio_option *, void *);

extern void strip_blank_front(char **);
extern void strip_blank_end(char *);
extern int str_to_decimal(const char *, long long *, int, void *, int, int);
extern int check_str_bytes(const char *p, long long *val, void *data);
extern int check_str_time(const char *p, long long *val, int);
extern int str_to_float(const char *str, double *val, int is_time);

extern int string_distance(const char *s1, const char *s2);
extern int string_distance_ok(const char *s1, int dist);

/*
 * Handlers for the options
 */
typedef int (fio_opt_str_fn)(void *, const char *);
typedef int (fio_opt_str_val_fn)(void *, long long *);
typedef int (fio_opt_int_fn)(void *, int *);

struct thread_options;
static inline void *td_var(struct thread_options *to, struct fio_option *o,
			   unsigned int offset)
{
	void *ret;

	if (o->prof_opts)
		ret = o->prof_opts;
	else
		ret = to;

	return (char *) ret + offset;
}

static inline int parse_is_percent(unsigned long long val)
{
	return val <= -1ULL && val >= (-1ULL - 100ULL);
}

struct print_option {
	struct flist_head list;
	char *name;
	char *value;
};

#endif