summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1999-02-12 11:17:06 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1999-02-12 11:17:06 +0000
commit42c802126215101feed36135ba8f9601895ec03a (patch)
treefde428b1886469b75e73222107e2ee5fdc798ef3 /parse.y
parent997ff23758884944f28a089eaa50ac7eb1c026c6 (diff)
990212
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_3@400 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y15
1 files changed, 10 insertions, 5 deletions
diff --git a/parse.y b/parse.y
index 1e9e2f1f71..899b08c3c4 100644
--- a/parse.y
+++ b/parse.y
@@ -2293,7 +2293,7 @@ here_document(term, indent)
char *eos, *p;
int len;
VALUE str;
- volatile VALUE line;
+ volatile VALUE line = 0;
VALUE lastline_save;
int offset_save;
NODE *list = 0;
@@ -2332,15 +2332,15 @@ here_document(term, indent)
str = rb_str_new(0,0);
for (;;) {
- line = (*lex_gets)(lex_input);
+ lex_lastline = line = (*lex_gets)(lex_input);
if (NIL_P(line)) {
error:
ruby_sourceline = linesave;
rb_compile_error("can't find string \"%s\" anywhere before EOF", eos);
- free(eos);
- return 0;
+ free(eos);
+ return 0;
}
- normalize_newline(line);
+ normalize_newline(line);
ruby_sourceline++;
p = RSTRING(line)->ptr;
if (indent) {
@@ -2361,6 +2361,7 @@ here_document(term, indent)
}
}
#endif
+ retry:
switch (parse_string(term, '\n', '\n')) {
case tSTRING:
case tXSTRING:
@@ -2385,6 +2386,10 @@ here_document(term, indent)
case 0:
goto error;
}
+ if (lex_lastline != line) {
+ line = lex_lastline;
+ goto retry;
+ }
}
free(eos);
lex_lastline = lastline_save;