From 215e90d348b10ffaa11b2a613388adc9285ea65a Mon Sep 17 00:00:00 2001 From: Lars Henriksen Date: Sat, 10 Nov 2018 09:46:53 +0100 Subject: Command line options: -P, option check, usage, help Option -F/--filter renamed to -P/--purge; -F retained as deprecated. Check for non-option arguments and for filter, format and query-range options only. Update of help and usage messages. Fixed --status output when calcurse is not running. Signed-off-by: Lukas Fleischer --- src/args.c | 94 +++++++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 69 insertions(+), 25 deletions(-) diff --git a/src/args.c b/src/args.c index be77957..fdcf404 100644 --- a/src/args.c +++ b/src/args.c @@ -82,9 +82,11 @@ enum { */ static void usage(void) { - printf("%s\n", _("usage: calcurse [--daemon|-F|-G|-g|-i|-Q|--status|-x[]]\n" - " [-c] [-C] [-D] [-h] [-q] [--read-only] [-v]\n" - " [--filter-*] [--format-*]")); + printf("%s\n", _("Usage:\n" + "calcurse [-D ] [-C ] [-c ]\n" + "calcurse -Q [--from ] [--to ] [--days ]\n" + "calcurse -a | -d | -d | -n | -r[] | -s[] | -t[]\n" + "calcurse -h | -v | --status | -G | -P | -g | -i | -x[] | --daemon")); } static void usage_try(void) @@ -110,27 +112,37 @@ static void help_arg(void) { usage(); putchar('\n'); - printf("%s\n", _("Operations in non-interactive mode:")); - printf("%s\n", _(" -F, --filter Read items, filter them, and write them back")); - printf("%s\n", _(" -G, --grep Grep items from the data files")); + printf("%s\n", _("Operations in command line mode:")); printf("%s\n", _(" -Q, --query Print items in a given query range")); + printf("%s\n", _(" -G, --grep Grep items from the data files")); + printf("%s\n", _(" -P, --purge Read items and write them back")); + printf("%s\n", _("Query short forms:\n" + "-a, -d |, -n, -r[], -s[], -t")); putchar('\n'); - printf("%s\n", _("Note that -F, -G and -Q can be combined with filter options --filter-*\n" - "and formatting options --format-*. Consult the man page for details.")); + printf("%s\n", _("Note that filter, format and day-range options affect input or output:")); + printf("%s\n", _(" --filter-* Filter items loaded by -Q, -G, -P and -x")); + printf("%s\n", _(" --format-* Rewrite output from -Q, -G and --dump-imported")); + printf("%s\n", _(" --from Limit day range of -Q.")); + printf("%s\n", _(" --to Limit day range of -Q.")); + printf("%s\n", _(" --days Limit day range of -Q.")); + putchar('\n'); + printf("%s\n", _(" --limit, -l Limit number of query results")); + printf("%s\n", _(" --search, -S Match regular expression in queries")); + printf("%s\n", _("Consult the man page for details.")); putchar('\n'); printf("%s\n", _("Miscellaneous:")); - printf("%s\n", _(" -c, --calendar Specify the calendar data file to use")); - printf("%s\n", _(" -C, --conf Specify the configuration path to use")); + printf("%s\n", _(" -c, --calendar The calendar data file to use")); + printf("%s\n", _(" -C, --conf The configuration directory to use")); printf("%s\n", _(" --daemon Run notification daemon in the background")); - printf("%s\n", _(" -D, --directory Specify the data directory to use")); - printf("%s\n", _(" -g, --gc Run the garbage collector and exit")); - printf("%s\n", _(" -h, --help Show this help text and exit")); - printf("%s\n", _(" -i, --import Import iCal data from a file")); - printf("%s\n", _(" -q, --quiet Do not show system dialogs")); + printf("%s\n", _(" -D, --directory The data directory to use")); + printf("%s\n", _(" -g, --gc Run the garbage collector")); + printf("%s\n", _(" -h, --help Show this help text")); + printf("%s\n", _(" -i, --import Import iCal data from file")); + printf("%s\n", _(" -q, --quiet Suppress system dialogs")); printf("%s\n", _(" --read-only Do not save configuration or data files")); - printf("%s\n", _(" --status Display the status of running instances")); - printf("%s\n", _(" -v, --version Show version information and exit")); - printf("%s\n", _(" -x, --export [] Export items, valid formats: ical, pcal")); + printf("%s\n", _(" --status Display status of running instances")); + printf("%s\n", _(" -v, --version Show version information")); + printf("%s\n", _(" -x, --export[] Export to stdout in ical (default) or pcal format")); putchar('\n'); printf("%s\n", _("For more information, type '?' from within calcurse, or read the manpage.")); printf("%s\n", _("Submit feature requests and suggestions to .")); @@ -168,7 +180,7 @@ static void status_arg(void) _("calcurse is running in background (pid %d)\n"), dpid); else - puts(_("calcurse is not running\n")); + puts(_("calcurse is not running")); } /* Print TODO list and return the number of printed items. */ @@ -387,8 +399,9 @@ cleanup: int parse_args(int argc, char **argv) { /* Command-line flags */ - int grep = 0, grep_filter = 0, query = 0, next = 0; + int grep = 0, purge = 0, query = 0, next = 0; int status = 0, gc = 0, import = 0, export = 0, daemon = 0; + int filter_opt = 0, format_opt = 0, query_range = 0; /* Query ranges */ time_t from = -1, to = -1; int range = 0; @@ -412,7 +425,7 @@ int parse_args(int argc, char **argv) int ch; regex_t reg; - static const char *optstr = "FgGhvnNax::t::C:d:c:r::s::S:D:i:l:qQ"; + static const char *optstr = "PFgGhvnNax::t::C:d:c:r::s::S:D:i:l:qQ"; struct option longopts[] = { {"appointment", no_argument, NULL, 'a'}, @@ -428,6 +441,7 @@ int parse_args(int argc, char **argv) {"limit", required_argument, NULL, 'l'}, {"next", no_argument, NULL, 'n'}, {"note", no_argument, NULL, 'N'}, + {"purge", no_argument, NULL, 'P'}, {"range", optional_argument, NULL, 'r'}, {"startday", optional_argument, NULL, 's'}, {"search", required_argument, NULL, 'S'}, @@ -500,7 +514,7 @@ int parse_args(int argc, char **argv) datadir = optarg; break; case 'F': - grep_filter = grep = 1; + purge = grep = 1; break; case 'h': help_arg(); @@ -521,6 +535,9 @@ int parse_args(int argc, char **argv) case 'n': next = 1; break; + case 'P': + purge = grep = 1; + break; case 'r': if (optarg) range = atoi(optarg); @@ -580,9 +597,11 @@ int parse_args(int argc, char **argv) filter.type_mask = parse_type_mask(optarg); EXIT_IF(filter.type_mask == 0, _("invalid filter mask")); + filter_opt = 1; break; case OPT_FILTER_HASH: filter.hash = mem_strdup(optarg); + filter_opt = 1; break; case 'S': case OPT_FILTER_PATTERN: @@ -591,94 +610,116 @@ int parse_args(int argc, char **argv) if (regcomp(®, optarg, REG_EXTENDED)) EXIT(_("could not compile regular expression: %s"), optarg); filter.regex = ® + filter_opt = 1; break; case OPT_FILTER_START_FROM: filter.start_from = parse_datetimearg(optarg); EXIT_IF(filter.start_from == -1, _("invalid date: %s"), optarg); + filter_opt = 1; break; case OPT_FILTER_START_TO: filter.start_to = parse_datetimearg(optarg); EXIT_IF(filter.start_to == -1, _("invalid date: %s"), optarg); + filter_opt = 1; break; case OPT_FILTER_START_AFTER: filter.start_from = parse_datetimearg(optarg) + 1; EXIT_IF(filter.start_from == -1, _("invalid date: %s"), optarg); + filter_opt = 1; break; case OPT_FILTER_START_BEFORE: filter.start_to = parse_datetimearg(optarg) - 1; EXIT_IF(filter.start_to == -1, _("invalid date: %s"), optarg); + filter_opt = 1; break; case OPT_FILTER_START_RANGE: EXIT_IF(!parse_daterange(optarg, &filter.start_from, &filter.start_to), _("invalid date range: %s"), optarg); + filter_opt = 1; break; case OPT_FILTER_END_FROM: filter.end_from = parse_datetimearg(optarg); EXIT_IF(filter.end_from == -1, _("invalid date: %s"), optarg); + filter_opt = 1; break; case OPT_FILTER_END_TO: filter.end_to = parse_datetimearg(optarg); EXIT_IF(filter.end_to == -1, _("invalid date: %s"), optarg); + filter_opt = 1; break; case OPT_FILTER_END_AFTER: filter.end_from = parse_datetimearg(optarg) + 1; EXIT_IF(filter.end_from == -1, _("invalid date: %s"), optarg); + filter_opt = 1; break; case OPT_FILTER_END_BEFORE: filter.end_to = parse_datetimearg(optarg) - 1; EXIT_IF(filter.end_to == -1, _("invalid date: %s"), optarg); + filter_opt = 1; break; case OPT_FILTER_END_RANGE: EXIT_IF(!parse_daterange(optarg, &filter.end_from, &filter.end_to), _("invalid date range: %s"), optarg); + filter_opt = 1; break; case OPT_FILTER_PRIORITY: filter.priority = atoi(optarg); EXIT_IF(filter.priority < 1 || filter.priority > 9, _("invalid priority: %s"), optarg); + filter_opt = 1; break; case OPT_FILTER_COMPLETED: filter.completed = 1; + filter_opt = 1; break; case OPT_FILTER_UNCOMPLETED: filter.uncompleted = 1; + filter_opt = 1; break; case OPT_FROM: from = parse_datetimearg(optarg); EXIT_IF(from == -1, _("invalid date: %s"), optarg); + query_range = 1; break; case OPT_TO: to = parse_datetimearg(optarg); EXIT_IF(to == -1, _("invalid date: %s"), optarg); + query_range = 1; break; case OPT_DAYS: range = atoi(optarg); EXIT_IF(range == 0, _("invalid range: %s"), optarg); + query_range = 1; break; case OPT_FMT_APT: fmt_apt = optarg; + format_opt = 1; break; case OPT_FMT_RAPT: fmt_rapt = optarg; + format_opt = 1; break; case OPT_FMT_EV: fmt_ev = optarg; + format_opt = 1; break; case OPT_FMT_REV: fmt_rev = optarg; + format_opt = 1; break; case OPT_FMT_TODO: fmt_todo = optarg; + format_opt = 1; break; case OPT_DUMP_IMPORTED: dump_imported = 1; @@ -701,12 +742,15 @@ int parse_args(int argc, char **argv) goto cleanup; } } - argc -= optind; if (filter.type_mask == 0) filter.type_mask = TYPE_MASK_ALL; - if (status + grep + query + next + gc + import + export + daemon > 1) { + if (status + grep + query + next + gc + import + export + daemon > 1 || + optind < argc || + (filter_opt && !(grep + query + export)) || + (format_opt && !(grep + query + dump_imported)) || + (query_range && !query)) { ERROR_MSG(_("invalid argument combination")); usage(); usage_try(); @@ -739,7 +783,7 @@ int parse_args(int argc, char **argv) io_check_file(path_conf); config_load(); /* To get output date format. */ io_load_data(&filter, FORCE); - if (grep_filter) { + if (purge) { io_save_todo(path_todo); io_save_apts(path_apts); } else { -- cgit v1.2.3