From 8918b52f56fd5275314bd73c5d94fcda696b894c Mon Sep 17 00:00:00 2001 From: Armaan Bhojwani Date: Sun, 9 May 2021 13:32:37 -0400 Subject: [PATCH] Implement day selection --- mmenu.c | 112 +++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 86 insertions(+), 26 deletions(-) diff --git a/mmenu.c b/mmenu.c index fca9599..e5860bd 100644 --- a/mmenu.c +++ b/mmenu.c @@ -2,7 +2,11 @@ #include #include +#include #include +#include +#include + #include struct memstruct { @@ -10,6 +14,8 @@ struct memstruct { size_t size; }; +char *days[] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"}; + int memfail(void) { @@ -35,10 +41,9 @@ memback(void *contents, size_t size, size_t nmemb, void *userp) return realsize; } -int -main(int argc, char *argv[]) +char * +getmenu(char *date) { - // Get webpage CURL *curl = curl_easy_init(); CURLcode res; @@ -51,18 +56,24 @@ main(int argc, char *argv[]) chunk.memory = malloc(1); // Grown as needed by the realloc in memback() chunk.size = 0; // No data yet - curl_easy_setopt(curl, CURLOPT_URL, - "https://nobilis.nobles.edu/skyworld/castlemenu.php"); + const char *baseurl = + "https://nobilis.nobles.edu/skyworld/castlemenu.php?Date="; + int len = strlen(baseurl) + strlen(date) + 1; + 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); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, memback); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); printf("INFO: Fetching wepage\n"); res = curl_easy_perform(curl); + free(url); if (res != CURLE_OK) { fprintf(stderr,"ERROR: Could not fetch webpage\n%s\n", - curl_easy_strerror(res)); + curl_easy_strerror(res)); exit(2); } @@ -76,14 +87,17 @@ main(int argc, char *argv[]) // Extract text from between HTML tags int j = 1; - for (int i = 345; (size_t)i < strlen(chunk.memory); i++) { + char next[2]; + next[1] = '\0'; + for (int i = 345; chunk.memory[i]; i++) { char c = chunk.memory[i]; if (c == '<') intag = true; if (!intag) { j++; outp = (char *) realloc(outp, j); if (!outp) memfail(); - strncat(outp, &c, 1); + next[0] = c; + strncat(outp, next, 2); } if (c == '>') intag = false; } @@ -92,35 +106,81 @@ main(int argc, char *argv[]) char *nl = (char *) calloc(1, sizeof(char)); if (!nl) memfail(); - for (int i = 0; (size_t)i < strlen(outp) - 1; i++) { - if (outp[i] == '\n' && outp[i+1] == '\n') i+=4; - nl = (char *) realloc(nl, i); + j = 1; + for (int i = 0; outp[i]; i++) { + j++; + if (outp[i] == '\n' && outp[i+1] == '\n') i+=3; + nl = (char *) realloc(nl, j); if (!nl) memfail(); - strncat(nl, &outp[i], 1); + next[0] = outp[i+1]; + strncat(nl, next, 2); } + free(outp); + return nl; +} +void +dayback(Widget w, XtPointer client_data, XtPointer call_data) +{ + Widget text_w = (Widget) client_data; + XmListCallbackStruct *list_cbs = (XmListCallbackStruct *) call_data; + char *nl = getmenu(days[list_cbs->item_position - 1]); + XmTextReplace((Widget) text_w, 0, strlen(XmTextGetString(text_w)), nl); +} + +/* Convert an array of string 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; + new[argc] = (XmString) 0; + while (--argc >= 0) + new[argc] = XmStringGenerate ((XtPointer) argv[argc], "tag2", + XmCHARSET_TEXT, NULL); + return new; +} + +int +main(int argc, char *argv[]) +{ // Initialize motif - Widget toplevel; - XtAppContext app; - Widget text_w; - Arg args[4]; + Widget toplevel, rowcol, w, text_w; + XmStringTable strs; + XtAppContext app; + Arg args[5]; XtSetLanguageProc(NULL, NULL, NULL); - toplevel = XtVaOpenApplication (&app, "Castle Menu", NULL, 0, &argc, argv, - NULL, sessionShellWidgetClass, NULL); + toplevel = XtVaOpenApplication(&app, "Castle Menu", NULL, 0, &argc, argv, + NULL, sessionShellWidgetClass, NULL); - // Set textbox settings int n = 0; - XtSetArg(args[n], XmNvalue, nl); n++; - XtSetArg(args[n], XmNeditable, False); n++; - XtSetArg(args[n], XmNcolumns, 80); n++; + XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++; + rowcol = XmCreateRowColumn(toplevel, "rowcol", args, n); + + // Create text widget to display menu + n = 0; + char *nl = getmenu(""); + XtSetArg(args[n], XmNvalue, nl); n++; + XtSetArg(args[n], XmNeditable, False); n++; + XtSetArg(args[n], XmNcolumns, 80); n++; XtSetArg(args[n], XmNcursorPositionVisible, False); n++; - text_w = XmCreateScrolledText(toplevel, "text", args, n); - free(outp); - free(nl); + text_w = XmCreateScrolledText(rowcol, "text", args, n); + XtManageChild(text_w); + + // Create day selector + strs = ArgvToXmStringTable (XtNumber (days), days); + w = XmCreateScrolledList(rowcol, "list", NULL, 0); + XtVaSetValues(w, + XmNitems, strs, + XmNitemCount, XtNumber (days), + NULL); + XtAddCallback(w, XmNbrowseSelectionCallback, dayback, (XtPointer) text_w); + XtManageChild(w); + XtManageChild(rowcol); // Display everything - XtManageChild(text_w); XtRealizeWidget(toplevel); XtAppMainLoop(app); } -- 2.39.2