[prev in list] [next in list] [prev in thread] [next in thread] 

List:       busybox
Subject:    Re: [RFC][PATCH v3 1/2] fdisk: move read_line() to libbb
From:       tito <farmatito () tiscali ! it>
Date:       2014-12-16 13:15:55
Message-ID: 201412161415.55995.farmatito () tiscali ! it
[Download RAW message or body]

On Tuesday 16 December 2014 11:21:44 Bartosz Golaszewski wrote:
> Move read_line() to libbb in order to make it available for other applets.
> While we're at it: implement a simple function which displays a prompt message
> and waits for user confirmation.
> 
> function                                             old     new   delta
> read_int                                             449     472     +23
> read_nonempty                                         30      49     +19
> .rodata                                           152682  152693     +11
> read_line                                            101      90     -11
> ------------------------------------------------------------------------------
> (add/remove: 0/0 grow/shrink: 3/1 up/down: 53/-11)             Total: 42 bytes
> 
> Signed-off-by: Bartosz Golaszewski <bartekgola@gmail.com>
> ---
>  include/libbb.h    |  2 ++
>  libbb/lineedit.c   | 30 ++++++++++++++++++++++++++++++
>  util-linux/fdisk.c | 23 ++---------------------
>  3 files changed, 34 insertions(+), 21 deletions(-)
> 
> diff --git a/include/libbb.h b/include/libbb.h
> index 8e8b9ca..21018e5 100644
> --- a/include/libbb.h
> +++ b/include/libbb.h
> @@ -1522,6 +1522,8 @@ int read_line_input(const char* prompt, char* command, int maxsize) FAST_FUNC;
>  	read_line_input(prompt, command, maxsize)
>  #endif
>  
> +int read_line(const char *prompt, char *line_buffer, size_t buflen, char **line_ptr);
> +int user_confirm(const char *prompt);
>  
>  #ifndef COMM_LEN
>  # ifdef TASK_COMM_LEN
> diff --git a/libbb/lineedit.c b/libbb/lineedit.c
> index 8564307..a27771d 100644
> --- a/libbb/lineedit.c
> +++ b/libbb/lineedit.c
> @@ -2833,6 +2833,36 @@ int FAST_FUNC read_line_input(const char* prompt, char* command, int maxsize)
>  
>  #endif  /* !FEATURE_EDITING */
>  
> +/* Read line; return 0 or first printable char */
> +int read_line(const char *prompt, char *line_buffer, size_t buflen, char **line_ptr)
> +{
> +	int sz;
> +
> +	sz = read_line_input(NULL, prompt, line_buffer, buflen, /*timeout*/ -1);
> +	if (sz <= 0)
> +		exit(EXIT_SUCCESS); /* Ctrl-D or Ctrl-C */
> +
> +	if (line_buffer[sz-1] == '\n')
> +		line_buffer[--sz] = '\0';
> +
> +	*line_ptr = line_buffer;
> +	while (**line_ptr != '\0' && (unsigned char)**line_ptr <= ' ')
> +		(*line_ptr)++;
> +	return **line_ptr;
> +}
> +
> +/*
> + * Display the prompt message followed by a '[y/N]' and wait for user
> + * confirmation. Return 1 if user entered 'y' or 'Y', or 0 otherwise.
> + */
> +int user_confirm(const char *prompt)
> +{
> +	char *line_ptr, buf[3], p[64];
> +
> +	snprintf(p, sizeof(p), "%s [y/N]: ", prompt);
> +
> +	return tolower(read_line(p, buf, sizeof(buf), &line_ptr)) == 'y' ? 1 : 0;
> +}
>  

Hi,
We have something similar in libb/bb_ask_comfirmation.c

int FAST_FUNC bb_ask_confirmation(void)
{
	char first = 0;
	int c;

	while (((c = getchar()) != EOF) && (c != '\n')) {
		if (first == 0 && !isblank(c)) {
			first = c|0x20;
		}
	}

	return first == 'y';
}

Ciao,
Tito

>  /*
>   * Testing
> diff --git a/util-linux/fdisk.c b/util-linux/fdisk.c
> index 39eb27b..4ba1e90 100644
> --- a/util-linux/fdisk.c
> +++ b/util-linux/fdisk.c
> @@ -563,25 +563,6 @@ seek_sector(sector_t secno)
>  }
>  
>  #if ENABLE_FEATURE_FDISK_WRITABLE
> -/* Read line; return 0 or first printable char */
> -static int
> -read_line(const char *prompt)
> -{
> -	int sz;
> -
> -	sz = read_line_input(NULL, prompt, line_buffer, sizeof(line_buffer), /*timeout*/ -1);
> -	if (sz <= 0)
> -		exit(EXIT_SUCCESS); /* Ctrl-D or Ctrl-C */
> -
> -	if (line_buffer[sz-1] == '\n')
> -		line_buffer[--sz] = '\0';
> -
> -	line_ptr = line_buffer;
> -	while (*line_ptr != '\0' && (unsigned char)*line_ptr <= ' ')
> -		line_ptr++;
> -	return *line_ptr;
> -}
> -
>  static void
>  set_all_unchanged(void)
>  {
> @@ -607,7 +588,7 @@ write_part_table_flag(char *b)
>  static char
>  read_nonempty(const char *mesg)
>  {
> -	while (!read_line(mesg))
> +	while (!read_line(mesg, line_buffer, sizeof(line_buffer), &line_ptr))
>  		continue;
>  	return *line_ptr;
>  }
> @@ -615,7 +596,7 @@ read_nonempty(const char *mesg)
>  static char
>  read_maybe_empty(const char *mesg)
>  {
> -	if (!read_line(mesg)) {
> +	if (!read_line(mesg, line_buffer, sizeof(line_buffer), &line_ptr)) {
>  		line_ptr = line_buffer;
>  		line_ptr[0] = '\n';
>  		line_ptr[1] = '\0';
> 
_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic