summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-04-02 03:22:06 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-04-02 03:22:06 +0900
commit911764e8e202c38d193c6b4aa677f52c2253135c (patch)
treee0bbc5167632f091a9727edc667ec69aa4b9b22e /src
parent3b339ed47fed8db9d4d86b834c685fe110a3421a (diff)
downloadmruby-911764e8e202c38d193c6b4aa677f52c2253135c.tar.gz
mruby-911764e8e202c38d193c6b4aa677f52c2253135c.zip
handle CR before LF; close #1781
Diffstat (limited to 'src')
-rw-r--r--src/parse.y46
1 files changed, 19 insertions, 27 deletions
diff --git a/src/parse.y b/src/parse.y
index 9f721738e..08cc0f966 100644
--- a/src/parse.y
+++ b/src/parse.y
@@ -3327,6 +3327,7 @@ backref_error(parser_state *p, node *n)
}
}
+static void pushback(parser_state *p, int c);
static mrb_bool peeks(parser_state *p, const char *s);
static mrb_bool skips(parser_state *p, const char *s);
@@ -3360,6 +3361,14 @@ nextc(parser_state *p)
}
}
p->column++;
+ if (c == '\r') {
+ c = nextc(p);
+ if (c != '\n') {
+ pushback(p, c);
+ return '\r';
+ }
+ return c;
+ }
return c;
eof:
@@ -3814,45 +3823,28 @@ parse_string(parser_state *p)
if (c == end || c == beg) {
tokadd(p, c);
}
- else if ((c == '\n') && (type & STR_FUNC_ARRAY)) {
+ else if (c == '\n') {
p->lineno++;
p->column = 0;
- tokadd(p, '\n');
+ if (type & STR_FUNC_ARRAY) {
+ tokadd(p, '\n');
+ }
}
else {
- if (type & STR_FUNC_REGEXP) {
- if (c == 'u') {
- pushback(p, c);
- tokadd(p, read_escape(p));
- }
- else {
- tokadd(p, '\\');
- if (c >= 0)
- tokadd(p, c);
- }
- }
- else {
- pushback(p, c);
- tokadd(p, read_escape(p));
- }
+ pushback(p, c);
+ tokadd(p, read_escape(p));
if (hinf)
hinf->line_head = FALSE;
}
}
else {
if (c != beg && c != end) {
- switch (c) {
- case '\n':
+ if (c == '\n') {
p->lineno++;
p->column = 0;
- break;
-
- case '\\':
- break;
-
- default:
- if (! ISSPACE(c))
- tokadd(p, '\\');
+ }
+ if (!(c == '\\' || ((type & STR_FUNC_ARRAY) && ISSPACE(c)))) {
+ tokadd(p, '\\');
}
}
tokadd(p, c);