libbb: shrink lineedit_read_key()
function old new delta lineedit_read_key 237 231 -6 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
		| @@ -654,7 +654,7 @@ static int read_bunzip(bunzip_data *bd, char *outbuf, int len) | ||||
| 				/* Subtract the 1 copy we'd output anyway to get extras */ | ||||
| 				--bd->writeCopies; | ||||
| 			} | ||||
| 		} /* for(;;) */ | ||||
| 		} /* for (;;) */ | ||||
|  | ||||
| 		/* Decompression of this input block completed successfully */ | ||||
| 		bd->writeCRC = CRC = ~CRC; | ||||
|   | ||||
| @@ -76,7 +76,7 @@ print_except_N_last_bytes(FILE *fp, unsigned count) | ||||
| { | ||||
| 	unsigned char *circle = xmalloc(++count); | ||||
| 	unsigned head = 0; | ||||
| 	for(;;) { | ||||
| 	for (;;) { | ||||
| 		int c; | ||||
| 		c = getc(fp); | ||||
| 		if (c == EOF) | ||||
| @@ -105,7 +105,7 @@ print_except_N_last_lines(FILE *fp, unsigned count) | ||||
| { | ||||
| 	char **circle = xzalloc((++count) * sizeof(circle[0])); | ||||
| 	unsigned head = 0; | ||||
| 	for(;;) { | ||||
| 	for (;;) { | ||||
| 		char *c; | ||||
| 		c = xmalloc_fgets(fp); | ||||
| 		if (!c) | ||||
| @@ -127,7 +127,7 @@ print_except_N_last_lines(FILE *fp, unsigned count) | ||||
| 	} | ||||
|  ret: | ||||
| 	head = 0; | ||||
| 	for(;;) { | ||||
| 	for (;;) { | ||||
| 		free(circle[head++]); | ||||
| 		if (head == count) | ||||
| 			break; | ||||
|   | ||||
| @@ -418,7 +418,7 @@ int patch_main(int argc UNUSED_PARAM, char **argv) | ||||
| 	} | ||||
|  | ||||
| 	// Loop through the lines in the patch | ||||
| 	for(;;) { | ||||
| 	for (;;) { | ||||
| 		char *patchline; | ||||
|  | ||||
| 		patchline = xmalloc_fgetline(stdin); | ||||
|   | ||||
| @@ -441,7 +441,7 @@ int patch_main(int argc UNUSED_PARAM, char **argv) | ||||
| 	TT.filein = TT.fileout = -1; | ||||
|  | ||||
| 	// Loop through the lines in the patch | ||||
| 	for(;;) { | ||||
| 	for (;;) { | ||||
| 		char *patchline; | ||||
|  | ||||
| 		patchline = get_line(TT.filepatch); | ||||
|   | ||||
| @@ -1900,6 +1900,8 @@ enum { | ||||
|  * (unless fd is in non-blocking mode), | ||||
|  * subsequent reads will time out after a few milliseconds. | ||||
|  * Return of -1 means EOF or error (errno == 0 on EOF). | ||||
|  * Nonzero errno is not preserved across the call: | ||||
|  * if there was no error, errno will be cleared to 0. | ||||
|  * buffer[0] is used as a counter of buffered chars and must be 0 | ||||
|  * on first call. | ||||
|  * timeout: | ||||
|   | ||||
| @@ -2155,7 +2155,7 @@ static int lineedit_read_key(char *read_key_buffer, int timeout) | ||||
| #endif | ||||
|  | ||||
| 	fflush_all(); | ||||
| 	while (1) { | ||||
| 	for (;;) { | ||||
| 		/* Wait for input. TIMEOUT = -1 makes read_key wait even | ||||
| 		 * on nonblocking stdin, TIMEOUT = 50 makes sure we won't | ||||
| 		 * insist on full MB_CUR_MAX buffer to declare input like | ||||
| @@ -2167,24 +2167,30 @@ static int lineedit_read_key(char *read_key_buffer, int timeout) | ||||
| 		 * | ||||
| 		 * Note: read_key sets errno to 0 on success. | ||||
| 		 */ | ||||
| 		do { | ||||
| 		for (;;) { | ||||
| 			if ((state->flags & LI_INTERRUPTIBLE) && bb_got_signal) { | ||||
| 				errno = EINTR; | ||||
| 				return -1; | ||||
| 			} | ||||
| //FIXME: still races here with signals, but small window to poll() inside read_key | ||||
| 			IF_FEATURE_EDITING_WINCH(S.ok_to_redraw = 1;) | ||||
| 			/* errno = 0; - read_key does this itself */ | ||||
| 			ic = read_key(STDIN_FILENO, read_key_buffer, timeout); | ||||
| 			IF_FEATURE_EDITING_WINCH(S.ok_to_redraw = 0;) | ||||
| 		} while (!(state->flags & LI_INTERRUPTIBLE) && errno == EINTR); | ||||
| 			if (errno != EINTR) | ||||
| 				break; | ||||
| 			if (state->flags & LI_INTERRUPTIBLE) { | ||||
| 				/* LI_INTERRUPTIBLE bails out on EINTR, | ||||
| 				 * but nothing really guarantees that bb_got_signal | ||||
| 				 * is nonzero. Follow the least surprise principle: | ||||
| 				 */ | ||||
| 				if (bb_got_signal == 0) | ||||
| 					bb_got_signal = 255; | ||||
| 				goto ret; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (errno) { | ||||
| 			/* LI_INTERRUPTIBLE can bail out with EINTR here, | ||||
| 			 * but nothing really guarantees that bb_got_signal | ||||
| 			 * is nonzero. Follow the least surprise principle: | ||||
| 			 */ | ||||
| 			if (errno == EINTR && bb_got_signal == 0) | ||||
| 				bb_got_signal = 255; /* something nonzero */ | ||||
| #if ENABLE_UNICODE_SUPPORT | ||||
| 			if (errno == EAGAIN && unicode_idx != 0) | ||||
| 				goto pushback; | ||||
| @@ -2251,7 +2257,7 @@ static int lineedit_read_key(char *read_key_buffer, int timeout) | ||||
| #endif | ||||
| 		break; | ||||
| 	} | ||||
|  | ||||
|  ret: | ||||
| 	return ic; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -291,6 +291,7 @@ int64_t FAST_FUNC safe_read_key(int fd, char *buffer, int timeout) | ||||
| { | ||||
| 	int64_t r; | ||||
| 	do { | ||||
| 		/* errno = 0; - read_key does this itself */ | ||||
| 		r = read_key(fd, buffer, timeout); | ||||
| 	} while (errno == EINTR); | ||||
| 	return r; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user