commit 32db2b125190d366be472ccb7cad833248696144
Author:     NRK <n...@disroot.org>
AuthorDate: Fri Sep 2 00:35:18 2022 +0600
Commit:     Hiltjo Posthuma <hil...@codemadness.org>
CommitDate: Fri Sep 2 12:53:34 2022 +0200

    readstdin: use getline(3)
    
    currently readstdin():
       - fgets() into a local buffer,
       - strchr() the buffer to eleminate the newline
       - stdups() the buffer into items
    
    a simpler way is to just use getline(3), which will do the allocation
    for us; eliminating the need for stdup()-ing.
    
    additionally getline returns back the amount of bytes read, which
    eliminates the need for strchr()-ing to find the newline.

diff --git a/dmenu.c b/dmenu.c
index 571bc35..969f6d8 100644
--- a/dmenu.c
+++ b/dmenu.c
@@ -549,18 +549,18 @@ paste(void)
 static void
 readstdin(void)
 {
-       char buf[sizeof text], *p;
-       size_t i, size = 0;
+       char *line = NULL;
+       size_t i, junk, size = 0;
+       ssize_t len;
 
        /* read each line from stdin and add it to the item list */
-       for (i = 0; fgets(buf, sizeof buf, stdin); i++) {
+       for (i = 0; (len = getline(&line, &junk, stdin)) != -1; i++, line = 
NULL) {
                if (i + 1 >= size / sizeof *items)
                        if (!(items = realloc(items, (size += BUFSIZ))))
                                die("cannot realloc %zu bytes:", size);
-               if ((p = strchr(buf, '\n')))
-                       *p = '\0';
-               if (!(items[i].text = strdup(buf)))
-                       die("cannot strdup %zu bytes:", strlen(buf) + 1);
+               if (line[len - 1] == '\n')
+                       line[len - 1] = '\0';
+               items[i].text = line;
                items[i].out = 0;
        }
        if (items)

Reply via email to