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.
This commit is contained in:
NRK 2022-09-02 00:35:18 +06:00 committed by Hiltjo Posthuma
parent e35976f4a5
commit 32db2b1251

14
dmenu.c
View file

@ -549,18 +549,18 @@ paste(void)
static void static void
readstdin(void) readstdin(void)
{ {
char buf[sizeof text], *p; char *line = NULL;
size_t i, size = 0; size_t i, junk, size = 0;
ssize_t len;
/* read each line from stdin and add it to the item list */ /* 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 (i + 1 >= size / sizeof *items)
if (!(items = realloc(items, (size += BUFSIZ)))) if (!(items = realloc(items, (size += BUFSIZ))))
die("cannot realloc %zu bytes:", size); die("cannot realloc %zu bytes:", size);
if ((p = strchr(buf, '\n'))) if (line[len - 1] == '\n')
*p = '\0'; line[len - 1] = '\0';
if (!(items[i].text = strdup(buf))) items[i].text = line;
die("cannot strdup %zu bytes:", strlen(buf) + 1);
items[i].out = 0; items[i].out = 0;
} }
if (items) if (items)