* Philip Guenther <guent...@gmail.com> [120810 00:45]:
> On Thu, Aug 9, 2012 at 5:31 AM, Mark Kettenis <mark.kette...@xs4all.nl> wrote:
> >> Date: Thu, 9 Aug 2012 11:30:13 +0200
> >> From: Landry Breuil <lan...@rhaalovely.net>
> ...
> >> in the context of https://bugzilla.mozilla.org/show_bug.cgi?id=781461
> >> i've stumbled upon the following issue:
> >> (our pdksh)
> >>
> > $FOO=1
> >> $cat <<EOF
> >> > echo ${FOO:+'blah'aa}
> >> > EOF
> >> echo blahaa
> >>
> >> bash-4.2# FOO=1
> >> bash-4.2# cat <<EOF
> >> >  echo ${FOO:+'blah'aa}
> >> > EOF
> >>  echo 'blah'aa
> >>
> >> Apparently the ksh from solaris, hpux and debian don't strip the quotes
> >> in that usecase, and none of the other shells do (bash, dash, zsh...)
> >>
> >> So maybe it can be considered as a bug in our pdksh..
> >
> > I think it is.  POSIX says in 2.6.2 Parameter Expansion that:
> >
> >   "...word shall be subjected to tilde expansion, parameter expansion,
> >   command substitution, and arithmetic expansion."
> >
> > which suggests that quote removal isn't supposed to happen.
> 
> I agree.  The bug applies to the simple double-quoted case too:
> 
> $ foo=1
> $ echo "${foo:+'blah'}"
> blah
> $
> 
> The correct output there should include the single-quotes, ala:
> 'blah'

Hi.

Nobody cares, so here's my attempt. I haven't run it though a
world/ports build because of slow hardware on my hands right now.

Index: lex.c
===================================================================
RCS file: /cvs/src/bin/ksh/lex.c,v
retrieving revision 1.45
diff -u -r1.45 lex.c
--- lex.c       9 Mar 2011 09:30:39 -0000       1.45
+++ lex.c       11 Aug 2012 20:18:15 -0000
@@ -271,6 +271,8 @@
                                break;
                        case '\'':
                                *wp++ = OQUOTE;
+                               if (state == SBRACE)
+                                       *wp++ = CHAR, *wp++ = c;
                                ignore_backslash_newline++;
                                PUSH_STATE(SSQUOTE);
                                break;
@@ -420,6 +422,8 @@
                        if (c == '\'') {
                                POP_STATE();
                                *wp++ = CQUOTE;
+                               if (state == SBRACE)
+                                       *wp++ = CHAR, *wp++ = c;
                                ignore_backslash_newline--;
                        } else
                                *wp++ = QCHAR, *wp++ = c;
Index: tests/unclass2.t
===================================================================
RCS file: /cvs/src/bin/ksh/tests/unclass2.t,v
retrieving revision 1.2
diff -u -r1.2 unclass2.t
--- tests/unclass2.t    25 Jun 1998 19:02:43 -0000      1.2
+++ tests/unclass2.t    11 Aug 2012 20:18:19 -0000
@@ -161,3 +161,12 @@
        XX
 ---
 
+name: single quotes in braces
+description:
+       Check that single quotes inside {} are not lost
+stdin:
+       foo=1
+       echo "${foo:+'blah'}"
+expected-stdout:
+       'blah'
+---

Reply via email to