readstdin: use getline(3) 32db2b12
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.
NRK · 2022-09-02 00:35 1 file(s) · +7 −7
dmenu.c +7 −7
549 549
static void
550 550
readstdin(void)
551 551
{
552 -
	char buf[sizeof text], *p;
553 -
	size_t i, size = 0;
552 +
	char *line = NULL;
553 +
	size_t i, junk, size = 0;
554 +
	ssize_t len;
554 555
555 556
	/* read each line from stdin and add it to the item list */
556 -
	for (i = 0; fgets(buf, sizeof buf, stdin); i++) {
557 +
	for (i = 0; (len = getline(&line, &junk, stdin)) != -1; i++, line = NULL) {
557 558
		if (i + 1 >= size / sizeof *items)
558 559
			if (!(items = realloc(items, (size += BUFSIZ))))
559 560
				die("cannot realloc %zu bytes:", size);
560 -
		if ((p = strchr(buf, '\n')))
561 -
			*p = '\0';
562 -
		if (!(items[i].text = strdup(buf)))
563 -
			die("cannot strdup %zu bytes:", strlen(buf) + 1);
561 +
		if (line[len - 1] == '\n')
562 +
			line[len - 1] = '\0';
563 +
		items[i].text = line;
564 564
		items[i].out = 0;
565 565
	}
566 566
	if (items)