bug#1204: [BusyBox] bug#1204: msh chokes on variables names with underscores

Matt Kraai kraai at alumni.carnegiemellon.edu
Sat Aug 4 09:15:02 UTC 2001


On Fri, Aug 03, 2001 at 10:31:39PM -0700, Marc Matteo wrote:
> msh gives a "not found" error when a script tries to use variables with
> underscores in the variable names.

So it does.  The following patch should allow underscores to be
used in variable names.  I'll commit this Monday unless someone
beats me to it (or lets me know why it is horribly broken).

Matt

--- busybox-0.60.0/msh.c	Wed Aug  1 10:21:33 2001
+++ busybox/msh.c	Sat Aug  4 07:57:05 2001
@@ -1261,7 +1261,7 @@
 ronly(vp)
 struct var *vp;
 {
-	if (isalpha(vp->name[0]))	/* not an internal symbol ($# etc) */
+	if (isalpha(vp->name[0]) || vp->name[0] == '_')	/* not an internal symbol */
 		vp->status |= RONLY;
 }
 
@@ -1269,10 +1269,10 @@
 isassign(s)
 register char *s;
 {
-	if (!isalpha((int)*s))
+	if (!isalpha((int)*s) && *s != '_')
 		return(0);
 	for (; *s != '='; s++)
-		if (*s == 0 || !isalnum(*s))
+		if (*s == 0 || (!isalnum(*s) && *s != '_'))
 			return(0);
 	return(1);
 }
@@ -1285,10 +1285,10 @@
 	register char *cp;
 	struct var *vp;
 
-	if (!isalpha(*s))
+	if (!isalpha(*s) && *s != '_')
 		return(0);
 	for (cp = s; *cp != '='; cp++)
-		if (*cp == 0 || !isalnum(*cp))
+		if (*cp == 0 || (!isalnum(*cp) && *cp != '_'))
 			return(0);
 	vp = lookup(s);
 	nameval(vp, ++cp, cf == COPYV? (char *)NULL: s);
@@ -1301,10 +1301,10 @@
 checkname(cp)
 register char *cp;
 {
-	if (!isalpha(*cp++))
+	if (!isalpha(*cp++) && *(cp-1) != '_')
 		return(0);
 	while (*cp)
-		if (!isalnum(*cp++))
+		if (!isalnum(*cp++) && *(cp-1) != '_')
 			return(0);
 	return(1);
 }
@@ -1316,7 +1316,7 @@
 	register struct var *vp;
 
 	for (vp = vlist; vp; vp = vp->next)
-		if (vp->status & f && isalpha(*vp->name)) {
+		if (vp->status & f && (isalpha(*vp->name) || *vp->name == '_')) {
 			if (vp->status & EXPORT)
 				write(out, "export ", 7);
 			if (vp->status & RONLY)
@@ -3406,7 +3406,7 @@
 register char *s;
 int out;
 {
-	if (isalnum(*s)) {
+	if (isalnum(*s) || *s == '_') {
 		write(out, s, strlen(s));
 		write(out, "\n", 1);
 	}
@@ -3613,7 +3613,7 @@
 		c = 0;
 	}
 	unget(c);
-	if (!isalpha(c))
+	if (!isalpha(c) && c != '_')
 		scanequals = 0;
 	for (;;) {
 		c = subgetc('"', foundequals);
@@ -3631,7 +3631,7 @@
 				foundequals = 1;
 				scanequals  = 0;
 			}
-			else if (!isalnum(c))
+			else if (!isalnum(c) && c != '_')
 				scanequals = 0;
 		}
 		*e.linep++ = c;
@@ -3684,8 +3684,8 @@
 	s = e.linep;
 	if (c != '{') {
 		*e.linep++ = c;
-		if (isalpha(c)) {
-			while ((c = readc())!=0 && isalnum(c))
+		if (isalpha(c) || c == '_') {
+			while ((c = readc())!=0 && (isalnum(c) || c == '_'))
 				if (e.linep < elinep)
 					*e.linep++ = c;
 			unget(c);






More information about the busybox mailing list