From d3c5202f50c28586a5a4e97b77332b57b798335b Mon Sep 17 00:00:00 2001 From: nicm Date: Thu, 4 Jun 2020 08:30:44 +0000 Subject: 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. --- cmd-parse.y | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) (limited to 'cmd-parse.y') 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: -- cgit v1.2.3