Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 25 May 1996 10:30:01 -0700 (PDT)
From:      "Lars Fredriksen" <fredriks@mcs.com>
To:        freebsd-bugs
Subject:   Re: bin/1248: shell having problem parsing arguments
Message-ID:  <199605251730.KAA05023@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/1248; it has been noted by GNATS.

From: "Lars Fredriksen" <fredriks@mcs.com>
To: joerg_wunsch@uriah.heep.sax.de
Cc: FreeBSD-gnats-submit@FreeBSD.org
Subject: Re: bin/1248: shell having problem parsing arguments
Date: Sat, 25 May 1996 12:20:34 -0500 (CDT)

 J Wunsch writes:
 > 
 > Aw!  Can you please re-submit this as a context (or uni) diff?
 > (The -c or -u flags to [cvs] diff.)  It's nearly impossible to
 > integrate plain diffs.
 > 
 > You can simply followup to this thread, GNATS will append it then to
 > the PR.
 > 
 > -- 
 > cheers, J"org
 > 
 
 Hi J"org,
 	Sorry about that, here they are:
 
 Lars
 
 
 Index: parser.c
 ===================================================================
 RCS file: /home/ncvs/src/bin/sh/parser.c,v
 retrieving revision 1.11
 diff -c -r1.11 parser.c
 *** parser.c	1996/02/03 13:27:55	1.11
 --- parser.c	1996/04/16 04:16:37
 ***************
 *** 1108,1115 ****
   		} else {
   			if (! is_special(c))
   badsub:				synerror("Bad substitution");
 ! 			USTPUTC(c, out);
 ! 			c = pgetc();
   		}
   		STPUTC('=', out);
   		flags = 0;
 --- 1108,1123 ----
   		} else {
   			if (! is_special(c))
   badsub:				synerror("Bad substitution");
 ! 			
 ! 			if (is_digit(c)) {
 ! 				do {
 ! 					STPUTC(c, out);
 ! 					c = pgetc();
 ! 				} while( is_digit(c));
 ! 			} else {
 ! 				USTPUTC(c, out);
 ! 				c = pgetc();
 ! 			}
   		}
   		STPUTC('=', out);
   		flags = 0;
 
 Index: expand.c
 ===================================================================
 RCS file: /home/ncvs/src/bin/sh/expand.c,v
 retrieving revision 1.4
 diff -c -r1.4 expand.c
 *** expand.c	1995/05/30 00:07:13	1.4
 --- expand.c	1996/05/24 17:13:03
 ***************
 *** 90,97 ****
   STATIC void argstr(char *, int);
   STATIC void expbackq(union node *, int, int);
   STATIC char *evalvar(char *, int);
 ! STATIC int varisset(int);
 ! STATIC void varvalue(int, int, int);
   STATIC void recordregion(int, int, int);
   STATIC void ifsbreakup(char *, struct arglist *);
   STATIC void expandmeta(struct strlist *, int);
 --- 90,97 ----
   STATIC void argstr(char *, int);
   STATIC void expbackq(union node *, int, int);
   STATIC char *evalvar(char *, int);
 ! STATIC int varisset(char *);
 ! STATIC void varvalue(char *, int, int);
   STATIC void recordregion(int, int, int);
   STATIC void ifsbreakup(char *, struct arglist *);
   STATIC void expandmeta(struct strlist *, int);
 ***************
 *** 453,459 ****
   	p = strchr(p, '=') + 1;
   again: /* jump here after setting a variable with ${var=text} */
   	if (special) {
 ! 		set = varisset(*var);
   		val = NULL;
   	} else {
   		val = lookupvar(var);
 --- 453,459 ----
   	p = strchr(p, '=') + 1;
   again: /* jump here after setting a variable with ${var=text} */
   	if (special) {
 ! 		set = varisset(var);
   		val = NULL;
   	} else {
   		val = lookupvar(var);
 ***************
 *** 467,473 ****
   	if (set && subtype != VSPLUS) {
   		/* insert the value of the variable */
   		if (special) {
 ! 			varvalue(*var, varflags & VSQUOTE, flag & EXP_FULL);
   		} else {
   			char const *syntax = (varflags & VSQUOTE)? DQSYNTAX : BASESYNTAX;
   
 --- 467,473 ----
   	if (set && subtype != VSPLUS) {
   		/* insert the value of the variable */
   		if (special) {
 ! 			varvalue(var, varflags & VSQUOTE, flag & EXP_FULL);
   		} else {
   			char const *syntax = (varflags & VSQUOTE)? DQSYNTAX : BASESYNTAX;
   
 ***************
 *** 539,560 ****
   
   STATIC int
   varisset(name)
 ! 	char name;
   	{
   	char **ap;
   
 ! 	if (name == '!') {
   		if (backgndpid == -1)
   			return 0;
 ! 	} else if (name == '@' || name == '*') {
   		if (*shellparam.p == NULL)
   			return 0;
 ! 	} else if ((unsigned)(name -= '1') <= '9' - '1') {
 ! 		ap = shellparam.p;
 ! 		do {
 ! 			if (*ap++ == NULL)
 ! 				return 0;
 ! 		} while (--name >= 0);
   	}
   	return 1;
   }
 --- 539,571 ----
   
   STATIC int
   varisset(name)
 ! 	char *name;
   	{
 + 	char *t;
 + 	int numvar;
   	char **ap;
   
 ! 	if (*name == '!') {
   		if (backgndpid == -1)
   			return 0;
 ! 	} else if (*name == '@' || *name == '*') {
   		if (*shellparam.p == NULL)
   			return 0;
 ! 	} else {
 ! 		t = name;
 ! 		while (is_digit(*t++)) {
 ! 			;
 ! 		}
 ! 
 ! 		if ( *--t == '=' ) { 
 ! 			*t = '\0';
 ! 			numvar = atoi(name);
 ! 			ap = shellparam.p;
 ! 			do {
 ! 				if (*ap++ == NULL)
 ! 					return 0;
 ! 			} while (--numvar > 0);
 ! 		} 
   	}
   	return 1;
   }
 ***************
 *** 567,577 ****
   
   STATIC void
   varvalue(name, quoted, allow_split)
 ! 	char name;
   	{
   	int num;
   	char temp[32];
   	char *p;
   	int i;
   	extern int exitstatus;
   	char sep;
 --- 578,590 ----
   
   STATIC void
   varvalue(name, quoted, allow_split)
 ! 	char *name;
   	{
   	int num;
 + 	int numvar;
   	char temp[32];
   	char *p;
 + 	char *t;
   	int i;
   	extern int exitstatus;
   	char sep;
 ***************
 *** 593,599 ****
   	} while (0)
   
   
 ! 	switch (name) {
   	case '$':
   		num = rootpid;
   		goto numvar;
 --- 606,612 ----
   	} while (0)
   
   
 ! 	switch (*name) {
   	case '$':
   		num = rootpid;
   		goto numvar;
 ***************
 *** 640,647 ****
   		STRTODEST(p);
   		break;
   	default:
 ! 		if ((unsigned)(name -= '1') <= '9' - '1') {
 ! 			p = shellparam.p[name];
   			STRTODEST(p);
   		}
   		break;
 --- 653,666 ----
   		STRTODEST(p);
   		break;
   	default:
 ! 
 ! 		t = name;
 ! 		while (is_digit(*t++)) {
 ! 		}
 ! 
 ! 		if ( *t == '\0' ) { 
 ! 			numvar = atoi(name);
 ! 			p = shellparam.p[numvar-1];
   			STRTODEST(p);
   		}
   		break;
 -- 
 -------------------------------------------------------------------
 Lars Fredriksen		fredriks@mcs.com		(home)
 			lars@fredriks.pr.mcs.net	(home-home)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199605251730.KAA05023>