16 printf("ERROR: Out of memory\n");
22 memback(void *contents, size_t size, size_t nmemb, void *userp)
24 size_t realsize = size * nmemb;
25 struct MemoryStruct *mem = (struct MemoryStruct *)userp;
27 char *ptr = realloc(mem->memory, mem->size + realsize + 1);
31 memcpy(&(mem->memory[mem->size]), contents, realsize);
32 mem->size += realsize;
33 mem->memory[mem->size] = 0;
39 main(int argc, char *argv[])
42 CURL *curl = curl_easy_init();
46 fprintf(stderr, "ERROR: Failed to initialize cURL\n");
50 struct MemoryStruct chunk;
51 chunk.memory = malloc(1); // Grown as needed by the realloc in memback()
52 chunk.size = 0; // No data yet
54 curl_easy_setopt(curl, CURLOPT_URL,
55 "https://nobilis.nobles.edu/skyworld/castlemenu.php");
56 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, memback);
57 curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
58 curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
60 printf("INFO: Fetching wepage\n");
61 res = curl_easy_perform(curl);
63 if (res != CURLE_OK) {
64 fprintf(stderr,"ERROR: Could not fetch webpage\n%s\n",
65 curl_easy_strerror(res));
69 curl_easy_cleanup(curl);
72 printf("INFO: Parsing HTML\n");
74 char *outp = (char *) calloc(1, sizeof(char));
77 // Extract text from between HTML tags
79 for (int i = 345; i < strlen(chunk.memory); i++) {
80 char c = chunk.memory[i];
81 if (c == '<') intag = true;
84 outp = (char *) realloc(outp, j);
88 if (c == '>') intag = false;
91 // Strip empty newlines
92 char *nl = (char *) calloc(1, sizeof(char));
95 for (int i = 0; i < strlen(outp) - 1; i++) {
96 if (outp[i] == '\n' && outp[i+1] == '\n') i+=4;
97 nl = (char *) realloc(nl, i);
99 strncat(nl, &outp[i], 1);
108 XtSetLanguageProc(NULL, NULL, NULL);
109 toplevel = XtVaOpenApplication (&app, "Castle Menu", NULL, 0, &argc, argv,
110 NULL, sessionShellWidgetClass, NULL);
112 // Set textbox settings
114 XtSetArg(args[n], XmNvalue, nl); n++;
115 XtSetArg(args[n], XmNeditable, False); n++;
116 XtSetArg(args[n], XmNcolumns, 80); n++;
117 XtSetArg(args[n], XmNcursorPositionVisible, False); n++;
118 text_w = XmCreateScrolledText(toplevel, "text", args, n);
122 // Display everything
123 XtManageChild(text_w);
124 XtRealizeWidget(toplevel);