X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=src%2Fargs.c;h=0390e0fa0a7b2e0bd0ba28a0da86c69f425e94b4;hb=HEAD;hp=d577fdc32b64549e923d6471bd5793285c8b3864;hpb=22c454ba9b8a3493f83bb05f145e1398735d0fbc;p=lackey diff --git a/src/args.c b/src/args.c index d577fdc..0390e0f 100644 --- a/src/args.c +++ b/src/args.c @@ -19,29 +19,27 @@ #include #include -#include "args.h" #include "util.h" -#include "conf.h" +#include "args.h" #include "date.h" #include "cal.h" -/* Setup info */ -static int argc; -static char **argv; +/* Global data */ +int PRINT = 0; +int DAEMON = 0; + +/* Local data */ +char **calendars = NULL; /* Options */ -const char *short_options = "hdw"; +static char *short_options = "hp::d"; struct option long_options[] = { - {"help", 0, NULL, 'h'}, - {"day", 2, NULL, 'd'}, - {"week", 2, NULL, 'w'}, + {"help", 0, NULL, 'h'}, + {"print", 2, NULL, 'p'}, + {"daemon", 0, NULL, 'd'}, }; -static int print_day = 0; -static int print_week = 0; -static char *calendar = NULL; - /* Usage */ static void usage(char *name) { @@ -49,20 +47,13 @@ static void usage(char *name) printf(" %s [OPTION...] [CALENDAR]\n", name); printf("\n"); printf("Options:\n"); - printf(" -h, --help Print usage information\n"); - printf(" -d, --day Show today's events\n"); - printf(" -w, --week Show this week's events\n"); + printf(" -h, --help Print usage information\n"); + printf(" -p, --print=[dw] Show upcomming events\n"); + printf(" -d, --daemon Run in daemon mode\n"); } /* Initialize */ -void args_setup(int _argc, char **_argv) -{ - argc = _argc; - argv = _argv; -} - -/* Initialize */ -void args_init(void) +void args_setup(int argc, char **argv) { /* Parse arguments */ while (1) { @@ -75,90 +66,48 @@ void args_init(void) usage(argv[0]); exit(0); break; - case 'd': - print_day = 1; + case 'p': + PRINT = match(optarg, NULL) ? 1 : + match(optarg, "d") ? 1 : + match(optarg, "day") ? 1 : + match(optarg, "w") ? 7 : + match(optarg, "week") ? 7 : -1; break; - case 'w': - print_week = 1; + case 'd': + DAEMON = 1; break; } } /* Save default calendar */ - calendar = argv[optind]; - - /* Load calendars */ - for (int i = optind; i < argc; i++) - cal_config("ical", argv[i], "location", argv[i]); + calendars = &argv[optind]; /* Validate arguments */ - if (print_day && print_week) - error("Cannot print both day and week"); + if (PRINT < 0) + error("Unknown print: %s\n", optarg); + if (PRINT && DAEMON) + error("Cannot print and run as daemon"); + + /* Load calendars */ + for (int i = 0; calendars[i]; i++) + cal_config("ical", calendars[i], "location", calendars[i]); } -void args_main(void) +void args_start(void) { /* Focus the default calendar */ - if (calendar) { + if (calendars[0]) { event_t *event = EVENTS; date_t start = {SEL.year, SEL.month, SEL.day, 0, 0}; while (event && compare(&start, &event->start) > 0) event = event->next; - while (event && !match(calendar, event->cal->name)) + while (event && !match(calendars[0], event->cal->name)) event = event->next; if (!event) event = EVENTS; - while (event && !match(calendar, event->cal->name)) + while (event && !match(calendars[0], event->cal->name)) event = event->next; if (event) SEL = event->start; } - - /* Print days or week */ - if (print_day || print_week) { - event_t *event = EVENTS; - for (int d = 0; d < (print_day ? 1 : 7); d++) { - /* Get start and end of the day */ - date_t start = {SEL.year, SEL.month, SEL.day, 0, 0}; - date_t end = {SEL.year, SEL.month, SEL.day, 24, 0}; - - add_days(&start.year, &start.month, &start.day, d); - add_days(&end.year, &end.month, &end.day, d); - - - /* Print day header */ - wday_t wday = day_of_week(start.year, start.month, start.day); - printf("%s%s, %s %d, %d\n", - d ? "\n" : "", - day_to_string(wday), - month_to_string(start.month), - start.day+1, - start.year); - - /* Skip forward to the day */ - while (event && compare(&start, &event->start) > 0) - event = event->next; - - /* Print event info */ - int printed = 0; - while (event && compare(&end, &event->start) > 0) { - printf("%s %02d:%02d", - printed ? "\n" : "", - event->start.hour, - event->start.min); - if (event->name) - printf(" %s\n", event->name); - if (event->desc) - printf("\n %s\n", event->desc); - printed++; - event = event->next; - } - - /* Print no events */ - if (!printed) - printf(" No events\n"); - } - - exit(0); - } }