1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-03-09 15:50:02 +00:00

Fix remaining bug in ${var:-'{}'} (re: d087b031)

The following problems remained:

$ var=x; echo ${var:-'{}'}
x}
$ var=; echo ${var:+'{}'}
}

src/cmd/ksh93/sh/macro.c: varsub():
- Use the new ST_MOD1 state table to skip over ${var-'foo'}, etc.
  instead of ST_QUOTE. In ST_MOD1 the ' is categorised as S_LIT
  which causes the single quotes to be skipped over correctly.
  See d087b031 for more info.

src/cmd/ksh93/tests/quoting2.sh:
- Add tests for this remaining bug.
- Make the new test xtrace-proof.

Resolves: https://github.com/ksh93/ksh/issues/290 (again)
This commit is contained in:
Martijn Dekker 2021-05-03 02:59:09 +01:00
parent 1aec9b06dd
commit f31e368795
4 changed files with 25 additions and 4 deletions

View file

@ -254,14 +254,30 @@ actual=$(printf %q $'1\x[11]1')
# https://github.com/ksh93/ksh/issues/290
var=dummy
exp='{}'
got=$(eval 'echo ${var:+'\''{}'\''}' 2>&1)
got=$(set +x; eval 'echo ${var:+'\''{}'\''}' 2>&1)
[[ $got == "$exp" ]] || err_exit "Single quotes misparsed in expansion operator string (1)" \
"(expected $(printf %q "$exp"), got $(printf %q "$got"))"
unset var
exp='}'
got=$(eval 'echo ${var:-'\''}'\''}' 2>&1)
got=$(set +x; eval 'echo ${var:-'\''}'\''}' 2>&1)
[[ $got == "$exp" ]] || err_exit "Single quotes misparsed in expansion operator string (2)" \
"(expected $(printf %q "$exp"), got $(printf %q "$got"))"
exp='x'
got=$(var=x; set +x; eval 'echo ${var:-'\''{}'\''}' 2>&1)
[[ $got == "$exp" ]] || err_exit "Single quotes misparsed in expansion operator string (3)" \
"(expected $(printf %q "$exp"), got $(printf %q "$got"))"
exp=''
got=$(var=; set +x; eval 'echo ${var:+'\''{}'\''}' 2>&1)
[[ $got == "$exp" ]] || err_exit "Single quotes misparsed in expansion operator string (4)" \
"(expected $(printf %q "$exp"), got $(printf %q "$got"))"
exp='{}'
got=$(unset var; set +x; eval 'echo ${var-'\''{}'\''}' 2>&1)
[[ $got == "$exp" ]] || err_exit "Single quotes misparsed in expansion operator string (5)" \
"(expected $(printf %q "$exp"), got $(printf %q "$got"))"
exp=''
got=$(unset var; set +x; eval 'echo ${var+'\''{}'\''}' 2>&1)
[[ $got == "$exp" ]] || err_exit "Single quotes misparsed in expansion operator string (6)" \
"(expected $(printf %q "$exp"), got $(printf %q "$got"))"
# ======
exit $((Errors<125?Errors:125))