hush: fix handling of empty heredoc EOF marker

function                                             old     new   delta
parse_stream                                        2609    2634     +25

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2017-07-29 20:43:26 +02:00
parent a732898fdd
commit 0f018b3070
5 changed files with 63 additions and 17 deletions

View File

@ -0,0 +1,4 @@
OK1
Ok:0
OK2
Ok:0

View File

@ -0,0 +1,14 @@
unset a
# Heredoc with empty delimiter
cat <<- ""
OK1
echo Ok:$?
# Heredoc with empty delimiter
cat <<- ""
OK2
echo Ok:$?

View File

@ -4001,24 +4001,34 @@ static char *fetch_till_str(o_string *as_string,
ch = i_getch(input);
if (ch != EOF)
nommu_addchr(as_string, ch);
if ((ch == '\n' || ch == EOF)
&& ((heredoc_flags & HEREDOC_QUOTED) || prev != '\\')
) {
if (strcmp(heredoc.data + past_EOL, word) == 0) {
heredoc.data[past_EOL] = '\0';
debug_printf_parse("parsed heredoc '%s'\n", heredoc.data);
return heredoc.data;
}
while (ch == '\n') {
o_addchr(&heredoc, ch);
prev = ch;
if (ch == '\n' || ch == EOF) {
check_heredoc_end:
if ((heredoc_flags & HEREDOC_QUOTED) || prev != '\\') {
if (strcmp(heredoc.data + past_EOL, word) == 0) {
heredoc.data[past_EOL] = '\0';
debug_printf_parse("parsed heredoc '%s'\n", heredoc.data);
return heredoc.data;
}
if (ch == '\n') {
/* This is a new line.
* Remember position and backslash-escaping status.
*/
o_addchr(&heredoc, ch);
prev = ch;
jump_in:
past_EOL = heredoc.length;
do {
ch = i_getch(input);
if (ch != EOF)
nommu_addchr(as_string, ch);
} while ((heredoc_flags & HEREDOC_SKIPTABS) && ch == '\t');
past_EOL = heredoc.length;
/* Get 1st char of next line, possibly skipping leading tabs */
do {
ch = i_getch(input);
if (ch != EOF)
nommu_addchr(as_string, ch);
} while ((heredoc_flags & HEREDOC_SKIPTABS) && ch == '\t');
/* If this immediately ended the line,
* go back to end-of-line checks.
*/
if (ch == '\n')
goto check_heredoc_end;
}
}
}
if (ch == EOF) {

View File

@ -0,0 +1,4 @@
OK1
Ok:0
OK2
Ok:0

View File

@ -0,0 +1,14 @@
unset a
# Heredoc with empty delimiter
cat <<- ""
OK1
echo Ok:$?
# Heredoc with empty delimiter
cat <<- ""
OK2
echo Ok:$?