summary refs log tree commit diff
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2007-12-27 13:54:16 +1100
committerHerbert Xu <herbert@gondor.apana.org.au>2007-12-27 13:54:16 +1100
commit8f01c3796f0fc3bc616125288a2aa7058c442292 (patch)
treeaf130dfcced302fb067cd10de102f5ffdbbd6374
parent[ARITH] If imaxdiv() isn't available, use / and % operators (diff)
downloaddash-8f01c3796f0fc3bc616125288a2aa7058c442292.tar.gz
dash-8f01c3796f0fc3bc616125288a2aa7058c442292.zip
[PARSER] Add FAKEEOFMARK for expandstr
Previously expandstr used the string "" to indicate that it needs to be
treated just like a here-doc except that there is no terminator.  However,
the string "" is in fact a valid here-doc terminator so now that we deal
with it correctly expandstr no longer works in the presence of new-lines
in the prompt.

This patch introduces the FAKEEOFMARK macro which does not equal any
real EOF marker but is distinct from the NULL pointer which is used to
indicate non-here-doc contexts.

Thanks to Markus Triska for reporting this regression.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--ChangeLog4
-rw-r--r--src/parser.c14
2 files changed, 16 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 56acd66..8b392f4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2007-12-27  Herbert Xu <herbert@gondor.apana.org.au>
+
+	* Add FAKEEOFMARK for expandstr.
+
 2007-12-23  Gerrit Pape <pape@smarden.org>
 
 	* If imaxdiv() isn't available, use / and % operators.
diff --git a/src/parser.c b/src/parser.c
index 2d20b00..3206328 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -64,6 +64,11 @@
 
 
 
+/* Used by expandstr to get here-doc like behaviour. */
+#define FAKEEOFMARK (char *)1
+
+
+
 struct heredoc {
 	struct heredoc *next;	/* next here document in list */
 	union node *here;		/* redirection node */
@@ -113,6 +118,11 @@ isassignment(const char *p)
 	return *q == '=';
 }
 
+static inline int realeofmark(const char *eofmark)
+{
+	return eofmark && eofmark != FAKEEOFMARK;
+}
+
 
 /*
  * Read and parse a command.  Returns NEOF on end of file.  (NULL is a
@@ -1030,7 +1040,7 @@ endword:
  */
 
 checkend: {
-	if (eofmark) {
+	if (realeofmark(eofmark)) {
 		int markloc;
 		char *p;
 
@@ -1492,7 +1502,7 @@ expandstr(const char *ps)
 
 	/* XXX Fix (char *) cast. */
 	setinputstring((char *)ps);
-	readtoken1(pgetc(), DQSYNTAX, nullstr, 0);
+	readtoken1(pgetc(), DQSYNTAX, FAKEEOFMARK, 0);
 	popfile();
 
 	n.narg.type = NARG;