diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-04-02 03:22:06 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-04-02 03:22:06 +0900 |
| commit | 911764e8e202c38d193c6b4aa677f52c2253135c (patch) | |
| tree | e0bbc5167632f091a9727edc667ec69aa4b9b22e /src | |
| parent | 3b339ed47fed8db9d4d86b834c685fe110a3421a (diff) | |
| download | mruby-911764e8e202c38d193c6b4aa677f52c2253135c.tar.gz mruby-911764e8e202c38d193c6b4aa677f52c2253135c.zip | |
handle CR before LF; close #1781
Diffstat (limited to 'src')
| -rw-r--r-- | src/parse.y | 46 |
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); |
