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:
Denys Vlasenko 2022-01-18 00:31:27 +01:00
parent 8ad2acf352
commit 1e825acf8d
7 changed files with 25 additions and 16 deletions

View File

@ -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 */ /* Subtract the 1 copy we'd output anyway to get extras */
--bd->writeCopies; --bd->writeCopies;
} }
} /* for(;;) */ } /* for (;;) */
/* Decompression of this input block completed successfully */ /* Decompression of this input block completed successfully */
bd->writeCRC = CRC = ~CRC; bd->writeCRC = CRC = ~CRC;

View File

@ -76,7 +76,7 @@ print_except_N_last_bytes(FILE *fp, unsigned count)
{ {
unsigned char *circle = xmalloc(++count); unsigned char *circle = xmalloc(++count);
unsigned head = 0; unsigned head = 0;
for(;;) { for (;;) {
int c; int c;
c = getc(fp); c = getc(fp);
if (c == EOF) if (c == EOF)
@ -105,7 +105,7 @@ print_except_N_last_lines(FILE *fp, unsigned count)
{ {
char **circle = xzalloc((++count) * sizeof(circle[0])); char **circle = xzalloc((++count) * sizeof(circle[0]));
unsigned head = 0; unsigned head = 0;
for(;;) { for (;;) {
char *c; char *c;
c = xmalloc_fgets(fp); c = xmalloc_fgets(fp);
if (!c) if (!c)
@ -127,7 +127,7 @@ print_except_N_last_lines(FILE *fp, unsigned count)
} }
ret: ret:
head = 0; head = 0;
for(;;) { for (;;) {
free(circle[head++]); free(circle[head++]);
if (head == count) if (head == count)
break; break;

View File

@ -418,7 +418,7 @@ int patch_main(int argc UNUSED_PARAM, char **argv)
} }
// Loop through the lines in the patch // Loop through the lines in the patch
for(;;) { for (;;) {
char *patchline; char *patchline;
patchline = xmalloc_fgetline(stdin); patchline = xmalloc_fgetline(stdin);

View File

@ -441,7 +441,7 @@ int patch_main(int argc UNUSED_PARAM, char **argv)
TT.filein = TT.fileout = -1; TT.filein = TT.fileout = -1;
// Loop through the lines in the patch // Loop through the lines in the patch
for(;;) { for (;;) {
char *patchline; char *patchline;
patchline = get_line(TT.filepatch); patchline = get_line(TT.filepatch);

View File

@ -1900,6 +1900,8 @@ enum {
* (unless fd is in non-blocking mode), * (unless fd is in non-blocking mode),
* subsequent reads will time out after a few milliseconds. * subsequent reads will time out after a few milliseconds.
* Return of -1 means EOF or error (errno == 0 on EOF). * 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 * buffer[0] is used as a counter of buffered chars and must be 0
* on first call. * on first call.
* timeout: * timeout:

View File

@ -2155,7 +2155,7 @@ static int lineedit_read_key(char *read_key_buffer, int timeout)
#endif #endif
fflush_all(); fflush_all();
while (1) { for (;;) {
/* Wait for input. TIMEOUT = -1 makes read_key wait even /* Wait for input. TIMEOUT = -1 makes read_key wait even
* on nonblocking stdin, TIMEOUT = 50 makes sure we won't * on nonblocking stdin, TIMEOUT = 50 makes sure we won't
* insist on full MB_CUR_MAX buffer to declare input like * 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. * Note: read_key sets errno to 0 on success.
*/ */
do { for (;;) {
if ((state->flags & LI_INTERRUPTIBLE) && bb_got_signal) { if ((state->flags & LI_INTERRUPTIBLE) && bb_got_signal) {
errno = EINTR; errno = EINTR;
return -1; return -1;
} }
//FIXME: still races here with signals, but small window to poll() inside read_key //FIXME: still races here with signals, but small window to poll() inside read_key
IF_FEATURE_EDITING_WINCH(S.ok_to_redraw = 1;) 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); ic = read_key(STDIN_FILENO, read_key_buffer, timeout);
IF_FEATURE_EDITING_WINCH(S.ok_to_redraw = 0;) 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) { 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 ENABLE_UNICODE_SUPPORT
if (errno == EAGAIN && unicode_idx != 0) if (errno == EAGAIN && unicode_idx != 0)
goto pushback; goto pushback;
@ -2251,7 +2257,7 @@ static int lineedit_read_key(char *read_key_buffer, int timeout)
#endif #endif
break; break;
} }
ret:
return ic; return ic;
} }

View File

@ -291,6 +291,7 @@ int64_t FAST_FUNC safe_read_key(int fd, char *buffer, int timeout)
{ {
int64_t r; int64_t r;
do { do {
/* errno = 0; - read_key does this itself */
r = read_key(fd, buffer, timeout); r = read_key(fd, buffer, timeout);
} while (errno == EINTR); } while (errno == EINTR);
return r; return r;