#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
+#include <string.h>
+#include <strings.h>
#include <Xm/Xm.h>
#include <Xm/Text.h>
memfail(void)
{
printf("ERROR: Out of memory\n");
- exit(4);
+ exit(2);
}
static size_t
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);
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);
if (c == '>') intag = false;
}
+ free(chunk.memory);
+
// Strip empty newlines
char *nl = (char *) calloc(1, sizeof(char));
if (!nl) memfail();
strncat(nl, next, 2);
}
}
- free(outp);
+ free(outp);
return nl;
}
Widget disp = (Widget) client_data;
XmListCallbackStruct *list_cbs = (XmListCallbackStruct *) call_data;
char *nl = getmenu(days[list_cbs->item_position - 1]);
- XmTextReplace((Widget) disp, 0, strlen(XmTextGetString(disp)), nl);
+ char *oldtext = XmTextGetString(disp) ;
+ XmTextReplace((Widget) disp, 0, strlen(oldtext), nl);
+ free(nl);
+ 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;
- XtSetArg(args[n], XmNvalue, getmenu("")); n++;
+ 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);