[ipxe-devel] [PATCH] added function chop and upper

Ján ONDREJ (SAL) ondrejj at salstar.sk
Wed Feb 24 11:19:25 UTC 2016


Hello,

  this chop can be useful for me too, but I need to also get and process
removed char too.

  Any chance to add some simple regular expressions to ipxe?
There will be lot's of other things, which can be done by regular
expressions and I think chop and upper can be replaced by an regexp.

							SAL

On Wed, Feb 24, 2016 at 09:29:11AM +0000, JUNG, Christian wrote:
> From: Christian Jung <christian.jung at shsservices.org>
> Date: Wed, 24 Feb 2016 10:16:26 +0100
> Signed-off-by: Christian Jung <christian.jung at shsservices.org>
> 
> This patch adds the functions chop and upper.
> 
> chop removes the last character of a string setting
>     iPXE> set myvar Hello World
>     iPXE> chop myvar
>     iPXE> echo ${myvar}
>     Hello Worl
> 
> upper converts a string setting to upper case
>     iPXE> set myvar hello world
>     iPXE> upper myvar
>     iPXE> echo ${myvar}
>     HELLO WORLD
> 
> ---
>  src/hci/commands/nvo_cmd.c | 119 +++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 119 insertions(+)
> 
> diff --git a/src/hci/commands/nvo_cmd.c b/src/hci/commands/nvo_cmd.c
> index ac0d606..adbf2d7 100644
> --- a/src/hci/commands/nvo_cmd.c
> +++ b/src/hci/commands/nvo_cmd.c
> @@ -32,6 +32,7 @@
>  #include <ipxe/command.h>
>  #include <ipxe/parseopt.h>
>  #include <readline/readline.h>
> +#include <ctype.h>
>  
>  FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
>  
> @@ -326,6 +327,116 @@ static int inc_exec ( int argc, char **argv ) {
>  	return rc;
>  }
>  
> +/** "chop" options */
> +struct chop_options {};
> +
> +/** "chop" option list */
> +static struct option_descriptor chop_opts[] = {};
> +
> +/** "chop" command descriptor */
> +static struct command_descriptor chop_cmd =
> +	COMMAND_DESC ( struct chop_options, chop_opts, 1, 1,
> +		       "<setting>" );
> +
> +/**
> + * "chop" command (chop the last character of a setting)
> + *
> + * @v argc		Argument count
> + * @v argv		Argument list
> + * @ret rc		Return status code
> + */
> +static int chop_exec ( int argc, char **argv ) {
> +	struct chop_options opts;
> +	struct named_setting setting;
> +	char *value;
> +	int rc;
> +
> +	/* Parse options */
> +	if ( ( rc = parse_options ( argc, argv, &chop_cmd, &opts ) ) != 0 )
> +		goto err_parse_options;
> +
> +	/* Parse setting name */
> +	if ( ( rc = parse_existing_setting ( argv[optind], &setting ) ) != 0 )
> +		goto err_parse_setting;
> +
> +	/* Read existing value */
> +	if ( ( rc = fetch_string_setting_copy( setting.settings,  &setting.setting,
> +					&value ) ) < 0 ) {
> +		goto err_parse_setting;
> +	}
> +	if ( rc > 0 ) {
> +		if ( ( rc = store_setting ( setting.settings, &setting.setting,
> +					     value, rc - 1 ) ) != 0 ) {
> +			printf ( "Could not store \"%s\": %s\n",
> +				 setting.setting.name, strerror ( rc ) );
> +			goto err_store;
> +		}
> +	}
> +
> + err_store:
> +	free( value );
> + err_parse_setting:
> + err_parse_options:
> +	return rc;
> +}
> +
> +/** "upper" options */
> +struct upper_options {};
> +
> +/** "upper" option list */
> +static struct option_descriptor upper_opts[] = {};
> +
> +/** "upper" command descriptor */
> +static struct command_descriptor upper_cmd =
> +	COMMAND_DESC ( struct upper_options, upper_opts, 1, 1,
> +		       "<setting>" );
> +
> +/**
> + * "upper" command (convert setting to upper case)
> + *
> + * @v argc		Argument count
> + * @v argv		Argument list
> + * @ret rc		Return status code
> + */
> +static int upper_exec ( int argc, char **argv ) {
> +	struct upper_options opts;
> +	struct named_setting setting;
> +	char *value;
> +	char *p;
> +	int rc;
> +
> +	/* Parse options */
> +	if ( ( rc = parse_options ( argc, argv, &upper_cmd, &opts ) ) != 0 )
> +		goto err_parse_options;
> +
> +	/* Parse setting name */
> +	if ( ( rc = parse_existing_setting ( argv[optind], &setting ) ) != 0 )
> +		goto err_parse_setting;
> +
> +	/* Read existing value */
> +	if ( ( rc = fetch_string_setting_copy( setting.settings,  &setting.setting,
> +					&value ) ) <= 0 ) {
> +		goto err_parse_setting;
> +	}
> +
> +	for ( p = value; *p != '\0'; p++ ) {
> +		*p = toupper(*p);
> +	}
> +
> +	if ( ( rc = store_setting ( setting.settings, &setting.setting,
> +					 value, rc ) ) != 0 ) {
> +		printf ( "Could not store \"%s\": %s\n",
> +			 setting.setting.name, strerror ( rc ) );
> +		goto err_store;
> +	}
> +
> + err_store:
> +	free( value );
> + err_parse_setting:
> + err_parse_options:
> +	return rc;
> +}
> +
>  /** Non-volatile option commands */
>  struct command nvo_commands[] __command = {
>  	{
> @@ -348,4 +459,12 @@ struct command nvo_commands[] __command = {
>  		.name = "inc",
>  		.exec = inc_exec,
>  	},
> +	{
> +		.name = "chop",
> +		.exec = chop_exec,
> +	},
> +	{
> +		.name = "upper",
> +		.exec = upper_exec,
> +	},
>  };
> -- 
> 2.1.4
> 
> _______________________________________________
> ipxe-devel mailing list
> ipxe-devel at lists.ipxe.org
> https://lists.ipxe.org/mailman/listinfo.cgi/ipxe-devel



More information about the ipxe-devel mailing list