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.j...@shsservices.org> > Date: Wed, 24 Feb 2016 10:16:26 +0100 > Signed-off-by: Christian Jung <christian.j...@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@lists.ipxe.org > https://lists.ipxe.org/mailman/listinfo.cgi/ipxe-devel _______________________________________________ ipxe-devel mailing list ipxe-devel@lists.ipxe.org https://lists.ipxe.org/mailman/listinfo.cgi/ipxe-devel