diff options
author | Joe Hershberger <joe.hershberger@ni.com> | 2012-08-17 10:26:29 +0000 |
---|---|---|
committer | Wolfgang Denk <wd@denx.de> | 2012-09-02 20:30:24 +0200 |
commit | 641b0d374eeea65778bf8cb2107064c2aff195eb (patch) | |
tree | 256be8ba66e737f82f2ac31b1ce0795ea8388bf8 /common/hush.c | |
parent | 923c46f97a7936cbdc6e113d7705cf46a73dc85c (diff) |
hush: Add default value substitution support
Use standard sh syntax:
${VAR:-default}
Use default value: if VAR is set and non-null, expands to $VAR.
Otherwise, expands to default.
${VAR:=default}
Set default value: if VAR is set and non-null, expands to $VAR.
Otherwise, sets hush VAR to default and expands to default.
${VAR:+default}
If VAR is set and non-null, expands to the empty string.
Otherwise, expands to default.
Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
Diffstat (limited to 'common/hush.c')
-rw-r--r-- | common/hush.c | 43 |
1 files changed, 40 insertions, 3 deletions
diff --git a/common/hush.c b/common/hush.c index 1eff182efa..39cf203a9f 100644 --- a/common/hush.c +++ b/common/hush.c @@ -2743,13 +2743,50 @@ static int parse_group(o_string *dest, struct p_context *ctx, static char *lookup_param(char *src) { char *p; + char *sep; + char *default_val = NULL; + int assign = 0; + int expand_empty = 0; if (!src) return NULL; - p = getenv(src); - if (!p) - p = get_local_var(src); + sep = strchr(src, ':'); + + if (sep) { + *sep = '\0'; + if (*(sep + 1) == '-') + default_val = sep+2; + if (*(sep + 1) == '=') { + default_val = sep+2; + assign = 1; + } + if (*(sep + 1) == '+') { + default_val = sep+2; + expand_empty = 1; + } + } + + p = getenv(src); + if (!p) + p = get_local_var(src); + + if (!p || strlen(p) == 0) { + p = default_val; + if (assign) { + char *var = malloc(strlen(src)+strlen(default_val)+2); + if (var) { + sprintf(var, "%s=%s", src, default_val); + set_local_var(var, 0); + } + free(var); + } + } else if (expand_empty) { + p += strlen(p); + } + + if (sep) + *sep = ':'; return p; } |