Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
${(q)...} for newline
- X-seq: zsh-workers 27965
- From: Peter Stephenson <p.w.stephenson@xxxxxxxxxxxx>
- To: zsh-workers@xxxxxxx (Zsh hackers list)
- Subject: ${(q)...} for newline
- Date: Sun, 23 May 2010 20:58:40 +0100
- List-help: <mailto:zsh-workers-help@zsh.org>
- List-id: Zsh Workers List <zsh-workers.zsh.org>
- List-post: <mailto:zsh-workers@zsh.org>
- Mailing-list: contact zsh-workers-help@xxxxxxx; run by ezmlm
Param-style simple (i.e. backslash) quoting of a newline appends a real
newline in double quotes. It seems to me it would occasion far fewer
surprises if this never output a literal newline, so this uses $'\n'. We
already bargain for up to 7 output characters per input character. The
first two hunks are just a tidy up (written before I realised I didn't
need to do any more counting).
Index: Src/utils.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/utils.c,v
retrieving revision 1.242
diff -p -u -r1.242 utils.c
--- Src/utils.c 27 Mar 2010 19:04:36 -0000 1.242
+++ Src/utils.c 23 May 2010 19:54:21 -0000
@@ -4585,11 +4585,12 @@ quotestring(const char *s, char **e, int
* quotesub = 2: mechanism active, added opening "'"; need
* closing "'".
*/
- int quotesub = 0;
+ int quotesub = 0, slen;
char *quotestart;
convchar_t cc;
const char *uend;
+ slen = strlen(s);
switch (instring)
{
case QT_BACKSLASH:
@@ -4598,21 +4599,22 @@ quotestring(const char *s, char **e, int
* Keep memory usage within limits by allocating temporary
* storage and using heap for correct size at end.
*/
- alloclen = strlen(s) * 7 + 1;
+ alloclen = slen * 7 + 1;
break;
case QT_SINGLE_OPTIONAL:
/*
* Here, we may need to add single quotes.
*/
- alloclen = strlen(s) * 4 + 3;
+ alloclen = slen * 4 + 3;
quotesub = 1;
break;
default:
- alloclen = strlen(s) * 4 + 1;
+ alloclen = slen * 4 + 1;
break;
}
+
tt = quotestart = v = buf = zshcalloc(alloclen);
DPUTS(instring < QT_BACKSLASH || instring == QT_BACKTICK ||
@@ -4771,15 +4773,19 @@ quotestring(const char *s, char **e, int
continue;
} else if (*u == '\n' ||
(instring == QT_SINGLE && *u == '\'')) {
- if (unset(RCQUOTES)) {
+ if (*u == '\n') {
+ *v++ = '$';
+ *v++ = '\'';
+ *v++ = '\\';
+ *v++ = 'n';
+ *v++ = '\'';
+ } else if (unset(RCQUOTES)) {
*v++ = '\'';
if (*u == '\'')
*v++ = '\\';
*v++ = *u;
*v++ = '\'';
- } else if (*u == '\n')
- *v++ = '"', *v++ = '\n', *v++ = '"';
- else
+ } else
*v++ = '\'', *v++ = '\'';
u++;
continue;
--
Peter Stephenson <p.w.stephenson@xxxxxxxxxxxx>
Web page now at http://homepage.ntlworld.com/p.w.stephenson/
Messages sorted by:
Reverse Date,
Date,
Thread,
Author