String#inspect's encoding should be fixed.
* string.c (rb_str_inspect): result's encoding should be fixed. If default_internal is not nil, the encoding is default_internal. Else if default_external is not nil, the encoding is default_external. But the encoding is not ASCII-compatible, the encoding is replaced by US-ASCII. Characters in ASCII-incompatible encoding or non ASCII characters in other than the encoding will be \xXX escaped. * string.c (str_buf_cat2): defined. * string.c (prefix_escape): removed. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@25113 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
45dc99aea4
commit
036c701bad
14
ChangeLog
14
ChangeLog
@ -1,3 +1,17 @@
|
|||||||
|
Sun Sep 27 04:20:55 2009 NARUSE, Yui <naruse@ruby-lang.org>
|
||||||
|
|
||||||
|
* string.c (rb_str_inspect): result's encoding should be fixed.
|
||||||
|
If default_internal is not nil, the encoding is default_internal.
|
||||||
|
Else if default_external is not nil, the encoding is default_external.
|
||||||
|
But the encoding is not ASCII-compatible, the encoding is replaced by
|
||||||
|
US-ASCII.
|
||||||
|
Characters in ASCII-incompatible encoding or non ASCII characters
|
||||||
|
in other than the encoding will be \xXX escaped.
|
||||||
|
|
||||||
|
* string.c (str_buf_cat2): defined.
|
||||||
|
|
||||||
|
* string.c (prefix_escape): removed.
|
||||||
|
|
||||||
Sun Sep 27 05:37:45 2009 Alexander Zavorine <alexandre.zavorine@nokia.com>
|
Sun Sep 27 05:37:45 2009 Alexander Zavorine <alexandre.zavorine@nokia.com>
|
||||||
|
|
||||||
* symbian/missing-pips.c: Updated to work with the latest PIPS 1.6.
|
* symbian/missing-pips.c: Updated to work with the latest PIPS 1.6.
|
||||||
|
62
string.c
62
string.c
@ -1741,6 +1741,12 @@ str_buf_cat(VALUE str, const char *ptr, long len)
|
|||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
str_buf_cat2(VALUE str, const char *ptr)
|
||||||
|
{
|
||||||
|
return str_buf_cat(str, ptr, strlen(ptr));
|
||||||
|
}
|
||||||
|
|
||||||
VALUE
|
VALUE
|
||||||
rb_str_buf_cat(VALUE str, const char *ptr, long len)
|
rb_str_buf_cat(VALUE str, const char *ptr, long len)
|
||||||
{
|
{
|
||||||
@ -4034,13 +4040,6 @@ str_cat_char(VALUE str, unsigned int c, rb_encoding *enc)
|
|||||||
rb_enc_str_buf_cat(str, s, n, enc);
|
rb_enc_str_buf_cat(str, s, n, enc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
prefix_escape(VALUE str, unsigned int c, rb_encoding *enc)
|
|
||||||
{
|
|
||||||
str_cat_char(str, '\\', enc);
|
|
||||||
str_cat_char(str, c, enc);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* call-seq:
|
* call-seq:
|
||||||
* str.inspect => string
|
* str.inspect => string
|
||||||
@ -4059,10 +4058,13 @@ rb_str_inspect(VALUE str)
|
|||||||
rb_encoding *enc = STR_ENC_GET(str);
|
rb_encoding *enc = STR_ENC_GET(str);
|
||||||
char *p, *pend;
|
char *p, *pend;
|
||||||
VALUE result = rb_str_buf_new(0);
|
VALUE result = rb_str_buf_new(0);
|
||||||
|
rb_encoding *resenc = rb_default_internal_encoding();
|
||||||
|
|
||||||
|
if (resenc == NULL) resenc = rb_default_external_encoding();
|
||||||
|
if (!rb_enc_asciicompat(resenc)) resenc = rb_usascii_encoding();
|
||||||
|
rb_enc_associate(result, resenc);
|
||||||
|
str_buf_cat2(result, "\"");
|
||||||
|
|
||||||
if (!rb_enc_asciicompat(enc)) enc = rb_usascii_encoding();
|
|
||||||
rb_enc_associate(result, enc);
|
|
||||||
str_cat_char(result, '"', enc);
|
|
||||||
p = RSTRING_PTR(str); pend = RSTRING_END(str);
|
p = RSTRING_PTR(str); pend = RSTRING_END(str);
|
||||||
while (p < pend) {
|
while (p < pend) {
|
||||||
unsigned int c, cc;
|
unsigned int c, cc;
|
||||||
@ -4083,51 +4085,49 @@ rb_str_inspect(VALUE str)
|
|||||||
MBCLEN_CHARFOUND_P(rb_enc_precise_mbclen(p,pend,enc)) &&
|
MBCLEN_CHARFOUND_P(rb_enc_precise_mbclen(p,pend,enc)) &&
|
||||||
(cc = rb_enc_codepoint(p,pend,enc),
|
(cc = rb_enc_codepoint(p,pend,enc),
|
||||||
(cc == '$' || cc == '@' || cc == '{')))) {
|
(cc == '$' || cc == '@' || cc == '{')))) {
|
||||||
prefix_escape(result, c, enc);
|
str_buf_cat2(result, "\\");
|
||||||
|
str_buf_cat(result, p - n, n);
|
||||||
}
|
}
|
||||||
else if (c == '\n') {
|
else if (c == '\n') {
|
||||||
prefix_escape(result, 'n', enc);
|
str_buf_cat2(result, "\\n");
|
||||||
}
|
}
|
||||||
else if (c == '\r') {
|
else if (c == '\r') {
|
||||||
prefix_escape(result, 'r', enc);
|
str_buf_cat2(result, "\\r");
|
||||||
}
|
}
|
||||||
else if (c == '\t') {
|
else if (c == '\t') {
|
||||||
prefix_escape(result, 't', enc);
|
str_buf_cat2(result, "\\t");
|
||||||
}
|
}
|
||||||
else if (c == '\f') {
|
else if (c == '\f') {
|
||||||
prefix_escape(result, 'f', enc);
|
str_buf_cat2(result, "\\f");
|
||||||
}
|
}
|
||||||
else if (c == '\013') {
|
else if (c == '\013') {
|
||||||
prefix_escape(result, 'v', enc);
|
str_buf_cat2(result, "\\v");
|
||||||
}
|
}
|
||||||
else if (c == '\010') {
|
else if (c == '\010') {
|
||||||
prefix_escape(result, 'b', enc);
|
str_buf_cat2(result, "\\b");
|
||||||
}
|
}
|
||||||
else if (c == '\007') {
|
else if (c == '\007') {
|
||||||
prefix_escape(result, 'a', enc);
|
str_buf_cat2(result, "\\a");
|
||||||
}
|
}
|
||||||
else if (c == 033) {
|
else if (c == 033) {
|
||||||
prefix_escape(result, 'e', enc);
|
str_buf_cat2(result, "\\e");
|
||||||
}
|
}
|
||||||
else if (rb_enc_isprint(c, enc)) {
|
else if ((enc == resenc && rb_enc_isprint(c, enc)) || rb_enc_isascii(c, enc)) {
|
||||||
rb_enc_str_buf_cat(result, p-n, n, enc);
|
str_buf_cat(result, p-n, n);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
char buf[5];
|
|
||||||
char *s;
|
|
||||||
char *q;
|
char *q;
|
||||||
|
|
||||||
escape_codepoint:
|
escape_codepoint:
|
||||||
for (q = p-n; q < p; q++) {
|
for (q = p-n; q < p; q++) {
|
||||||
s = buf;
|
#define BACKESC_BUFSIZE 5
|
||||||
sprintf(buf, "\\x%02X", *q & 0377);
|
char buf[BACKESC_BUFSIZE];
|
||||||
while (*s) {
|
sprintf(buf, "\\x%02X", *q & 0377);
|
||||||
str_cat_char(result, *s++, enc);
|
str_buf_cat(result, buf, BACKESC_BUFSIZE - 1);
|
||||||
}
|
#undef BACKESC_BUFSIZE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
str_cat_char(result, '"', enc);
|
str_buf_cat2(result, "\"");
|
||||||
|
|
||||||
OBJ_INFECT(result, str);
|
OBJ_INFECT(result, str);
|
||||||
return result;
|
return result;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user