+ printf("No such command: %s", name);
+
+ /*
+ * Only print an appropriately close option, one where the edit
+ * distance isn't too big. Otherwise we get crazy matches.
+ */
+ if (closest && best_dist < 3) {
+ printf(" - showing closest match\n");
+ printf("%20s: %s\n", closest->name, closest->help);
+ show_option_help(closest, stdout);
+ } else
+ printf("\n");
+
+ return 1;
+}
+
+/*
+ * Handle parsing of default parameters.
+ */
+void fill_default_options(void *data, struct fio_option *options)
+{
+ struct fio_option *o;
+
+ dprint(FD_PARSE, "filling default options\n");
+
+ for (o = &options[0]; o->name; o++)
+ if (o->def)
+ handle_option(o, o->def, data);
+}
+
+void option_init(struct fio_option *o)
+{
+ if (o->type == FIO_OPT_DEPRECATED)
+ return;
+ if (o->type == FIO_OPT_BOOL) {
+ o->minval = 0;
+ o->maxval = 1;
+ }
+ if (o->type == FIO_OPT_STR_SET && o->def) {
+ fprintf(stderr, "Option %s: string set option with"
+ " default will always be true\n", o->name);
+ }
+ if (!o->cb && (!o->off1 && !o->roff1)) {
+ fprintf(stderr, "Option %s: neither cb nor offset given\n",
+ o->name);
+ }
+ if (o->type == FIO_OPT_STR || o->type == FIO_OPT_STR_STORE ||
+ o->type == FIO_OPT_STR_MULTI)
+ return;
+ if (o->cb && ((o->off1 || o->off2 || o->off3 || o->off4) ||
+ (o->roff1 || o->roff2 || o->roff3 || o->roff4))) {
+ fprintf(stderr, "Option %s: both cb and offset given\n",
+ o->name);
+ }
+}
+
+/*
+ * Sanitize the options structure. For now it just sets min/max for bool
+ * values and whether both callback and offsets are given.
+ */
+void options_init(struct fio_option *options)
+{
+ struct fio_option *o;
+
+ dprint(FD_PARSE, "init options\n");
+
+ for (o = &options[0]; o->name; o++)
+ option_init(o);