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) | |
| download | olio-uboot-2014.01-641b0d374eeea65778bf8cb2107064c2aff195eb.tar.xz olio-uboot-2014.01-641b0d374eeea65778bf8cb2107064c2aff195eb.zip | |
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 1eff182ef..39cf203a9 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;  } |