This closes 10821.
Upstream patch:
    From: Herbert Xu <herbert@gondor.apana.org.au>
    Date: Fri, 9 Mar 2018 00:14:02 +0800
    parser: Add syntax stack for recursive parsing
    Without a stack of syntaxes we cannot correctly these two cases
    together:
            "${a#'$$'}"
            "${a#"${b-'$$'}"}"
    A recursive parser also helps in some other corner cases such
    as nested arithmetic expansion with paratheses.
    This patch adds a syntax stack allocated from the stack using
    alloca.  As a side-effect this allows us to remove the naked
    backslashes for patterns within double-quotes, which means that
    EXP_QPAT also has to go.
    This patch also fixes removes any backslashes that precede right
    braces when they are present within a parameter expansion context,
    and backslashes that precede double quotes within inner double
    quotes inside a parameter expansion in a here-document context.
    The idea of a recursive parser is based on a patch by Harald van
    Dijk.
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
var_bash3, var_bash4 and var_bash6 tests are updated
with the output given by bash-4.3.43
With this patch, the following tests now pass for ash:
    dollar_repl_slash_bash2.tests
    squote_in_varexp2.tests
    squote_in_varexp.tests
    var_bash4.tests
function                                             old     new   delta
readtoken1                                          2615    2874    +259
synstack_push                                          -      54     +54
evalvar                                              574     571      -3
rmescapes                                            330     310     -20
subevalvar                                          1279    1258     -21
argstr                                              1146    1107     -39
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/4 up/down: 313/-83)           Total: 230 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
		
	
		
			
				
	
	
		
			41 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
Source:        a*b\*c
 | 
						|
Replace str:   _\\_\z_
 | 
						|
Pattern:       single backslash and star: "replace literal star"
 | 
						|
Unquoted:      a_\_z_b\*c
 | 
						|
Unquoted =:    a_\_z_b\*c
 | 
						|
Quoted:        a_\_z_b\*c
 | 
						|
Quoted =:      a_\_z_b\*c
 | 
						|
Pattern:       double backslash and star: "replace backslash and everything after it"
 | 
						|
Unquoted:      a*b_\_z_
 | 
						|
Unquoted =:    a*b_\_z_
 | 
						|
Quoted:        a*b_\_z_
 | 
						|
Quoted =:      a*b_\_z_
 | 
						|
 | 
						|
Source:        a\bc
 | 
						|
Replace str:   _\\_\z_
 | 
						|
Pattern:       single backslash and b: "replace b"
 | 
						|
Unquoted:      a\_\_z_c
 | 
						|
Unquoted =:    a\_\_z_c
 | 
						|
Quoted:        a\_\_z_c
 | 
						|
Quoted =:      a\_\_z_c
 | 
						|
Pattern:       double backslash and b: "replace backslash and b"
 | 
						|
Unquoted:      a_\_z_c
 | 
						|
Unquoted =:    a_\_z_c
 | 
						|
Quoted:        a_\_z_c
 | 
						|
Quoted =:      a_\_z_c
 | 
						|
 | 
						|
Source:        a\bc
 | 
						|
Replace str:   _\\_\z_ (as variable $s)
 | 
						|
Pattern:       single backslash and b: "replace b"
 | 
						|
Unquoted:      a\_\\_\z_c
 | 
						|
Unquoted =:    a\_\\_\z_c
 | 
						|
Quoted:        a\_\\_\z_c
 | 
						|
Quoted =:      a\_\\_\z_c
 | 
						|
Pattern:       double backslash and b: "replace backslash and b"
 | 
						|
Unquoted:      a_\\_\z_c
 | 
						|
Unquoted =:    a_\\_\z_c
 | 
						|
Quoted:        a_\\_\z_c
 | 
						|
Quoted =:      a_\\_\z_c
 | 
						|
 | 
						|
Done: 0
 |