On Mon, Feb 19, 2018 at 11:13 PM, Harald van Dijk wrote:
> On 2/18/18 11:50 PM, Harald van Dijk wrote:
>> On 2/14/18 11:50 PM, Harald van Dijk wrote:
>>> On 2/14/18 10:44 PM, Harald van Dijk wrote:
On 2/14/18 9:03 PM, Harald van Dijk wrote:
> On 13/02/2018 14:53, Denys Vlasenko wrote:
>> $ >'\'
>> $ >'\'
>> $ dash -c 'echo "\*"'
>> \ \
>
>
> [...]
>
> Currently:
>
> $ dash -c 'foo=a; echo "<${foo#[a\]]}>"'
> <>
>
> This is what I expect, and also what bash, ksh and posh do.
>
> With your patch:
>
> $ dash -c 'foo=a; echo "<${foo#[a\]]}>"'
>
Does the attached look right as an alternative? It treats a quoted
backslash the same way as if it were preceded by CTLESC in _rmescapes. It
passes your test case and mine, but I'll do more extensive testing.
>>>
>>> It causes preglob's string to potentially grow larger than the original.
>>> When called with RMESCAPE_ALLOC, that can be handled by increasing the
>>> buffer size, but preglob also gets called without RMESCAPE_ALLOC to modify a
>>> string in-place. That's never going to work with this approach. Back to the
>>> drawing board...
>>
>> There is a way to make it work: ensure sufficient memory is always
>> available. Instead of inserting CTLESC, which caused problems,
>> CTLQUOTEMARK+CTLQUOTEMARK can be inserted instead. It's effectively a no-op
>> here.
>
> It required one obvious additional trivial change to the CHECKSTRSPACE
> invocation, but with that added, the attached passed all testing I could
> think of. Does this look okay to include, did I miss something, or is there
> perhaps a better alternative?
I propose replacing this:
if (*p == (char)CTLESC) {
p++;
+ goto escape;
+ } else if (*p == '\\') {
+ if (inquotes) {
+escape:
+ if (notescaped)
+ *q++ = '\\';
+ } else {
+ /* naked back slash */
+ notescaped = 0;
+ goto copy;
+ }
with equivalent
if (*p == (char)CTLESC) {
p++;
+ goto escape;
+ }
+ if (*p == '\\') {
+ if (!inquotes) {
+ /* naked back slash */
+ notescaped = 0;
+ goto copy;
+ }
+escape:
+ if (notescaped)
+ *q++ = '\\';
--
To unsubscribe from this list: send the line "unsubscribe dash" in
the body of a message to majord...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html