diff options
author | Anton Babushkin <anton.babushkin@me.com> | 2014-01-09 19:11:29 +0100 |
---|---|---|
committer | Anton Babushkin <anton.babushkin@me.com> | 2014-01-09 19:11:29 +0100 |
commit | cb7f30317a655f620dfc905069c9066494e99161 (patch) | |
tree | e7c8579eb55717f39fd9e7c3a2ac66d54fb9b48f /apps | |
parent | c3b289e604a944f2c78f7b0eb8a2bfd1e66d198d (diff) | |
download | px4-nuttx-cb7f30317a655f620dfc905069c9066494e99161.tar.gz px4-nuttx-cb7f30317a655f620dfc905069c9066494e99161.tar.bz2 px4-nuttx-cb7f30317a655f620dfc905069c9066494e99161.zip |
nsh env variables expanding
Diffstat (limited to 'apps')
-rw-r--r-- | apps/nshlib/nsh_envcmds.c | 55 |
1 files changed, 50 insertions, 5 deletions
diff --git a/apps/nshlib/nsh_envcmds.c b/apps/nshlib/nsh_envcmds.c index 07b775517..5e7f3e7b6 100644 --- a/apps/nshlib/nsh_envcmds.c +++ b/apps/nshlib/nsh_envcmds.c @@ -137,6 +137,48 @@ static inline char *nsh_getdirpath(FAR struct nsh_vtbl_s *vtbl, return alloc; } +static int expand_env(const char *src, char *res, int res_size) +{ + unsigned int src_idx = 0; + unsigned int res_idx = 0; + int var_idx = -1; + char var_name[32]; + while (res_idx < res_size) { + char c = src[src_idx++]; + if (var_idx >= 0) { + // parsing variable name + if (var_idx == 0 && c == '{') { + continue; + } else if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_') { + // variable name + var_name[var_idx++] = c; + continue; + } else { + // end of variable name + var_name[var_idx] = '\0'; + char *var_value = getenv(var_name); + for (unsigned int i = 0; res_idx < res_size && var_value[i] != 0; i++) { + res[res_idx++] = var_value[i]; + } + var_idx = -1; + if (c == '}') + continue; + } + } + if (c == '$') { + // start parsing variable + var_idx = 0; + continue; + } + // normal string + res[res_idx++] = c; + if (c == '\0') + break; + } + if (res_idx >= res_size) + return -1; + return 0; +} /**************************************************************************** * Public Functions ****************************************************************************/ @@ -309,11 +351,14 @@ int cmd_pwd(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) #ifndef CONFIG_NSH_DISABLE_SET int cmd_set(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) { - int ret = setenv(argv[1], argv[2], TRUE); - if (ret < 0) - { - nsh_output(vtbl, g_fmtcmdfailed, argv[0], "setenv", NSH_ERRNO); - } + char value[256]; + int ret = expand_env(argv[2], value, sizeof(value)); + if (ret == 0) { + ret = setenv(argv[1], value, TRUE); + } + if (ret < 0) { + nsh_output(vtbl, g_fmtcmdfailed, argv[0], "setenv", NSH_ERRNO); + } return ret; } #endif |