diff options
Diffstat (limited to 'src/args.c')
-rw-r--r-- | src/args.c | 1107 |
1 files changed, 566 insertions, 541 deletions
@@ -46,12 +46,12 @@ /* Long options */ enum { - OPT_FMT_APT = 1000, - OPT_FMT_RAPT, - OPT_FMT_EV, - OPT_FMT_REV, - OPT_FMT_TODO, - OPT_READ_ONLY + OPT_FMT_APT = 1000, + OPT_FMT_RAPT, + OPT_FMT_EV, + OPT_FMT_REV, + OPT_FMT_TODO, + OPT_READ_ONLY }; /* @@ -59,18 +59,19 @@ enum { */ static void usage(void) { - const char *arg_usage = - _("Usage: calcurse [-g|-h|-v] [-an] [-t[num]] [-i<file>] [-x[format]]\n" - " [-d <date>|<num>] [-s[date]] [-r[range]]\n" - " [-c<file>] [-D<dir>] [-S<regex>] [--status]\n" - " [--read-only]\n"); - fputs(arg_usage, stdout); + const char *arg_usage = + _("Usage: calcurse [-g|-h|-v] [-an] [-t[num]] [-i<file>] [-x[format]]\n" + " [-d <date>|<num>] [-s[date]] [-r[range]]\n" + " [-c<file>] [-D<dir>] [-S<regex>] [--status]\n" + " [--read-only]\n"); + fputs(arg_usage, stdout); } static void usage_try(void) { - const char *arg_usage_try = _("Try 'calcurse -h' for more information.\n"); - fputs(arg_usage_try, stdout); + const char *arg_usage_try = + _("Try 'calcurse -h' for more information.\n"); + fputs(arg_usage_try, stdout); } /* @@ -78,21 +79,22 @@ static void usage_try(void) */ static void version_arg(void) { - const char *vtext = - _("\nCopyright (c) 2004-2013 calcurse Development Team.\n" - "This is free software; see the source for copying conditions.\n"); + const char *vtext = + _("\nCopyright (c) 2004-2013 calcurse Development Team.\n" + "This is free software; see the source for copying conditions.\n"); - fprintf(stdout, _("Calcurse %s - text-based organizer\n"), VERSION); - fputs(vtext, stdout); + fprintf(stdout, _("Calcurse %s - text-based organizer\n"), + VERSION); + fputs(vtext, stdout); } static void more_info(void) { - fputs(_("\nFor more information, type '?' from within Calcurse, " - "or read the manpage.\n"), stdout); - fputs(_("Mail feature requests and suggestions to <misc@calcurse.org>.\n"), - stdout); - fputs(_("Mail bug reports to <bugs@calcurse.org>.\n"), stdout); + fputs(_("\nFor more information, type '?' from within Calcurse, " + "or read the manpage.\n"), stdout); + fputs(_("Mail feature requests and suggestions to <misc@calcurse.org>.\n"), + stdout); + fputs(_("Mail bug reports to <bugs@calcurse.org>.\n"), stdout); } /* @@ -100,65 +102,66 @@ static void more_info(void) */ static void help_arg(void) { - const char *htext = - _("\nMiscellaneous:\n" - " -h, --help\n" - " print this help and exit.\n" - "\n -v, --version\n" - " print calcurse version and exit.\n" - "\n --status\n" - " display the status of running instances of calcurse.\n" - "\n --read-only\n" - " Don't save configuration nor appointments/todos. Use with care.\n" - "\nFiles:\n" - " -c <file>, --calendar <file>\n" - " specify the calendar <file> to use (has precedence over '-D').\n" - "\n -D <dir>, --directory <dir>\n" - " specify the data directory to use.\n" - "\tIf not specified, the default directory is ~/.calcurse\n" - "\nNon-interactive:\n" - " -a, --appointment\n" - " print events and appointments for current day and exit.\n" - "\n -d <date|num>, --day <date|num>\n" - " print events and appointments for <date> or <num> upcoming days and" - "\n\texit. To specify both a starting date and a range, use the\n" - "\t'--startday' and the '--range' option.\n" - "\n -g, --gc\n" - " run the garbage collector for note files and exit. \n" - "\n -i <file>, --import <file>\n" - " import the icalendar data contained in <file>. \n" - "\n -n, --next\n" - " print next appointment within upcoming 24 hours " - "and exit. Also given\n\tis the remaining time before this " - "next appointment.\n" - "\n -r[num], --range[=num]\n" - " print events and appointments for the [num] number of days" - "\n\tand exit. If no [num] is given, a range of 1 day is considered.\n" - "\n -s[date], --startday[=date]\n" - " print events and appointments from [date] and exit.\n" - "\tIf no [date] is given, the current day is considered.\n" - "\n -S<regex>, --search=<regex>\n" - " search for the given regular expression within events, appointments,\n" - "\tand todos description.\n" - "\n -t[num], --todo[=num]\n" - " print todo list and exit. If the optional number [num] is given,\n" - "\tthen only todos having a priority equal to [num] will be returned.\n" - "\tThe priority number must be between 1 (highest) and 9 (lowest).\n" - "\tIt is also possible to specify '0' for the priority, in which case\n" - "\tonly completed tasks will be shown.\n" - "\n -x[format], --export[=format]\n" - " export user data to the specified format. Events, appointments and\n" - "\ttodos are converted and echoed to stdout.\n" - "\tTwo possible formats are available: 'ical' and 'pcal'.\n" - "\tIf the optional argument format is not given, ical format is\n" - "\tselected by default.\n" - "\tnote: redirect standard output to export data to a file,\n" - "\tby issuing a command such as: calcurse --export > calcurse.dat\n"); - - fprintf(stdout, _("Calcurse %s - text-based organizer\n"), VERSION); - usage(); - fputs(htext, stdout); - more_info(); + const char *htext = + _("\nMiscellaneous:\n" + " -h, --help\n" + " print this help and exit.\n" + "\n -v, --version\n" + " print calcurse version and exit.\n" + "\n --status\n" + " display the status of running instances of calcurse.\n" + "\n --read-only\n" + " Don't save configuration nor appointments/todos. Use with care.\n" + "\nFiles:\n" + " -c <file>, --calendar <file>\n" + " specify the calendar <file> to use (has precedence over '-D').\n" + "\n -D <dir>, --directory <dir>\n" + " specify the data directory to use.\n" + "\tIf not specified, the default directory is ~/.calcurse\n" + "\nNon-interactive:\n" + " -a, --appointment\n" + " print events and appointments for current day and exit.\n" + "\n -d <date|num>, --day <date|num>\n" + " print events and appointments for <date> or <num> upcoming days and" + "\n\texit. To specify both a starting date and a range, use the\n" + "\t'--startday' and the '--range' option.\n" + "\n -g, --gc\n" + " run the garbage collector for note files and exit. \n" + "\n -i <file>, --import <file>\n" + " import the icalendar data contained in <file>. \n" + "\n -n, --next\n" + " print next appointment within upcoming 24 hours " + "and exit. Also given\n\tis the remaining time before this " + "next appointment.\n" + "\n -r[num], --range[=num]\n" + " print events and appointments for the [num] number of days" + "\n\tand exit. If no [num] is given, a range of 1 day is considered.\n" + "\n -s[date], --startday[=date]\n" + " print events and appointments from [date] and exit.\n" + "\tIf no [date] is given, the current day is considered.\n" + "\n -S<regex>, --search=<regex>\n" + " search for the given regular expression within events, appointments,\n" + "\tand todos description.\n" + "\n -t[num], --todo[=num]\n" + " print todo list and exit. If the optional number [num] is given,\n" + "\tthen only todos having a priority equal to [num] will be returned.\n" + "\tThe priority number must be between 1 (highest) and 9 (lowest).\n" + "\tIt is also possible to specify '0' for the priority, in which case\n" + "\tonly completed tasks will be shown.\n" + "\n -x[format], --export[=format]\n" + " export user data to the specified format. Events, appointments and\n" + "\ttodos are converted and echoed to stdout.\n" + "\tTwo possible formats are available: 'ical' and 'pcal'.\n" + "\tIf the optional argument format is not given, ical format is\n" + "\tselected by default.\n" + "\tnote: redirect standard output to export data to a file,\n" + "\tby issuing a command such as: calcurse --export > calcurse.dat\n"); + + fprintf(stdout, _("Calcurse %s - text-based organizer\n"), + VERSION); + usage(); + fputs(htext, stdout); + more_info(); } /* @@ -174,22 +177,25 @@ static void help_arg(void) */ static void status_arg(void) { - int cpid, dpid; - - cpid = io_get_pid(path_cpid); - dpid = io_get_pid(path_dpid); - - EXIT_IF(cpid && dpid, - _("Error: both calcurse (pid: %d) and its daemon (pid: %d)\n" - "seem to be running at the same time!\n" - "Please check manually and restart calcurse.\n"), cpid, dpid); - - if (cpid) - fprintf(stdout, _("calcurse is running (pid %d)\n"), cpid); - else if (dpid) - fprintf(stdout, _("calcurse is running in background (pid %d)\n"), dpid); - else - puts(_("calcurse is not running\n")); + int cpid, dpid; + + cpid = io_get_pid(path_cpid); + dpid = io_get_pid(path_dpid); + + EXIT_IF(cpid && dpid, + _("Error: both calcurse (pid: %d) and its daemon (pid: %d)\n" + "seem to be running at the same time!\n" + "Please check manually and restart calcurse.\n"), cpid, + dpid); + + if (cpid) + fprintf(stdout, _("calcurse is running (pid %d)\n"), cpid); + else if (dpid) + fprintf(stdout, + _("calcurse is running in background (pid %d)\n"), + dpid); + else + puts(_("calcurse is not running\n")); } /* @@ -201,13 +207,13 @@ static void status_arg(void) */ static void todo_arg(int priority, const char *format, regex_t * regex) { - llist_item_t *i; - int title = 1; - const char *titlestr; - const char *all_todos_title = _("to do:\n"); - const char *completed_title = _("completed tasks:\n"); + llist_item_t *i; + int title = 1; + const char *titlestr; + const char *all_todos_title = _("to do:\n"); + const char *completed_title = _("completed tasks:\n"); - titlestr = priority == 0 ? completed_title : all_todos_title; + titlestr = priority == 0 ? completed_title : all_todos_title; #define DISPLAY_TITLE do { \ if (title) \ @@ -217,23 +223,23 @@ static void todo_arg(int priority, const char *format, regex_t * regex) } \ } while (0) - LLIST_FOREACH(&todolist, i) { - struct todo *todo = LLIST_TS_GET_DATA(i); - if (regex && regexec(regex, todo->mesg, 0, 0, 0) != 0) - continue; - - if (todo->id < 0) { /* completed task */ - if (priority == 0) { - DISPLAY_TITLE; - print_todo(format, todo); - } - } else { - if (priority < 0 || todo->id == priority) { - DISPLAY_TITLE; - print_todo(format, todo); - } - } - } + LLIST_FOREACH(&todolist, i) { + struct todo *todo = LLIST_TS_GET_DATA(i); + if (regex && regexec(regex, todo->mesg, 0, 0, 0) != 0) + continue; + + if (todo->id < 0) { /* completed task */ + if (priority == 0) { + DISPLAY_TITLE; + print_todo(format, todo); + } + } else { + if (priority < 0 || todo->id == priority) { + DISPLAY_TITLE; + print_todo(format, todo); + } + } + } #undef DISPLAY_TITLE } @@ -241,26 +247,27 @@ static void todo_arg(int priority, const char *format, regex_t * regex) /* Print the next appointment within the upcoming 24 hours. */ static void next_arg(void) { - struct notify_app next_app; - const long current_time = now(); - int time_left, hours_left, min_left; - - next_app.time = current_time + DAYINSEC; - next_app.got_app = 0; - next_app.txt = NULL; - - next_app = *recur_apoint_check_next(&next_app, current_time, get_today()); - next_app = *apoint_check_next(&next_app, current_time); - - if (next_app.got_app) { - time_left = next_app.time - current_time; - hours_left = (time_left / HOURINSEC); - min_left = (time_left - hours_left * HOURINSEC) / MININSEC; - fputs(_("next appointment:\n"), stdout); - fprintf(stdout, " [%02d:%02d] %s\n", hours_left, min_left, - next_app.txt); - mem_free(next_app.txt); - } + struct notify_app next_app; + const long current_time = now(); + int time_left, hours_left, min_left; + + next_app.time = current_time + DAYINSEC; + next_app.got_app = 0; + next_app.txt = NULL; + + next_app = + *recur_apoint_check_next(&next_app, current_time, get_today()); + next_app = *apoint_check_next(&next_app, current_time); + + if (next_app.got_app) { + time_left = next_app.time - current_time; + hours_left = (time_left / HOURINSEC); + min_left = (time_left - hours_left * HOURINSEC) / MININSEC; + fputs(_("next appointment:\n"), stdout); + fprintf(stdout, " [%02d:%02d] %s\n", hours_left, + min_left, next_app.txt); + mem_free(next_app.txt); + } } /* @@ -268,13 +275,13 @@ static void next_arg(void) */ static void arg_print_date(long date) { - char date_str[BUFSIZ]; - struct tm lt; + char date_str[BUFSIZ]; + struct tm lt; - localtime_r((time_t *)&date, <); - strftime(date_str, BUFSIZ, conf.output_datefmt, <); - fputs(date_str, stdout); - fputs(":\n", stdout); + localtime_r((time_t *) & date, <); + strftime(date_str, BUFSIZ, conf.output_datefmt, <); + fputs(date_str, stdout); + fputs(":\n", stdout); } /* @@ -285,22 +292,22 @@ static void arg_print_date(long date) */ static int app_arg(int add_line, struct date *day, long date, const char *fmt_apt, - const char *fmt_rapt, const char *fmt_ev, const char *fmt_rev, - regex_t *regex) + const char *fmt_rapt, const char *fmt_ev, const char *fmt_rev, + regex_t * regex) { - if (date == 0) - date = get_sec_date(*day); + if (date == 0) + date = get_sec_date(*day); - int n = day_store_items(date, NULL, NULL, regex); + int n = day_store_items(date, NULL, NULL, regex); - if (n > 0) { - if (add_line) - fputs("\n", stdout); - arg_print_date(date); - day_write_stdout(date, fmt_apt, fmt_rapt, fmt_ev, fmt_rev); - } + if (n > 0) { + if (add_line) + fputs("\n", stdout); + arg_print_date(date); + day_write_stdout(date, fmt_apt, fmt_rapt, fmt_ev, fmt_rev); + } - return n; + return n; } /* @@ -310,23 +317,24 @@ app_arg(int add_line, struct date *day, long date, const char *fmt_apt, */ static void display_app(struct tm *t, int numdays, int add_line, const char *fmt_apt, - const char *fmt_rapt, const char *fmt_ev, const char *fmt_rev, - regex_t * regex) + const char *fmt_rapt, const char *fmt_ev, const char *fmt_rev, + regex_t * regex) { - int i, app_found; - struct date day; - - for (i = 0; i < numdays; i++) { - day.dd = t->tm_mday; - day.mm = t->tm_mon + 1; - day.yyyy = t->tm_year + 1900; - app_found = app_arg(add_line, &day, 0, fmt_apt, fmt_rapt, fmt_ev, - fmt_rev, regex); - if (app_found) - add_line = 1; - t->tm_mday++; - mktime(t); - } + int i, app_found; + struct date day; + + for (i = 0; i < numdays; i++) { + day.dd = t->tm_mday; + day.mm = t->tm_mon + 1; + day.yyyy = t->tm_year + 1900; + app_found = + app_arg(add_line, &day, 0, fmt_apt, fmt_rapt, fmt_ev, + fmt_rev, regex); + if (app_found) + add_line = 1; + t->tm_mday++; + mktime(t); + } } /* @@ -335,39 +343,42 @@ display_app(struct tm *t, int numdays, int add_line, const char *fmt_apt, */ static void date_arg(const char *ddate, int add_line, const char *fmt_apt, - const char *fmt_rapt, const char *fmt_ev, const char *fmt_rev, - regex_t * regex) + const char *fmt_rapt, const char *fmt_ev, const char *fmt_rev, + regex_t * regex) { - struct date day; - static struct tm t; - time_t timer; - - /* - * Check (with the argument length) if a date or a number of days - * was entered, and then call app_arg() to print appointments - */ - if (strlen(ddate) <= 4 && is_all_digit(ddate)) { - /* - * A number of days was entered. Get current date and print appointments - * for each day in the chosen interval. app_found and add_line are used to - * format the output correctly. - */ - timer = time(NULL); - localtime_r(&timer, &t); - display_app(&t, atoi(ddate), add_line, fmt_apt, fmt_rapt, fmt_ev, fmt_rev, - regex); - } else { - /* A date was entered. */ - if (parse_date(ddate, conf.input_datefmt, (int *)&day.yyyy, - (int *)&day.mm, (int *)&day.dd, NULL)) { - app_arg(add_line, &day, 0, fmt_apt, fmt_rapt, fmt_ev, fmt_rev, regex); - } else { - fputs(_("Argument to the '-d' flag is not valid\n"), stderr); - fprintf(stdout, _("Possible argument format are: '%s' or 'n'\n"), - DATEFMT_DESC(conf.input_datefmt)); - more_info(); - } - } + struct date day; + static struct tm t; + time_t timer; + + /* + * Check (with the argument length) if a date or a number of days + * was entered, and then call app_arg() to print appointments + */ + if (strlen(ddate) <= 4 && is_all_digit(ddate)) { + /* + * A number of days was entered. Get current date and print appointments + * for each day in the chosen interval. app_found and add_line are used to + * format the output correctly. + */ + timer = time(NULL); + localtime_r(&timer, &t); + display_app(&t, atoi(ddate), add_line, fmt_apt, fmt_rapt, + fmt_ev, fmt_rev, regex); + } else { + /* A date was entered. */ + if (parse_date(ddate, conf.input_datefmt, (int *)&day.yyyy, + (int *)&day.mm, (int *)&day.dd, NULL)) { + app_arg(add_line, &day, 0, fmt_apt, fmt_rapt, + fmt_ev, fmt_rev, regex); + } else { + fputs(_("Argument to the '-d' flag is not valid\n"), + stderr); + fprintf(stdout, + _("Possible argument format are: '%s' or 'n'\n"), + DATEFMT_DESC(conf.input_datefmt)); + more_info(); + } + } } /* @@ -380,45 +391,48 @@ date_arg(const char *ddate, int add_line, const char *fmt_apt, */ static void date_arg_extended(const char *startday, const char *range, int add_line, - const char *fmt_apt, const char *fmt_rapt, - const char *fmt_ev, const char *fmt_rev, regex_t * regex) + const char *fmt_apt, const char *fmt_rapt, + const char *fmt_ev, const char *fmt_rev, regex_t * regex) { - int numdays = 1, error = 0; - static struct tm t; - time_t timer; - - /* - * Check arguments and extract information - */ - if (range != NULL) { - if (is_all_digit(range)) { - numdays = atoi(range); - } else { - error = 1; - } - } - timer = time(NULL); - localtime_r(&timer, &t); - if (startday != NULL) { - if (parse_date(startday, conf.input_datefmt, (int *)&t.tm_year, - (int *)&t.tm_mon, (int *)&t.tm_mday, NULL)) { - t.tm_year -= 1900; - t.tm_mon--; - mktime(&t); - } else { - error = 1; - } - } - if (!error) { - display_app(&t, numdays, add_line, fmt_apt, fmt_rapt, fmt_ev, fmt_rev, - regex); - } else { - fputs(_("Argument is not valid\n"), stderr); - fprintf(stdout, _("Argument format for -s and --startday is: '%s'\n"), - DATEFMT_DESC(conf.input_datefmt)); - fputs(_("Argument format for -r and --range is: 'n'\n"), stdout); - more_info(); - } + int numdays = 1, error = 0; + static struct tm t; + time_t timer; + + /* + * Check arguments and extract information + */ + if (range != NULL) { + if (is_all_digit(range)) { + numdays = atoi(range); + } else { + error = 1; + } + } + timer = time(NULL); + localtime_r(&timer, &t); + if (startday != NULL) { + if (parse_date + (startday, conf.input_datefmt, (int *)&t.tm_year, + (int *)&t.tm_mon, (int *)&t.tm_mday, NULL)) { + t.tm_year -= 1900; + t.tm_mon--; + mktime(&t); + } else { + error = 1; + } + } + if (!error) { + display_app(&t, numdays, add_line, fmt_apt, fmt_rapt, + fmt_ev, fmt_rev, regex); + } else { + fputs(_("Argument is not valid\n"), stderr); + fprintf(stdout, + _("Argument format for -s and --startday is: '%s'\n"), + DATEFMT_DESC(conf.input_datefmt)); + fputs(_("Argument format for -r and --range is: 'n'\n"), + stdout); + more_info(); + } } /* @@ -427,299 +441,310 @@ date_arg_extended(const char *startday, const char *range, int add_line, */ int parse_args(int argc, char **argv) { - int ch, add_line = 0; - int unknown_flag = 0; - /* Command-line flags */ - int aflag = 0; /* -a: print appointments for current day */ - int dflag = 0; /* -d: print appointments for a specified days */ - int hflag = 0; /* -h: print help text */ - int gflag = 0; /* -g: run garbage collector */ - int iflag = 0; /* -i: import data */ - int nflag = 0; /* -n: print next appointment */ - int rflag = 0; /* -r: specify the range of days to consider */ - int sflag = 0; /* -s: specify the first day to consider */ - int Sflag = 0; /* -S: specify a regex to search for */ - int tflag = 0; /* -t: print todo list */ - int vflag = 0; /* -v: print version number */ - int xflag = 0; /* -x: export data */ - /* Format strings */ - const char *fmt_apt = " - %S -> %E\n\t%m\n"; - const char *fmt_rapt = " - %S -> %E\n\t%m\n"; - const char *fmt_ev = " * %m\n"; - const char *fmt_rev = " * %m\n"; - const char *fmt_todo = "%p. %m\n"; - - int tnum = 0, xfmt = 0, non_interactive = 0, multiple_flag = 0, load_data = 0; - const char *ddate = "", *cfile = NULL, *range = NULL, *startday = NULL; - const char *datadir = NULL, *ifile = NULL; - regex_t reg, *preg = NULL; - - /* Long options only */ - int statusflag = 0; /* --status: get the status of running instances */ - enum { - STATUS_OPT = CHAR_MAX + 1 - }; - - static const char *optstr = "ghvnNax::t::d:c:r::s::S:D:i:"; - - struct option longopts[] = { - {"appointment", no_argument, NULL, 'a'}, - {"calendar", required_argument, NULL, 'c'}, - {"day", required_argument, NULL, 'd'}, - {"directory", required_argument, NULL, 'D'}, - {"gc", no_argument, NULL, 'g'}, - {"help", no_argument, NULL, 'h'}, - {"import", required_argument, NULL, 'i'}, - {"next", no_argument, NULL, 'n'}, - {"note", no_argument, NULL, 'N'}, - {"range", optional_argument, NULL, 'r'}, - {"startday", optional_argument, NULL, 's'}, - {"search", required_argument, NULL, 'S'}, - {"status", no_argument, NULL, STATUS_OPT}, - {"todo", optional_argument, NULL, 't'}, - {"version", no_argument, NULL, 'v'}, - {"export", optional_argument, NULL, 'x'}, - - {"format-apt", required_argument, NULL, OPT_FMT_APT}, - {"format-recur-apt", required_argument, NULL, OPT_FMT_RAPT}, - {"format-event", required_argument, NULL, OPT_FMT_EV}, - {"format-recur-event", required_argument, NULL, OPT_FMT_REV}, - {"format-todo", required_argument, NULL, OPT_FMT_TODO}, - {"read-only", no_argument, NULL, OPT_READ_ONLY}, - {NULL, no_argument, NULL, 0} - }; - - while ((ch = getopt_long(argc, argv, optstr, longopts, NULL)) != -1) { - switch (ch) { - case STATUS_OPT: - statusflag = 1; - break; - case 'a': - aflag = 1; - multiple_flag++; - load_data++; - break; - case 'c': - multiple_flag++; - cfile = optarg; - load_data++; - break; - case 'd': - dflag = 1; - multiple_flag++; - load_data++; - ddate = optarg; - break; - case 'D': - datadir = optarg; - break; - case 'h': - hflag = 1; - break; - case 'g': - gflag = 1; - break; - case 'i': - iflag = 1; - multiple_flag++; - load_data++; - ifile = optarg; - break; - case 'n': - nflag = 1; - multiple_flag++; - load_data++; - break; - case 'r': - rflag = 1; - multiple_flag++; - load_data++; - range = optarg; - break; - case 's': - sflag = 1; - multiple_flag++; - load_data++; - startday = optarg; - break; - case 'S': - EXIT_IF(Sflag > 0, _("Can not handle more than one regular expression.")); - Sflag = 1; - if (regcomp(®, optarg, REG_EXTENDED)) - EXIT(_("Could not compile regular expression.")); - preg = ® - break; - case 't': - tflag = 1; - multiple_flag++; - load_data++; - add_line = 1; - if (optarg != NULL) { - tnum = atoi(optarg); - if (tnum < 0 || tnum > 9) { - usage(); - usage_try(); - return EXIT_FAILURE; - } - } else { - tnum = -1; - } - break; - case 'v': - vflag = 1; - break; - case 'x': - xflag = 1; - multiple_flag++; - load_data++; - if (optarg != NULL) { - if (strcmp(optarg, "ical") == 0) { - xfmt = IO_EXPORT_ICAL; - } else if (strcmp(optarg, "pcal") == 0) { - xfmt = IO_EXPORT_PCAL; - } else { - fputs(_("Argument for '-x' should be either " - "'ical' or 'pcal'\n"), stderr); - usage(); - usage_try(); - return EXIT_FAILURE; - } - } else { - xfmt = IO_EXPORT_ICAL; - } - break; - case OPT_FMT_APT: - fmt_apt = optarg; - break; - case OPT_FMT_RAPT: - fmt_rapt = optarg; - break; - case OPT_FMT_EV: - fmt_ev = optarg; - break; - case OPT_FMT_REV: - fmt_rev = optarg; - break; - case OPT_FMT_TODO: - fmt_todo = optarg; - break; - case OPT_READ_ONLY: - read_only = 1; - break; - default: - usage(); - usage_try(); - unknown_flag = 1; - non_interactive = 1; - /* NOTREACHED */ - } - } - argc -= optind; - - if (argc >= 1) { - usage(); - usage_try(); - return EXIT_FAILURE; - /* Incorrect arguments */ - } else if (Sflag && !(aflag || dflag || rflag || sflag || tflag)) { - fputs(_("Option '-S' must be used with either '-d', '-r', '-s', " - "'-a' or '-t'\n"), stderr); - usage(); - usage_try(); - return EXIT_FAILURE; - } else { - if (unknown_flag) { - non_interactive = 1; - } else if (hflag) { - help_arg(); - non_interactive = 1; - } else if (vflag) { - version_arg(); - non_interactive = 1; - } else if (statusflag) { - io_init(cfile, datadir); - status_arg(); - non_interactive = 1; - } else if (gflag) { - io_init(cfile, datadir); - io_check_dir(path_dir); - io_check_dir(path_notes); - io_check_file(path_apts); - io_check_file(path_todo); - io_load_app(); - io_load_todo(); - note_gc(); - non_interactive = 1; - } else if (multiple_flag) { - if (load_data) { - io_init(cfile, datadir); - io_check_dir(path_dir); - io_check_dir(path_notes); - } - if (iflag) { - io_check_file(path_apts); - io_check_file(path_todo); - /* Get default pager in case we need to show a log file. */ - vars_init(); - io_load_app(); - io_load_todo(); - io_import_data(IO_IMPORT_ICAL, ifile); - io_save_apts(); - io_save_todo(); - non_interactive = 1; - } - if (xflag) { - io_check_file(path_apts); - io_check_file(path_todo); - io_load_app(); - io_load_todo(); - io_export_data(xfmt); - non_interactive = 1; - return non_interactive; - } - if (tflag) { - io_check_file(path_todo); - io_load_todo(); - todo_arg(tnum, fmt_todo, preg); - non_interactive = 1; - } - if (nflag) { - io_check_file(path_apts); - io_load_app(); - next_arg(); - non_interactive = 1; - } - if (dflag || rflag || sflag) { - io_check_file(path_apts); - io_check_file(path_conf); - io_load_app(); - config_load(); /* To get output date format. */ - if (dflag) - date_arg(ddate, add_line, fmt_apt, fmt_rapt, fmt_ev, fmt_rev, preg); - if (rflag || sflag) - date_arg_extended(startday, range, add_line, fmt_apt, - fmt_rapt, fmt_ev, fmt_rev, preg); - non_interactive = 1; - } else if (aflag) { - struct date day; - - io_check_file(path_apts); - io_check_file(path_conf); - vars_init(); - config_load(); /* To get output date format. */ - io_load_app(); - day.dd = day.mm = day.yyyy = 0; - app_arg(add_line, &day, 0, fmt_apt, fmt_rapt, fmt_ev, fmt_rev, preg); - non_interactive = 1; - } - } else { - non_interactive = 0; - io_init(cfile, datadir); - } - } - - if (preg) - regfree(preg); - - return non_interactive; + int ch, add_line = 0; + int unknown_flag = 0; + /* Command-line flags */ + int aflag = 0; /* -a: print appointments for current day */ + int dflag = 0; /* -d: print appointments for a specified days */ + int hflag = 0; /* -h: print help text */ + int gflag = 0; /* -g: run garbage collector */ + int iflag = 0; /* -i: import data */ + int nflag = 0; /* -n: print next appointment */ + int rflag = 0; /* -r: specify the range of days to consider */ + int sflag = 0; /* -s: specify the first day to consider */ + int Sflag = 0; /* -S: specify a regex to search for */ + int tflag = 0; /* -t: print todo list */ + int vflag = 0; /* -v: print version number */ + int xflag = 0; /* -x: export data */ + /* Format strings */ + const char *fmt_apt = " - %S -> %E\n\t%m\n"; + const char *fmt_rapt = " - %S -> %E\n\t%m\n"; + const char *fmt_ev = " * %m\n"; + const char *fmt_rev = " * %m\n"; + const char *fmt_todo = "%p. %m\n"; + + int tnum = 0, xfmt = 0, non_interactive = 0, multiple_flag = + 0, load_data = 0; + const char *ddate = "", *cfile = NULL, *range = NULL, *startday = + NULL; + const char *datadir = NULL, *ifile = NULL; + regex_t reg, *preg = NULL; + + /* Long options only */ + int statusflag = 0; /* --status: get the status of running instances */ + enum { + STATUS_OPT = CHAR_MAX + 1 + }; + + static const char *optstr = "ghvnNax::t::d:c:r::s::S:D:i:"; + + struct option longopts[] = { + {"appointment", no_argument, NULL, 'a'}, + {"calendar", required_argument, NULL, 'c'}, + {"day", required_argument, NULL, 'd'}, + {"directory", required_argument, NULL, 'D'}, + {"gc", no_argument, NULL, 'g'}, + {"help", no_argument, NULL, 'h'}, + {"import", required_argument, NULL, 'i'}, + {"next", no_argument, NULL, 'n'}, + {"note", no_argument, NULL, 'N'}, + {"range", optional_argument, NULL, 'r'}, + {"startday", optional_argument, NULL, 's'}, + {"search", required_argument, NULL, 'S'}, + {"status", no_argument, NULL, STATUS_OPT}, + {"todo", optional_argument, NULL, 't'}, + {"version", no_argument, NULL, 'v'}, + {"export", optional_argument, NULL, 'x'}, + + {"format-apt", required_argument, NULL, OPT_FMT_APT}, + {"format-recur-apt", required_argument, NULL, OPT_FMT_RAPT}, + {"format-event", required_argument, NULL, OPT_FMT_EV}, + {"format-recur-event", required_argument, NULL, OPT_FMT_REV}, + {"format-todo", required_argument, NULL, OPT_FMT_TODO}, + {"read-only", no_argument, NULL, OPT_READ_ONLY}, + {NULL, no_argument, NULL, 0} + }; + + while ((ch = + getopt_long(argc, argv, optstr, longopts, NULL)) != -1) { + switch (ch) { + case STATUS_OPT: + statusflag = 1; + break; + case 'a': + aflag = 1; + multiple_flag++; + load_data++; + break; + case 'c': + multiple_flag++; + cfile = optarg; + load_data++; + break; + case 'd': + dflag = 1; + multiple_flag++; + load_data++; + ddate = optarg; + break; + case 'D': + datadir = optarg; + break; + case 'h': + hflag = 1; + break; + case 'g': + gflag = 1; + break; + case 'i': + iflag = 1; + multiple_flag++; + load_data++; + ifile = optarg; + break; + case 'n': + nflag = 1; + multiple_flag++; + load_data++; + break; + case 'r': + rflag = 1; + multiple_flag++; + load_data++; + range = optarg; + break; + case 's': + sflag = 1; + multiple_flag++; + load_data++; + startday = optarg; + break; + case 'S': + EXIT_IF(Sflag > 0, + _("Can not handle more than one regular expression.")); + Sflag = 1; + if (regcomp(®, optarg, REG_EXTENDED)) + EXIT(_("Could not compile regular expression.")); + preg = ® + break; + case 't': + tflag = 1; + multiple_flag++; + load_data++; + add_line = 1; + if (optarg != NULL) { + tnum = atoi(optarg); + if (tnum < 0 || tnum > 9) { + usage(); + usage_try(); + return EXIT_FAILURE; + } + } else { + tnum = -1; + } + break; + case 'v': + vflag = 1; + break; + case 'x': + xflag = 1; + multiple_flag++; + load_data++; + if (optarg != NULL) { + if (strcmp(optarg, "ical") == 0) { + xfmt = IO_EXPORT_ICAL; + } else if (strcmp(optarg, "pcal") == 0) { + xfmt = IO_EXPORT_PCAL; + } else { + fputs(_("Argument for '-x' should be either " + "'ical' or 'pcal'\n"), + stderr); + usage(); + usage_try(); + return EXIT_FAILURE; + } + } else { + xfmt = IO_EXPORT_ICAL; + } + break; + case OPT_FMT_APT: + fmt_apt = optarg; + break; + case OPT_FMT_RAPT: + fmt_rapt = optarg; + break; + case OPT_FMT_EV: + fmt_ev = optarg; + break; + case OPT_FMT_REV: + fmt_rev = optarg; + break; + case OPT_FMT_TODO: + fmt_todo = optarg; + break; + case OPT_READ_ONLY: + read_only = 1; + break; + default: + usage(); + usage_try(); + unknown_flag = 1; + non_interactive = 1; + /* NOTREACHED */ + } + } + argc -= optind; + + if (argc >= 1) { + usage(); + usage_try(); + return EXIT_FAILURE; + /* Incorrect arguments */ + } else if (Sflag && !(aflag || dflag || rflag || sflag || tflag)) { + fputs(_("Option '-S' must be used with either '-d', '-r', '-s', " + "'-a' or '-t'\n"), stderr); + usage(); + usage_try(); + return EXIT_FAILURE; + } else { + if (unknown_flag) { + non_interactive = 1; + } else if (hflag) { + help_arg(); + non_interactive = 1; + } else if (vflag) { + version_arg(); + non_interactive = 1; + } else if (statusflag) { + io_init(cfile, datadir); + status_arg(); + non_interactive = 1; + } else if (gflag) { + io_init(cfile, datadir); + io_check_dir(path_dir); + io_check_dir(path_notes); + io_check_file(path_apts); + io_check_file(path_todo); + io_load_app(); + io_load_todo(); + note_gc(); + non_interactive = 1; + } else if (multiple_flag) { + if (load_data) { + io_init(cfile, datadir); + io_check_dir(path_dir); + io_check_dir(path_notes); + } + if (iflag) { + io_check_file(path_apts); + io_check_file(path_todo); + /* Get default pager in case we need to show a log file. */ + vars_init(); + io_load_app(); + io_load_todo(); + io_import_data(IO_IMPORT_ICAL, ifile); + io_save_apts(); + io_save_todo(); + non_interactive = 1; + } + if (xflag) { + io_check_file(path_apts); + io_check_file(path_todo); + io_load_app(); + io_load_todo(); + io_export_data(xfmt); + non_interactive = 1; + return non_interactive; + } + if (tflag) { + io_check_file(path_todo); + io_load_todo(); + todo_arg(tnum, fmt_todo, preg); + non_interactive = 1; + } + if (nflag) { + io_check_file(path_apts); + io_load_app(); + next_arg(); + non_interactive = 1; + } + if (dflag || rflag || sflag) { + io_check_file(path_apts); + io_check_file(path_conf); + io_load_app(); + config_load(); /* To get output date format. */ + if (dflag) + date_arg(ddate, add_line, fmt_apt, + fmt_rapt, fmt_ev, fmt_rev, + preg); + if (rflag || sflag) + date_arg_extended(startday, range, + add_line, + fmt_apt, + fmt_rapt, fmt_ev, + fmt_rev, preg); + non_interactive = 1; + } else if (aflag) { + struct date day; + + io_check_file(path_apts); + io_check_file(path_conf); + vars_init(); + config_load(); /* To get output date format. */ + io_load_app(); + day.dd = day.mm = day.yyyy = 0; + app_arg(add_line, &day, 0, fmt_apt, + fmt_rapt, fmt_ev, fmt_rev, preg); + non_interactive = 1; + } + } else { + non_interactive = 0; + io_init(cfile, datadir); + } + } + + if (preg) + regfree(preg); + + return non_interactive; } |