Ok, lets try this again, shall we? It was definatly my mistake, not

Steve's.. :-]
This commit is contained in:
Peter Wemm 1996-09-10 02:42:33 +00:00
parent 7006eca8ae
commit 5c817731db
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=18202
2 changed files with 33 additions and 17 deletions

View File

@ -33,7 +33,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: expand.c,v 1.7 1996/09/01 10:20:07 peter Exp $
* $Id$
*/
#ifndef lint
@ -97,8 +97,8 @@ STATIC char *exptilde __P((char *, int));
STATIC void expbackq __P((union node *, int, int));
STATIC int subevalvar __P((char *, char *, int, int, int));
STATIC char *evalvar __P((char *, int));
STATIC int varisset __P((int));
STATIC void varvalue __P((int, int, int));
STATIC int varisset __P((char *));
STATIC void varvalue __P((char *, int, int));
STATIC void recordregion __P((int, int, int));
STATIC void ifsbreakup __P((char *, struct arglist *));
STATIC void expandmeta __P((struct strlist *, int));
@ -547,7 +547,7 @@ evalvar(p, flag)
p = strchr(p, '=') + 1;
again: /* jump here after setting a variable with ${var=text} */
if (special) {
set = varisset(*var);
set = varisset(var);
val = NULL;
} else {
val = lookupvar(var);
@ -563,7 +563,7 @@ evalvar(p, flag)
/* insert the value of the variable */
if (special) {
char *exp, *oexpdest = expdest;
varvalue(*var, varflags & VSQUOTE, flag & EXP_FULL);
varvalue(var, varflags & VSQUOTE, flag & EXP_FULL);
if (subtype == VSLENGTH) {
for (exp = oexpdest;exp != expdest; exp++)
varlen++;
@ -677,22 +677,23 @@ evalvar(p, flag)
STATIC int
varisset(name)
char name;
char *name;
{
char **ap;
int num;
if (name == '!') {
if (*name == '!') {
if (backgndpid == -1)
return 0;
} else if (name == '@' || name == '*') {
} else if (*name == '@' || *name == '*') {
if (*shellparam.p == NULL)
return 0;
} else if ((unsigned)(name -= '1') <= '9' - '1') {
} else if (is_digit(*name)) {
num = atoi(name);
ap = shellparam.p;
do {
while (num-- > 0)
if (*ap++ == NULL)
return 0;
} while (--name >= 0);
}
return 1;
}
@ -705,7 +706,7 @@ varisset(name)
STATIC void
varvalue(name, quoted, allow_split)
char name;
char *name;
int quoted;
int allow_split;
{
@ -732,7 +733,7 @@ varvalue(name, quoted, allow_split)
} while (0)
switch (name) {
switch (*name) {
case '$':
num = rootpid;
goto numvar;
@ -773,9 +774,12 @@ varvalue(name, quoted, allow_split)
STRTODEST(p);
break;
default:
if ((unsigned)(name -= '1') <= '9' - '1') {
p = shellparam.p[name];
STRTODEST(p);
if (is_digit(*name)) {
num = atoi(name);
if (num > 0 && num <= shellparam.nparam) {
p = shellparam.p[num - 1];
STRTODEST(p);
}
}
break;
}

View File

@ -33,7 +33,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: parser.c,v 1.13 1996/09/03 14:15:57 peter Exp $
* $Id$
*/
#ifndef lint
@ -1141,6 +1141,7 @@ parsesub: {
#ifndef GDB_HACK
static const char types[] = "}-+?=";
#endif
int bracketed_name = 0; /* used to handle ${[0-9]*} variables */
c = pgetc();
if (c != '(' && c != '{' && !is_name(c) && !is_special(c)) {
@ -1159,6 +1160,7 @@ parsesub: {
USTPUTC(VSNORMAL, out);
subtype = VSNORMAL;
if (c == '{') {
bracketed_name = 1;
c = pgetc();
if (c == '#') {
if ((c = pgetc()) == '}')
@ -1174,6 +1176,16 @@ parsesub: {
STPUTC(c, out);
c = pgetc();
} while (is_in_name(c));
} else if (is_digit(c)) {
if (bracketed_name) {
do {
STPUTC(c, out);
c = pgetc();
} while (is_digit(c));
} else {
STPUTC(c, out);
c = pgetc();
}
} else {
if (! is_special(c))
badsub: synerror("Bad substitution");