aboutsummaryrefslogtreecommitdiffstats
path: root/eval_error.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-03-13 03:48:56 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-03-13 03:48:56 +0000
commit1032f093ccd7d67553737d7a7686973291730d0e (patch)
tree251c6d90e20b4f6132bae8b362a0565c6d445fd8 /eval_error.c
parentb07e4af86935780887944432542f0d4b8a2ab62f (diff)
downloadruby-1032f093ccd7d67553737d7a7686973291730d0e.tar.gz
eval_error.c: reset attributes
* eval_error.c (print_errinfo): reset all attributes for each lines before newlines. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62737 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'eval_error.c')
-rw-r--r--eval_error.c32
1 files changed, 25 insertions, 7 deletions
diff --git a/eval_error.c b/eval_error.c
index d630f47014..5495a36c19 100644
--- a/eval_error.c
+++ b/eval_error.c
@@ -152,14 +152,32 @@ print_errinfo(const VALUE eclass, const VALUE errat, const VALUE emesg, const VA
if (highlight) write_warn(str, reset);
write_warn2(str, "\n", 1);
}
- if (tail) {
- int eol = einfo[elen-1] == '\n';
- if (eol && highlight) --elen;
- if (tail < einfo+elen) {
- if (highlight) write_warn(str, bold);
+ if (tail && einfo+elen > tail) {
+ if (!highlight) {
write_warn2(str, tail, einfo+elen-tail);
- if (highlight) write_warn(str, reset);
- if (highlight || !eol) write_warn2(str, "\n", 1);
+ if (einfo[elen-1] != '\n') write_warn2(str, "\n", 1);
+ }
+ else {
+ elen -= tail - einfo;
+ einfo = tail;
+ while (elen > 0) {
+ tail = memchr(einfo, '\n', elen);
+ if (!tail || tail > einfo) {
+ write_warn(str, bold);
+ write_warn2(str, einfo, tail ? tail-einfo : elen);
+ write_warn(str, reset);
+ if (!tail) {
+ write_warn2(str, "\n", 1);
+ break;
+ }
+ }
+ elen -= tail - einfo;
+ einfo = tail;
+ do ++tail; while (tail < einfo+elen && *tail == '\n');
+ write_warn2(str, einfo, tail-einfo);
+ elen -= tail - einfo;
+ einfo = tail;
+ }
}
}
else if (!epath) {