]> Pileus Git - lackey/blobdiff - src/args.c
Refactor main and add print mode
[lackey] / src / args.c
index 9ad0640351f706123fcd385e2c19e95bf9937031..49fe2f104ace9edd92180ac5ae20137df57f0c46 100644 (file)
 #include <stdio.h>
 #include <getopt.h>
 
-#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;
+
+/* 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'},
 };
 
-static int   print_day  = 0;
-static int   print_week = 0;
-static char *calendar   = NULL;
-
 /* Usage */
 static void usage(char *name)
 {
@@ -49,20 +45,12 @@ 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");
-}
-
-/* Initialize */
-void args_setup(int _argc, char **_argv)
-{
-       argc = _argc;
-       argv = _argv;
+       printf("  -h, --help        Print usage information\n");
+       printf("  -p, --print=[dw]  Show upcomming events\n");
 }
 
 /* Initialize */
-void args_init(void)
+void args_setup(int argc, char **argv)
 {
        /* Parse arguments */
        while (1) {
@@ -75,95 +63,43 @@ void args_init(void)
                                usage(argv[0]);
                                exit(0);
                                break;
-                       case 'd':
-                               print_day = 1;
-                               break;
-                       case 'w':
-                               print_week = 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;
                }
        }
 
        /* 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);
+
+       /* 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);
-                       if (d > 0)
-                               printf("\n");
-                       printf("%s, %s %d, %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) {
-                               if (printed > 0)
-                                       printf("\n");
-                               printf("* %02d:%02d - %02d:%02d",
-                                       event->start.hour, event->start.min,
-                                       event->end.hour,   event->end.min);
-                               if (!event->name)
-                                       printf("\n");
-                               if (event->name)
-                                       printf("  %s\n", event->name);
-                               if (event->loc)
-                                       printf("  Location:      %s\n", event->loc);
-                               if (event->desc)
-                                       printf("  Description:   %s\n", event->desc);
-                               printed++;
-                               event = event->next;
-                       }
-
-                       /* Print no events */
-                       if (!printed)
-                               printf("  No events\n");
-               }
-
-               exit(0);
-       }
 }