mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-02-15 04:32:24 +00:00
read -S
now correctly handles nested double quotes
Prior to this bugfix, the following set of commands would fail to print two double quotes: IFS=',' read -S a b c <<<'foo,"""title"" data",bar' echo $b This fix is from ksh93v- 2013-10-10-alpha, although it has been revised to use stakputc to put the required double quote into the buffer for consistency with the ksh93u+ codebase. src/cmd/ksh93/bltins/read.c: - When handling nested double quotes, put the required double quote in read's buffer with stakputc. src/cmd/ksh93/tests/builtins.sh: - Add the regression test for `read -S` from ksh93v-. src/cmd/ksh93/sh.1: - Fix a minor formatting error to highlight '-S' in the ksh(1) man page.
This commit is contained in:
parent
5498d9ec25
commit
af0bd6ad70
5 changed files with 21 additions and 3 deletions
4
NEWS
4
NEWS
|
@ -3,6 +3,10 @@ For full details, see the git log at: https://github.com/ksh93/ksh
|
||||||
|
|
||||||
Any uppercase BUG_* names are modernish shell bug IDs.
|
Any uppercase BUG_* names are modernish shell bug IDs.
|
||||||
|
|
||||||
|
2020-06-14:
|
||||||
|
- 'read -S' is now able to correctly handle strings with double quotes
|
||||||
|
nested inside of double quotes.
|
||||||
|
|
||||||
2020-06-13:
|
2020-06-13:
|
||||||
|
|
||||||
- Fixed a timezone name determination bug on FreeBSD that caused the
|
- Fixed a timezone name determination bug on FreeBSD that caused the
|
||||||
|
|
|
@ -566,13 +566,21 @@ int sh_readline(register Shell_t *shp,char **names, volatile int fd, int flags,s
|
||||||
#endif /*SHOPT_MULTIBYTE */
|
#endif /*SHOPT_MULTIBYTE */
|
||||||
case S_QUOTE:
|
case S_QUOTE:
|
||||||
c = shp->ifstable[*cp++];
|
c = shp->ifstable[*cp++];
|
||||||
inquote = !inquote;
|
if(inquote && c==S_QUOTE)
|
||||||
|
c = -1;
|
||||||
|
else
|
||||||
|
inquote = !inquote;
|
||||||
if(val)
|
if(val)
|
||||||
{
|
{
|
||||||
stakputs(val);
|
stakputs(val);
|
||||||
use_stak = 1;
|
use_stak = 1;
|
||||||
*val = 0;
|
*val = 0;
|
||||||
}
|
}
|
||||||
|
if(c==-1)
|
||||||
|
{
|
||||||
|
stakputc('"');
|
||||||
|
c = shp->ifstable[*cp++];
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
case S_ESC:
|
case S_ESC:
|
||||||
/* process escape character */
|
/* process escape character */
|
||||||
|
|
|
@ -17,4 +17,4 @@
|
||||||
* David Korn <dgk@research.att.com> *
|
* David Korn <dgk@research.att.com> *
|
||||||
* *
|
* *
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
#define SH_RELEASE "93u+m 2020-06-11"
|
#define SH_RELEASE "93u+m 2020-06-14"
|
||||||
|
|
|
@ -6679,7 +6679,8 @@ option causes the variable
|
||||||
.I vname\^
|
.I vname\^
|
||||||
to be read as a compound variable. Blanks will be ignored when
|
to be read as a compound variable. Blanks will be ignored when
|
||||||
finding the beginning open parenthesis.
|
finding the beginning open parenthesis.
|
||||||
The \-S
|
The
|
||||||
|
.B \-S
|
||||||
option causes the line to be treated like a record in a
|
option causes the line to be treated like a record in a
|
||||||
.B .csv
|
.B .csv
|
||||||
format file so that double quotes can be used to allow the delimiter
|
format file so that double quotes can be used to allow the delimiter
|
||||||
|
|
|
@ -692,5 +692,10 @@ EOF
|
||||||
PATH=/dev/null
|
PATH=/dev/null
|
||||||
whence -q export) || err_exit '`builtin -d` deletes special builtins'
|
whence -q export) || err_exit '`builtin -d` deletes special builtins'
|
||||||
|
|
||||||
|
# ======
|
||||||
|
# `read -S` should handle double quotes correctly
|
||||||
|
IFS=',' read -S a b c <<<'foo,"""title"" data",bar'
|
||||||
|
[[ $b == '"title" data' ]] || err_exit '"" inside "" not handled correctly with read -S'
|
||||||
|
|
||||||
# ======
|
# ======
|
||||||
exit $((Errors<125?Errors:125))
|
exit $((Errors<125?Errors:125))
|
||||||
|
|
Loading…
Reference in a new issue