--- SIDPlayer/src/prefs.cpp 2001/01/04 19:54:13 1.2 +++ SIDPlayer/src/prefs.cpp 2001/01/16 16:53:26 1.3 @@ -61,10 +61,21 @@ void PrefsInit(int argc, char **argv) if (strlen(*argv) < 3 || argv[0][0] != '-' || argv[0][1] != '-') continue; const char *keyword = *argv + 2; + + // Find descriptor for keyword const prefs_desc *d = find_prefs_desc(keyword); + bool negated_bool = false; if (d == NULL) { - printf("WARNING: Unrecognized argument '%s'\n", *argv); - continue; + // We also accept boolean arguments in the form '--nokeyword' + if (strncmp(keyword, "no", 2) == 0) { + negated_bool = true; + keyword += 2; + d = find_prefs_desc(keyword); + } + if (d == NULL) { + printf("WARNING: Unrecognized argument '%s'\n", *argv); + continue; + } } // Add/replace prefs item @@ -81,13 +92,24 @@ void PrefsInit(int argc, char **argv) PrefsReplaceString(keyword, *argv); break; - case TYPE_BOOLEAN: - if (argc > 1 && argv[1][0] != '-') { - argc--; argv++; - PrefsReplaceBool(keyword, !strcmp(*argv, "true") || !strcmp(*argv, "on")); + case TYPE_BOOLEAN: { + bool new_value; + if (negated_bool) + new_value = false; + else if (argc > 1 && argv[1][0] != '-') { + if (!strcmp(argv[1], "true") || !strcmp(argv[1], "on") || !strcmp(argv[1], "yes")) { + new_value = true; + argc--; argv++; + } else if (!strcmp(argv[1], "false") || !strcmp(argv[1], "off") || !strcmp(argv[1], "no")) { + new_value = false; + argc--; argv++; + } else + new_value = true; } else - PrefsReplaceBool(keyword, true); + new_value = true; + PrefsReplaceBool(keyword, new_value); break; + } case TYPE_INT32: if (argc < 2) { @@ -124,12 +146,60 @@ void PrefsExit(void) /* + * Print preferences options help + */ + +static void print_options(const prefs_desc *list) +{ + while (list->type != TYPE_END) { + if (list->help) { + const char *typestr, *defstr; + char numstr[32]; + switch (list->type) { + case TYPE_STRING: + typestr = "STRING"; + defstr = PrefsFindString(list->name); + if (defstr == NULL) + defstr = "none"; + break; + case TYPE_BOOLEAN: + typestr = "BOOL"; + if (PrefsFindBool(list->name)) + defstr = "true"; + else + defstr = "false"; + break; + case TYPE_INT32: + typestr = "NUMBER"; + sprintf(numstr, "%d", PrefsFindInt32(list->name)); + defstr = numstr; + break; + default: + typestr = ""; + defstr = "none"; + break; + } + printf(" --%s %s\n %s [default=%s]\n", list->name, typestr, list->help, defstr); + } + list++; + } +} + +void PrefsPrintUsage(void) +{ + printf("\nGeneral options:\n"); + print_options(common_prefs_items); + printf("\nBoolean options can be specified as '--OPTION true|on|yes' and\n'--OPTION false|off|no', or as '--OPTION' and '--noOPTION'.\n"); +} + + +/* * Find preferences descriptor by keyword */ static prefs_desc *find_prefs_desc(const char *name, prefs_desc *list) { - while (list->type != TYPE_ANY) { + while (list->type != TYPE_END) { if (strcmp(list->name, name) == 0) return list; list++;