mirror of
				git://git.code.sf.net/p/cdesktopenv/code
				synced 2025-03-09 15:50:02 +00:00 
			
		
		
		
	Fix ERE repetition expressions in [[ ... =~ ERE{x,y} ]] (#54)
Regular expressions that combine a repetition expression with
a parenthesized sub-expression throw a garbled syntax error:
$ [[ AATAAT =~ (AAT){2} ]]
ksh: syntax error: `~(E)(AAT){2} ]]
:'%Cred%h%Creseksh: syntax error: `~(E)(AAT){2} ]]
:'%Cred%h%Creseksh: syntax' unexpected
The syntax error occurs because ksh is not fully
accounting for '=~' when it runs into a curly bracket.
This fix disables the syntax error when the operator
is '=~' and adds handling for '(str){x}' (to allow for
more than one sub-expression). This bugfix and the
regression tests for it were backported from ksh93v-
2014-12-24-beta.
src/cmd/ksh93/sh/lex.c:
- Do not trigger a syntax error for '{x}' when the operator
  is '=~' and add handling for multiple parentheses when
  combined with '{x}'.
src/cmd/ksh93/tests/bracket.sh:
- Add two tests from ksh93v- to test sub-expressions
  combined with the '{x}' quantifier.
			
			
This commit is contained in:
		
							parent
							
								
									ad9a9219f0
								
							
						
					
					
						commit
						db1d539d49
					
				
					 3 changed files with 15 additions and 1 deletions
				
			
		|  | @ -388,6 +388,12 @@ int sh_lex(Lex_t* lp) | |||
| 		switch(n) | ||||
| 		{ | ||||
| 			case S_BREAK: | ||||
| 				if(lp->lex.incase>TEST_RE && mode==ST_NORM && c==LPAREN) | ||||
| 				{ | ||||
| 					pushlevel(lp,RPAREN,mode); | ||||
| 					mode = ST_NESTED; | ||||
| 					continue; | ||||
| 				} | ||||
| 				fcseek(-LEN); | ||||
| 				goto breakloop; | ||||
| 			case S_EOF: | ||||
|  | @ -1163,7 +1169,7 @@ int sh_lex(Lex_t* lp) | |||
| 				} | ||||
| 				if(mode==ST_NONE) | ||||
| 					return(0); | ||||
| 				if(c!=n) | ||||
| 				if(c!=n && lp->lex.incase<TEST_RE) | ||||
| 				{ | ||||
| 					lp->token = c; | ||||
| 					sh_syntax(lp); | ||||
|  |  | |||
|  | @ -388,5 +388,10 @@ var=$(echo begin; exec >/dev/tty; [ -t 1 ] && test -t 1 && [[ -t 1 ]]) \ | |||
| test 123 -eq 123x 2>/dev/null | ||||
| [[ $? -ge 2 ]] || err_exit 'test builtin should return value greater than 1 on error' | ||||
| 
 | ||||
| # ====== | ||||
| # The '=~' operator should work with curly brackets | ||||
| $SHELL -c '[[ AATAAT =~ (AAT){2} ]]' || err_exit '[[ AATAAT =~ (AAT){2} ]] does not match' | ||||
| $SHELL -c '[[ AATAATCCCAATAAT =~ (AAT){2}CCC(AAT){2} ]]' || err_exit '[[ AATAATCCCAATAAT =~ (AAT){2}CCC(AAT){2} ]] does not match' | ||||
| 
 | ||||
| # ====== | ||||
| exit $((Errors<125?Errors:125)) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue