[settings] Use a generic setting's own type as its default type

When fetching a named setting using a name that does not explicitly
specify a type, default to using the type stored when the setting was
created, rather than always defaulting to "string".  This allows the
behaviour of user-defined settings to match the behaviour of
predefined settings (which have a sensible default type).

For example:

  set server:ipv4 192.168.0.1
  echo ${server}

will now print "192.168.0.1", rather than trying to print out the raw
IPv4 address bytes as a string.

The downside of this change is that existing tricks for printing
special characters within scripts may require (backwards-compatible)
modification.  For example, the "clear screen" sequence:

  set esc:hex 1b
  set cls ${esc}[2J
  echo ${cls}

will now have to become

  set esc:hex 1b
  set cls ${esc:string}[2J  # Must now explicitly specify ":string"
  echo ${cls}

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2012-08-31 03:52:06 +01:00
parent e6427b7ee1
commit 25ec56e0ec
4 changed files with 61 additions and 11 deletions

View File

@@ -249,7 +249,8 @@ static int choose_exec ( int argc, char **argv ) {
goto err_show_menu;
/* Store setting */
if ( ( rc = storef_named_setting ( setting, item->label ) ) != 0 ) {
if ( ( rc = storef_named_setting ( setting, &setting_type_string,
item->label ) ) != 0 ) {
printf ( "Could not store \"%s\": %s\n",
setting, strerror ( rc ) );
goto err_store;

View File

@@ -127,7 +127,8 @@ static int set_core_exec ( int argc, char **argv,
goto err_get_value;
/* Determine total length of command line */
if ( ( rc = storef_named_setting ( name, value ) ) != 0 ) {
if ( ( rc = storef_named_setting ( name, &setting_type_string,
value ) ) != 0 ) {
printf ( "Could not %s \"%s\": %s\n",
argv[0], name, strerror ( rc ) );
goto err_store;