summaryrefslogtreecommitdiffstats
path: root/cmd-parse.y
diff options
context:
space:
mode:
authornicm <nicm>2020-06-04 08:30:44 +0000
committernicm <nicm>2020-06-04 08:30:44 +0000
commitd3c5202f50c28586a5a4e97b77332b57b798335b (patch)
treeb2ba5c331946a8f65f8f7ca0ca03a559abda2987 /cmd-parse.y
parentb3782d2dc8f872c43fcf53b9436c4e881d3f1e2d (diff)
Allow strings to span multiple lines - newlines and any leading
whitespace are removed, as well as any following comments that couldn't be part of a format. This allows long formats or other strings to be annotated and indented.
Diffstat (limited to 'cmd-parse.y')
-rw-r--r--cmd-parse.y41
1 files changed, 23 insertions, 18 deletions
diff --git a/cmd-parse.y b/cmd-parse.y
index 985994aa..6ec2eca3 100644
--- a/cmd-parse.y
+++ b/cmd-parse.y
@@ -1494,24 +1494,33 @@ yylex_token(int ch)
buf = xmalloc(1);
for (;;) {
- /*
- * EOF or \n are always the end of the token. If inside quotes
- * they are an error.
- */
- if (ch == EOF || ch == '\n') {
- if (state != NONE)
- goto error;
+ /* EOF or \n are always the end of the token. */
+ if (ch == EOF || (state == NONE && ch == '\n'))
break;
- }
- /* Whitespace or ; ends a token unless inside quotes. */
+ /* Whitespace or ; or } ends a token unless inside quotes. */
if ((ch == ' ' || ch == '\t' || ch == ';' || ch == '}') &&
state == NONE)
break;
- /*
- * \ ~ and $ are expanded except in single quotes.
- */
+ /* Spaces and comments inside quotes after \n are removed. */
+ if (ch == '\n' && state != NONE) {
+ while ((ch = yylex_getc()) == ' ' || ch == '\t')
+ /* nothing */;
+ if (ch != '#')
+ continue;
+ ch = yylex_getc();
+ if (strchr(",#{}:", ch) != NULL) {
+ yylex_ungetc(ch);
+ ch = '#';
+ } else {
+ while ((ch = yylex_getc()) != '\n' && ch != EOF)
+ /* nothing */;
+ }
+ continue;
+ }
+
+ /* \ ~ and $ are expanded except in single quotes. */
if (ch == '\\' && state != SINGLE_QUOTES) {
if (!yylex_token_escape(&buf, &len))
goto error;
@@ -1530,9 +1539,7 @@ yylex_token(int ch)
if (ch == '}' && state == NONE)
goto error; /* unmatched (matched ones were handled) */
- /*
- * ' and " starts or end quotes (and is consumed).
- */
+ /* ' and " starts or end quotes (and is consumed). */
if (ch == '\'') {
if (state == NONE) {
state = SINGLE_QUOTES;
@@ -1554,9 +1561,7 @@ yylex_token(int ch)
}
}
- /*
- * Otherwise add the character to the buffer.
- */
+ /* Otherwise add the character to the buffer. */
yylex_append1(&buf, &len, ch);
skip: