summaryrefslogtreecommitdiff
path: root/string.c
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-06-05 14:16:05 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-06-05 14:16:05 +0000
commit09e9807a8972353040e7b9933bd8e8cd35b11eb5 (patch)
tree99caa32041fec0a2091eb27c4307d610e601f46a /string.c
parente1c14eabd548d275e3f978192260c8a7d619cc71 (diff)
merge revision(s) 28174:28178:
* re.c (rb_reg_expr_str): ASCII incompatible strings must always escape or converted. * re.c (rb_reg_expr_str): use rb_str_buf_cat_escaped_char when resenc is given: for Regexp#inspect or error message. * re.c (rb_reg_desc): add 'n' for ENCODING_NONE. * string.c (sym_inspect): Escape when the symbol is not resulted encoding and not ascii_only. It had escaped ascii-incompatible string, but it is wrong. * string.c (rb_str_buf_cat_escaped_char): defined. Splited from rb_str_inspect. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_2@28180 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'string.c')
-rw-r--r--string.c57
1 files changed, 34 insertions, 23 deletions
diff --git a/string.c b/string.c
index 48ebf89815..a642d309fa 100644
--- a/string.c
+++ b/string.c
@@ -4078,6 +4078,36 @@ str_cat_char(VALUE str, unsigned int c, rb_encoding *enc)
}
#endif
+#define CHAR_ESC_LEN 13 /* sizeof(\x{ hex of 32bit unsigned int } \0) */
+
+int
+rb_str_buf_cat_escaped_char(VALUE result, unsigned int c, int unicode_p) {
+ char buf[CHAR_ESC_LEN + 1];
+ int l;
+ if (unicode_p) {
+ if (c < 0x7F && ISPRINT(c)) {
+ snprintf(buf, CHAR_ESC_LEN, "%c", c);
+ }
+ else if (c < 0x10000) {
+ snprintf(buf, CHAR_ESC_LEN, "\\u%04X", c);
+ }
+ else {
+ snprintf(buf, CHAR_ESC_LEN, "\\u{%X}", c);
+ }
+ }
+ else {
+ if (c < 0x100) {
+ snprintf(buf, CHAR_ESC_LEN, "\\x%02X", c);
+ }
+ else {
+ snprintf(buf, CHAR_ESC_LEN, "\\x{%X}", c);
+ }
+ }
+ l = strlen(buf);
+ rb_str_buf_cat(result, buf, l);
+ return l;
+}
+
/*
* call-seq:
* str.inspect -> string
@@ -4095,7 +4125,6 @@ rb_str_inspect(VALUE str)
{
rb_encoding *enc = STR_ENC_GET(str);
const char *p, *pend, *prev;
-#define CHAR_ESC_LEN 13 /* sizeof(\x{ hex of 32bit unsigned int } \0) */
char buf[CHAR_ESC_LEN + 1];
VALUE result = rb_str_buf_new(0);
rb_encoding *resenc = rb_default_internal_encoding();
@@ -4165,27 +4194,7 @@ rb_str_inspect(VALUE str)
}
else {
if (p - n > prev) str_buf_cat(result, prev, p - n - prev);
- if (unicode_p) {
- if (c < 0x100 && ISPRINT(c)) {
- snprintf(buf, CHAR_ESC_LEN, "%c", c);
- }
- else if (c < 0x10000) {
- snprintf(buf, CHAR_ESC_LEN, "\\u%04X", c);
- }
- else {
- snprintf(buf, CHAR_ESC_LEN, "\\u{%X}", c);
- }
- str_buf_cat(result, buf, strlen(buf));
- }
- else {
- if (c < 0x100) {
- snprintf(buf, CHAR_ESC_LEN, "\\x%02X", c);
- }
- else {
- snprintf(buf, CHAR_ESC_LEN, "\\x{%X}", c);
- }
- str_buf_cat(result, buf, strlen(buf));
- }
+ rb_str_buf_cat_escaped_char(result, c, unicode_p);
prev = p;
continue;
}
@@ -7069,12 +7078,14 @@ sym_inspect(VALUE sym)
const char *ptr;
long len;
char *dest;
+ rb_encoding *resenc = rb_default_internal_encoding();
+ if (resenc == NULL) resenc = rb_default_external_encoding();
sym = rb_id2str(id);
enc = STR_ENC_GET(sym);
ptr = RSTRING_PTR(sym);
len = RSTRING_LEN(sym);
- if (!rb_enc_asciicompat(enc) || len != (long)strlen(ptr) ||
+ if ((resenc != enc && !rb_str_is_ascii_only_p(sym)) || len != (long)strlen(ptr) ||
!rb_enc_symname_p(ptr, enc) || !sym_printable(ptr, ptr + len, enc)) {
str = rb_str_inspect(sym);
len = RSTRING_LEN(str);