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:
parent
8ad2acf352
commit
1e825acf8d
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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:
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user