xargs: use bb_ask_y_confirmation_FILE() instead of homegrown copy

function                                             old     new   delta
bb_ask_y_confirmation_FILE                             -      83     +83
inetd_main                                          2033    2043     +10
udhcp_send_kernel_packet                             295     301      +6
rmescapes                                            306     310      +4
send_tree                                            353     355      +2
i2cdetect_main                                       674     672      -2
confirm_or_abort                                      43      38      -5
get_terminal_width_height                            242     234      -8
bb_ask_y_confirmation                                 76      10     -66
xargs_main                                           823     755     -68
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 4/5 up/down: 105/-149)          Total: -44 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2018-04-07 15:21:35 +02:00
parent 77cb6b99a4
commit bae8fc4436
5 changed files with 20 additions and 13 deletions

View File

@ -496,16 +496,16 @@ static char* FAST_FUNC process_stdin_with_replace(int n_max_chars, int n_max_arg
static int xargs_ask_confirmation(void) static int xargs_ask_confirmation(void)
{ {
FILE *tty_stream; FILE *tty_stream;
int c, savec; int r;
tty_stream = xfopen_for_read(CURRENT_TTY); tty_stream = xfopen_for_read(CURRENT_TTY);
fputs(" ?...", stderr); fputs(" ?...", stderr);
fflush_all(); r = bb_ask_y_confirmation_FILE(tty_stream);
c = savec = getc(tty_stream);
while (c != EOF && c != '\n')
c = getc(tty_stream);
fclose(tty_stream); fclose(tty_stream);
return (savec == 'y' || savec == 'Y');
return r;
} }
#else #else
# define xargs_ask_confirmation() 1 # define xargs_ask_confirmation() 1

View File

@ -1412,6 +1412,7 @@ extern int set_loop(char **devname, const char *file, unsigned long long offset,
char *bb_ask_noecho_stdin(const char *prompt) FAST_FUNC; char *bb_ask_noecho_stdin(const char *prompt) FAST_FUNC;
//TODO: pass buf pointer or return allocated buf (avoid statics)? //TODO: pass buf pointer or return allocated buf (avoid statics)?
char *bb_ask_noecho(const int fd, int timeout, const char *prompt) FAST_FUNC; char *bb_ask_noecho(const int fd, int timeout, const char *prompt) FAST_FUNC;
int bb_ask_y_confirmation_FILE(FILE *fp) FAST_FUNC;
int bb_ask_y_confirmation(void) FAST_FUNC; int bb_ask_y_confirmation(void) FAST_FUNC;
/* Returns -1 if input is invalid. current_mode is a base for e.g. "u+rw" */ /* Returns -1 if input is invalid. current_mode is a base for e.g. "u+rw" */

View File

@ -8,15 +8,16 @@
*/ */
#include "libbb.h" #include "libbb.h"
/* Read a line from stdin. If the first non-whitespace char is 'y' or 'Y', /* Read a line from fp. If the first non-whitespace char is 'y' or 'Y',
* return 1. Otherwise return 0. * return 1. Otherwise return 0.
*/ */
int FAST_FUNC bb_ask_y_confirmation(void) int FAST_FUNC bb_ask_y_confirmation_FILE(FILE *fp)
{ {
char first = 0; char first = 0;
int c; int c;
while (((c = getchar()) != EOF) && (c != '\n')) { fflush_all();
while (((c = fgetc(fp)) != EOF) && (c != '\n')) {
if (first == 0 && !isblank(c)) { if (first == 0 && !isblank(c)) {
first = c|0x20; first = c|0x20;
} }
@ -24,3 +25,8 @@ int FAST_FUNC bb_ask_y_confirmation(void)
return first == 'y'; return first == 'y';
} }
int FAST_FUNC bb_ask_y_confirmation(void)
{
return bb_ask_y_confirmation_FILE(stdin);
}

View File

@ -39,8 +39,8 @@ int FAST_FUNC remove_file(const char *path, int flags)
if ((!(flags & FILEUTILS_FORCE) && access(path, W_OK) < 0 && isatty(0)) if ((!(flags & FILEUTILS_FORCE) && access(path, W_OK) < 0 && isatty(0))
|| (flags & FILEUTILS_INTERACTIVE) || (flags & FILEUTILS_INTERACTIVE)
) { ) {
fprintf(stderr, "%s: descend into directory '%s'? ", applet_name, fprintf(stderr, "%s: descend into directory '%s'? ",
path); applet_name, path);
if (!bb_ask_y_confirmation()) if (!bb_ask_y_confirmation())
return 0; return 0;
} }
@ -67,7 +67,8 @@ int FAST_FUNC remove_file(const char *path, int flags)
} }
if (flags & FILEUTILS_INTERACTIVE) { if (flags & FILEUTILS_INTERACTIVE) {
fprintf(stderr, "%s: remove directory '%s'? ", applet_name, path); fprintf(stderr, "%s: remove directory '%s'? ",
applet_name, path);
if (!bb_ask_y_confirmation()) if (!bb_ask_y_confirmation())
return status; return status;
} }

View File

@ -421,7 +421,6 @@ static void check_write_funcs(int fd, int mode, int pec)
static void confirm_or_abort(void) static void confirm_or_abort(void)
{ {
fprintf(stderr, "Continue? [y/N] "); fprintf(stderr, "Continue? [y/N] ");
fflush_all();
if (!bb_ask_y_confirmation()) if (!bb_ask_y_confirmation())
bb_error_msg_and_die("aborting"); bb_error_msg_and_die("aborting");
} }