From 74e056bfc8e2d6f006548c0134502697c056f97a Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Fri, 9 Mar 2001 20:34:46 +0000 Subject: [PATCH] Fixed a couple more cases. $FOO/bar ${FOO} and such now work without wordexp. Of course for stuff like ${1:-foo} you still need wordexp for them to work. -Erik --- lash.c | 18 ++++++++++++++---- sh.c | 18 ++++++++++++++---- shell/lash.c | 18 ++++++++++++++---- 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/lash.c b/lash.c index 34dca0449..8f19e526a 100644 --- a/lash.c +++ b/lash.c @@ -1014,7 +1014,6 @@ static int expand_arguments(char *command) * wordexp can't do for us, namely $? and $! */ src = command; while((dst = strchr(src,'$')) != NULL){ - printf("dollar '%s'\n", dst); var = NULL; switch(*(dst+1)) { case '?': @@ -1057,14 +1056,25 @@ static int expand_arguments(char *command) } else { /* Looks like an environment variable */ char delim_hold; - src=strpbrk(dst+1, " \t~`!$^&*()=|\\{}[];\"'<>?."); + int num_skip_chars=1; + int dstlen = strlen(dst); + /* Is this a ${foo} type variable? */ + if (dstlen >=2 && *(dst+1) == '{') { + src=strchr(dst+1, '}'); + num_skip_chars=2; + } else { + src=strpbrk(dst+1, " \t~`!$^&*()=|\\[];\"'<>?./"); + } if (src == NULL) { - src = dst+strlen(dst); + src = dst+dstlen; } delim_hold=*src; *src='\0'; /* temporary */ - var = getenv(dst + 1); + var = getenv(dst + num_skip_chars); *src=delim_hold; + if (num_skip_chars==2) { + src++; + } } if (var == NULL) { /* Seems we got an un-expandable variable. So delete it. */ diff --git a/sh.c b/sh.c index 34dca0449..8f19e526a 100644 --- a/sh.c +++ b/sh.c @@ -1014,7 +1014,6 @@ static int expand_arguments(char *command) * wordexp can't do for us, namely $? and $! */ src = command; while((dst = strchr(src,'$')) != NULL){ - printf("dollar '%s'\n", dst); var = NULL; switch(*(dst+1)) { case '?': @@ -1057,14 +1056,25 @@ static int expand_arguments(char *command) } else { /* Looks like an environment variable */ char delim_hold; - src=strpbrk(dst+1, " \t~`!$^&*()=|\\{}[];\"'<>?."); + int num_skip_chars=1; + int dstlen = strlen(dst); + /* Is this a ${foo} type variable? */ + if (dstlen >=2 && *(dst+1) == '{') { + src=strchr(dst+1, '}'); + num_skip_chars=2; + } else { + src=strpbrk(dst+1, " \t~`!$^&*()=|\\[];\"'<>?./"); + } if (src == NULL) { - src = dst+strlen(dst); + src = dst+dstlen; } delim_hold=*src; *src='\0'; /* temporary */ - var = getenv(dst + 1); + var = getenv(dst + num_skip_chars); *src=delim_hold; + if (num_skip_chars==2) { + src++; + } } if (var == NULL) { /* Seems we got an un-expandable variable. So delete it. */ diff --git a/shell/lash.c b/shell/lash.c index 34dca0449..8f19e526a 100644 --- a/shell/lash.c +++ b/shell/lash.c @@ -1014,7 +1014,6 @@ static int expand_arguments(char *command) * wordexp can't do for us, namely $? and $! */ src = command; while((dst = strchr(src,'$')) != NULL){ - printf("dollar '%s'\n", dst); var = NULL; switch(*(dst+1)) { case '?': @@ -1057,14 +1056,25 @@ static int expand_arguments(char *command) } else { /* Looks like an environment variable */ char delim_hold; - src=strpbrk(dst+1, " \t~`!$^&*()=|\\{}[];\"'<>?."); + int num_skip_chars=1; + int dstlen = strlen(dst); + /* Is this a ${foo} type variable? */ + if (dstlen >=2 && *(dst+1) == '{') { + src=strchr(dst+1, '}'); + num_skip_chars=2; + } else { + src=strpbrk(dst+1, " \t~`!$^&*()=|\\[];\"'<>?./"); + } if (src == NULL) { - src = dst+strlen(dst); + src = dst+dstlen; } delim_hold=*src; *src='\0'; /* temporary */ - var = getenv(dst + 1); + var = getenv(dst + num_skip_chars); *src=delim_hold; + if (num_skip_chars==2) { + src++; + } } if (var == NULL) { /* Seems we got an un-expandable variable. So delete it. */ -- 2.25.1