summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorAnton Babushkin <anton.babushkin@me.com>2014-01-09 19:11:29 +0100
committerAnton Babushkin <anton.babushkin@me.com>2014-01-09 19:11:29 +0100
commitcb7f30317a655f620dfc905069c9066494e99161 (patch)
treee7c8579eb55717f39fd9e7c3a2ac66d54fb9b48f /apps
parentc3b289e604a944f2c78f7b0eb8a2bfd1e66d198d (diff)
downloadpx4-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.c55
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