readstdin: use getline(3)
authorNRK <nrk@disroot.org>
Thu, 1 Sep 2022 18:35:18 +0000 (00:35 +0600)
committerHiltjo Posthuma <hiltjo@codemadness.org>
Fri, 2 Sep 2022 10:53:34 +0000 (12:53 +0200)
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.

dmenu.c

diff --git a/dmenu.c b/dmenu.c
index 571bc35580148ab97f4c5fbef861bd2e542b201c..969f6d80622579da4b69dd65893aba7869b3d2b1 100644 (file)
--- 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)