[comp.bugs.4bsd] csh variable syntax '${x1[2]}' is broken.

chris@mimsy.UUCP (Chris Torek) (04/06/89)

Date: Wed, 13 Jan 88 20:36:53 EST
From: Chris Torek <chris@gyre.umd.edu>
To: 4bsd-bugs@ucbvax.Berkeley.EDU
Subject: csh mislexes $var1iables

Index: bin/csh/sh.lex.c 4.3BSD Fix
Reference: 4.3BSD/bin/114

Description:
	The C shell's `lexical analyser' (if you can call it that)
	thinks that variables are either all digits or all numbers.
	As far as it is concerned, $a1bc is the variable $a followed
	by the string `1bc'.  Everyone is happy: the lexer sees a
	properly-formed variable ($a) plus a string, and later, the
	variable evaluator looks up $a1bc.

	If, however, one writes instead ${a1bc}, the lexer is not
	happy.  It sees a variable (${a) that is not proper: the
	closing brace `}' is missing.  It complains about variable
	syntax (an ambiguous error, but here the real meaning is not
	the intended one!), and the evaluator never gets a chance.

Repeat-by:
	% set a1=ok
	% echo ${a1}
	Variable syntax.
	% man csh
	(read section on shell variable syntax)

Fix:
	It seems to work.  The code is all twisty and devious, so
	maybe it will break something.  I doubt it.

Chris

*** sh.lex.c.old	Wed Jan 13 20:22:06 1988
--- sh.lex.c	Wed Jan 13 20:22:10 1988
***************
*** 373,377 ****
  			}
  		} else if (letter(c))
! 			while (letter(c = getC(DOEXCL))) {
  				if (np < &name[sizeof name / 2])
  					*np++ = c;
--- 373,377 ----
  			}
  		} else if (letter(c))
! 			while (letter(c = getC(DOEXCL)) || digit(c)) {
  				if (np < &name[sizeof name / 2])
  					*np++ = c;

-- 
In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 7163)
Domain:	chris@mimsy.umd.edu	Path:	uunet!mimsy!chris