diff options
Diffstat (limited to 'parse.y')
-rw-r--r-- | parse.y | 32 |
1 files changed, 17 insertions, 15 deletions
@@ -5409,11 +5409,12 @@ parser_yyerror(struct parser_params *parser, const char *msg) #ifndef RIPPER const int max_line_margin = 30; const char *p, *pe; + const char *pre = "", *post = ""; + const char *code = "", *carret = "", *newline = ""; char *buf; long len; int i; - compile_error(PARSER_ARG "%s", msg); p = lex_p; while (lex_pbeg <= p) { if (*p == '\n') break; @@ -5430,7 +5431,6 @@ parser_yyerror(struct parser_params *parser, const char *msg) len = pe - p; if (len > 4) { char *p2; - const char *pre = "", *post = ""; if (len > max_line_margin * 2 + 10) { if (lex_p - p > max_line_margin) { @@ -5443,22 +5443,24 @@ parser_yyerror(struct parser_params *parser, const char *msg) } len = pe - p; } - buf = ALLOCA_N(char, len+2); - MEMCPY(buf, p, char, len); - buf[len] = '\0'; - rb_compile_error_with_enc(NULL, 0, (void *)current_enc, "%s%s%s", pre, buf, post); - i = (int)(lex_p - p); - p2 = buf; pe = buf + len; - - while (p2 < pe) { - if (*p2 != '\t') *p2 = ' '; - p2++; + buf = ALLOCA_N(char, i+2); + code = p; + carret = p2 = buf; + while (i-- > 0) { + *p2++ = *p++ == '\t' ? '\t' : ' '; } - buf[i] = '^'; - buf[i+1] = '\0'; - rb_compile_error_append("%s%s", pre, buf); + *p2++ = '^'; + *p2 = '\0'; + newline = "\n"; + } + else { + len = 0; } + compile_error(PARSER_ARG "%s%s""%s%.*s%s%s""%s%s", + msg, newline, + pre, (int)len, code, post, newline, + pre, carret); #else dispatch1(parse_error, STR_NEW2(msg)); ripper_error(); |