readstdin: use getline(3) - dmenu - dynamic menu | |
git clone git://git.suckless.org/dmenu | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 32db2b125190d366be472ccb7cad833248696144 | |
parent e35976f4a50f884c2162f71e4128d7c273e3e042 | |
Author: NRK <[email protected]> | |
Date: Fri, 2 Sep 2022 00:35:18 +0600 | |
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. | |
Diffstat: | |
M dmenu.c | 14 +++++++------- | |
1 file changed, 7 insertions(+), 7 deletions(-) | |
--- | |
diff --git 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 = NU… | |
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) |