aboutsummaryrefslogtreecommitdiffstats
path: root/string.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2019-01-08 09:08:31 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2019-01-08 09:08:31 +0000
commit50784a0a4412df551d96dd01067473cd4226481b (patch)
treeac31564d8efa9913bc4b25bc1e099916d89f140d /string.c
parente52b102c36dc1dd609a97149e99edc7d1f96b7a4 (diff)
downloadruby-50784a0a4412df551d96dd01067473cd4226481b.tar.gz
Defer escaping control char in error messages
* eval_error.c (print_errinfo): defer escaping control char in error messages until writing to stderr, instead of quoting at building the message. [ruby-core:90853] [Bug #15497] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66753 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r--string.c37
1 files changed, 22 insertions, 15 deletions
diff --git a/string.c b/string.c
index 118403b934..fefcd05e64 100644
--- a/string.c
+++ b/string.c
@@ -5818,6 +5818,24 @@ rb_str_buf_cat_escaped_char(VALUE result, unsigned int c, int unicode_p)
return l;
}
+const char *
+ruby_escaped_char(int c)
+{
+ switch (c) {
+ case '\0': return "\\0";
+ case '\n': return "\\n";
+ case '\r': return "\\r";
+ case '\t': return "\\t";
+ case '\f': return "\\f";
+ case '\013': return "\\v";
+ case '\010': return "\\b";
+ case '\007': return "\\a";
+ case '\033': return "\\e";
+ case '\x7f': return "\\c?";
+ }
+ return NULL;
+}
+
VALUE
rb_str_escape(VALUE str)
{
@@ -5832,7 +5850,8 @@ rb_str_escape(VALUE str)
int asciicompat = rb_enc_asciicompat(enc);
while (p < pend) {
- unsigned int c, cc;
+ unsigned int c;
+ const char *cc;
int n = rb_enc_precise_mbclen(p, pend, enc);
if (!MBCLEN_CHARFOUND_P(n)) {
if (p > prev) str_buf_cat(result, prev, p - prev);
@@ -5849,22 +5868,10 @@ rb_str_escape(VALUE str)
n = MBCLEN_CHARFOUND_LEN(n);
c = rb_enc_mbc_to_codepoint(p, pend, enc);
p += n;
- switch (c) {
- case '\n': cc = 'n'; break;
- case '\r': cc = 'r'; break;
- case '\t': cc = 't'; break;
- case '\f': cc = 'f'; break;
- case '\013': cc = 'v'; break;
- case '\010': cc = 'b'; break;
- case '\007': cc = 'a'; break;
- case 033: cc = 'e'; break;
- default: cc = 0; break;
- }
+ cc = ruby_escaped_char(c);
if (cc) {
if (p - n > prev) str_buf_cat(result, prev, p - n - prev);
- buf[0] = '\\';
- buf[1] = (char)cc;
- str_buf_cat(result, buf, 2);
+ str_buf_cat(result, cc, strlen(cc));
prev = p;
}
else if (asciicompat && rb_enc_isascii(c, enc) && ISPRINT(c)) {