]> git.armaanb.net Git - mmenu.git/blobdiff - mmenu.c
Patch leaks
[mmenu.git] / mmenu.c
diff --git a/mmenu.c b/mmenu.c
index e5860bd47b1bb0668b61c8fe041c7b5c7a8d78f8..4e4283ca7bb5c555bc212303aede7819ec07ad05 100644 (file)
--- a/mmenu.c
+++ b/mmenu.c
@@ -23,7 +23,6 @@ memfail(void)
        exit(4);
 }
 
-
 static size_t
 memback(void *contents, size_t size, size_t nmemb, void *userp)
 {
@@ -67,7 +66,7 @@ getmenu(char *date)
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
 
-       printf("INFO: Fetching wepage\n");
+       printf("INFO: Fetching webpage\n");
        res = curl_easy_perform(curl);
        free(url);
 
@@ -102,6 +101,8 @@ getmenu(char *date)
                if (c == '>') intag = false;
        }
 
+       free(chunk.memory);
+
        // Strip empty newlines
        char *nl = (char *) calloc(1, sizeof(char));
        if (!nl) memfail();
@@ -109,26 +110,33 @@ getmenu(char *date)
        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();
-               next[0] = outp[i+1];
-               strncat(nl, next, 2);
+               if (!((outp[i] == '\n' && outp[i+1] == '\n') ||
+                               (outp[i] == ' ' && outp[i+1] == ' '))) {
+                       nl = (char *) realloc(nl, j);
+                       if (!nl) memfail();
+                       next[0] = outp[i+1];
+                       strncat(nl, next, 2);
+               }
        }
+
        free(outp);
        return nl;
 }
 
 void
-dayback(Widget w, XtPointer client_data, XtPointer call_data)
+dayback(Widget unused, XtPointer client_data, XtPointer call_data)
 {
-       Widget text_w = (Widget) client_data;
+       (void)unused;
+       Widget disp = (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);
+       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 */
+// Convert an array of string to an array of compound strings
 XmStringTable ArgvToXmStringTable (int argc, char **argv)
 {
        XmStringTable new =
@@ -146,7 +154,7 @@ int
 main(int argc, char *argv[])
 {
        // Initialize motif
-       Widget         toplevel, rowcol, w, text_w;
+       Widget         toplevel, rowcol, daysel, disp;
        XmStringTable  strs;
        XtAppContext   app;
        Arg            args[5];
@@ -158,6 +166,7 @@ main(int argc, char *argv[])
        int n = 0;
        XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++;
        rowcol = XmCreateRowColumn(toplevel, "rowcol", args, n);
+       XtManageChild(rowcol);
 
        // Create text widget to display menu
        n = 0;
@@ -165,20 +174,19 @@ main(int argc, char *argv[])
        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], XmNcursorPositionVisible, False); n++;
-       text_w = XmCreateScrolledText(rowcol, "text", args, n);
-       XtManageChild(text_w);
+       disp = XmCreateScrolledText(rowcol, "text", args, n);
+       XtManageChild(disp);
+       free(nl);
 
        // 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);
+       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);
+       XtManageChild(daysel);
 
        // Display everything
        XtRealizeWidget(toplevel);