sh: Allow empty << EOF markers.
This commit is contained in:
parent
81dacd8beb
commit
92fe71faae
@ -106,6 +106,8 @@ static int startlinno; /* line # where last token started */
|
||||
static int funclinno; /* line # where the current function started */
|
||||
static struct parser_temp *parser_temp;
|
||||
|
||||
#define NOEOFMARK ((const char *)&heredoclist)
|
||||
|
||||
|
||||
static union node *list(int);
|
||||
static union node *andor(void);
|
||||
@ -972,6 +974,10 @@ checkend(int c, const char *eofmark, int striptabs)
|
||||
pungetc();
|
||||
pushstring(eofmark + 1, q - (eofmark + 1), NULL);
|
||||
}
|
||||
} else if (c == '\n' && *eofmark == '\0') {
|
||||
c = PEOF;
|
||||
plinno++;
|
||||
needprompt = doprompt;
|
||||
}
|
||||
return (c);
|
||||
}
|
||||
@ -1383,7 +1389,7 @@ readtoken1(int firstc, char const *initialsyntax, const char *eofmark,
|
||||
|
||||
STARTSTACKSTR(out);
|
||||
loop: { /* for each line, until end of word */
|
||||
if (eofmark)
|
||||
if (eofmark && eofmark != NOEOFMARK)
|
||||
/* set c to PEOF if at end of here document */
|
||||
c = checkend(c, eofmark, striptabs);
|
||||
for (;;) { /* until end of line or end of word */
|
||||
@ -2046,7 +2052,7 @@ expandstr(const char *ps)
|
||||
parser_temp = NULL;
|
||||
setinputstring(ps, 1);
|
||||
doprompt = 0;
|
||||
readtoken1(pgetc(), DQSYNTAX, "", 0);
|
||||
readtoken1(pgetc(), DQSYNTAX, NOEOFMARK, 0);
|
||||
if (backquotelist != NULL)
|
||||
error("Command substitution not allowed here");
|
||||
|
||||
|
@ -57,6 +57,7 @@ FILES+= heredoc9.0
|
||||
FILES+= heredoc10.0
|
||||
FILES+= heredoc11.0
|
||||
FILES+= heredoc12.0
|
||||
FILES+= heredoc13.0
|
||||
FILES+= line-cont1.0
|
||||
FILES+= line-cont2.0
|
||||
FILES+= line-cont3.0
|
||||
|
21
bin/sh/tests/parser/heredoc13.0
Normal file
21
bin/sh/tests/parser/heredoc13.0
Normal file
@ -0,0 +1,21 @@
|
||||
# $FreeBSD$
|
||||
|
||||
failures=0
|
||||
|
||||
check() {
|
||||
if ! eval "[ $* ]"; then
|
||||
echo "Failed: $*"
|
||||
: $((failures += 1))
|
||||
fi
|
||||
}
|
||||
|
||||
check '"$(cat <<""
|
||||
|
||||
echo yes)" = "yes"'
|
||||
|
||||
check '"$(cat <<""
|
||||
yes
|
||||
|
||||
)" = "yes"'
|
||||
|
||||
exit $((failures != 0))
|
Loading…
Reference in New Issue
Block a user