]> git.armaanb.net Git - mmenu.git/blobdiff - mmenu.c
Add installation instructions to README
[mmenu.git] / mmenu.c
diff --git a/mmenu.c b/mmenu.c
index 4e4283ca7bb5c555bc212303aede7819ec07ad05..a21ba80f6b2e2009795413b0223277b780cfe115 100644 (file)
--- a/mmenu.c
+++ b/mmenu.c
@@ -1,6 +1,8 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <stdbool.h>
+#include <string.h>
+#include <strings.h>
 
 #include <Xm/Xm.h>
 #include <Xm/Text.h>
@@ -20,7 +22,7 @@ int
 memfail(void)
 {
        printf("ERROR: Out of memory\n");
-       exit(4);
+       exit(2);
 }
 
 static size_t
@@ -58,7 +60,7 @@ getmenu(char *date)
        const char *baseurl =
                "https://nobilis.nobles.edu/skyworld/castlemenu.php?Date=";
        int len = strlen(baseurl) + strlen(date) + 1;
-       char *url = (char *)malloc(len);
+       char *url = (char *) malloc(len);
        snprintf(url, len, "%s%s", baseurl, date);
        printf("INFO: Using URL %s\n", url);
        curl_easy_setopt(curl, CURLOPT_URL, url);
@@ -71,9 +73,9 @@ getmenu(char *date)
        free(url);
 
        if (res != CURLE_OK) {
-               fprintf(stderr,"ERROR: Could not fetch webpage\n%s\n",
+               fprintf(stderr,"ERROR: Could not fetch webpage:\n%s\n",
                                                curl_easy_strerror(res));
-               exit(2);
+               exit(1);
        }
 
        curl_easy_cleanup(curl);
@@ -136,53 +138,73 @@ dayback(Widget unused, XtPointer client_data, XtPointer call_data)
        free(oldtext);
 }
 
-// Convert an array of string to an array of compound strings
-XmStringTable ArgvToXmStringTable (int argc, char **argv)
+// Convert an array of strings to an array of compound strings
+XmStringTable
+ArgvToXmStringTable (int argc, char **argv)
 {
        XmStringTable new =
-               (XmStringTable) XtMalloc ((argc+1) * sizeof (XmString));
-       if (!new)
-               return (XmStringTable) 0;
+               (XmStringTable) XtMalloc((argc+1) * sizeof (XmString));
+       if (!new) return (XmStringTable) 0;
+
        new[argc] = (XmString) 0;
-       while (--argc >= 0)
+       while (--argc >= 0) {
                new[argc] = XmStringGenerate ((XtPointer) argv[argc], "tag2",
-                                                                                                                                       XmCHARSET_TEXT, NULL);
+                               XmCHARSET_TEXT, NULL);
+       }
+
        return new;
 }
 
 int
 main(int argc, char *argv[])
 {
+       // Parse CLI arguments
+       bool showUsage = false;
+       if (argc == 2) {
+               showUsage = true;
+               for (int i = 0; i < 5; i++) {
+                       if (strcasecmp(argv[1], days[i]) == 0) {
+                               showUsage = false;
+                               break;
+                       }
+               }
+       }
+
+       if (argc > 2 || showUsage) {
+               printf("Usage: %s [optional: day of the week]\n", argv[0]);
+               exit(3);
+       }
+
        // Initialize motif
        Widget         toplevel, rowcol, daysel, disp;
        XmStringTable  strs;
        XtAppContext   app;
-       Arg            args[5];
+       Arg            args[0];
 
        XtSetLanguageProc(NULL, NULL, NULL);
        toplevel = XtVaOpenApplication(&app, "Castle Menu", NULL, 0, &argc, argv,
                                                                                                                                 NULL, sessionShellWidgetClass, NULL);
 
        int n = 0;
-       XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++;
+       XtSetArg(args[n], XmNorientation, XmHORIZONTAL); n++;
        rowcol = XmCreateRowColumn(toplevel, "rowcol", args, n);
        XtManageChild(rowcol);
 
        // Create text widget to display menu
        n = 0;
-       char *nl = getmenu("");
+       char *nl = getmenu((argv[1]) ? argv[1] : "");
        XtSetArg(args[n], XmNvalue, nl); n++;
        XtSetArg(args[n], XmNeditable, False); n++;
        XtSetArg(args[n], XmNcolumns, 80); n++;
        XtSetArg(args[n], XmNrows, 20); n++;
-       XtSetArg (args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++;
+       XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++;
        XtSetArg(args[n], XmNcursorPositionVisible, False); n++;
        disp = XmCreateScrolledText(rowcol, "text", args, n);
        XtManageChild(disp);
        free(nl);
 
        // Create day selector
-       strs = ArgvToXmStringTable (XtNumber(days), days);
+       strs = ArgvToXmStringTable(XtNumber(days), days);
        daysel = XmCreateScrolledList(rowcol, "list", NULL, 0);
        XtVaSetValues(daysel, XmNitems, strs, XmNitemCount, XtNumber(days), NULL);
        XtAddCallback(daysel, XmNbrowseSelectionCallback, dayback, (XtPointer) disp);