diff options
author | nicm <nicm> | 2020-06-04 08:30:44 +0000 |
---|---|---|
committer | nicm <nicm> | 2020-06-04 08:30:44 +0000 |
commit | d3c5202f50c28586a5a4e97b77332b57b798335b (patch) | |
tree | b2ba5c331946a8f65f8f7ca0ca03a559abda2987 /cmd-parse.y | |
parent | b3782d2dc8f872c43fcf53b9436c4e881d3f1e2d (diff) | |
download | rtmux-d3c5202f50c28586a5a4e97b77332b57b798335b.tar.gz rtmux-d3c5202f50c28586a5a4e97b77332b57b798335b.tar.bz2 rtmux-d3c5202f50c28586a5a4e97b77332b57b798335b.zip |
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.y | 41 |
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: |