diff options
| -rw-r--r-- | dmenu.c | 21 | 
1 files changed, 14 insertions, 7 deletions
| @@ -622,24 +622,31 @@ match(char *pattern) {  void  readstdin(void) {  	char *p, buf[1024]; -	unsigned int len = 0, max = 0; +	unsigned int len = 0, blen = 0, max = 0;  	Item *i, *new; -	i = NULL; +	i = 0, p = NULL;  	while(fgets(buf, sizeof buf, stdin)) { -		len = strlen(buf); -		if(buf[len-1] == '\n') -			buf[--len] = '\0'; -		if(!(p = strdup(buf))) -			eprint("fatal: could not strdup() %u bytes\n", len); +		len += (blen = strlen(buf)); +		if(!(p = realloc(p, len))) { +			eprint("fatal: could not realloc() %u bytes\n", len); +			return; +		} +		memcpy (p + len - blen, buf, blen); +		if (p[len - 1] == '\n') +			p[len - 1] = 0; +		else if (!feof(stdin)) +			continue;  		if(max < len) {  			maxname = p;  			max = len;  		} +		len = 0;  		if(!(new = (Item *)malloc(sizeof(Item))))  			eprint("fatal: could not malloc() %u bytes\n", sizeof(Item));  		new->next = new->left = new->right = NULL;  		new->text = p; +		p = NULL;  		if(!i)  			allitems = new;  		else  | 
