summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/ruby/intern.h8
-rw-r--r--string.c17
2 files changed, 25 insertions, 0 deletions
diff --git a/include/ruby/intern.h b/include/ruby/intern.h
index f9858537e1..1517023610 100644
--- a/include/ruby/intern.h
+++ b/include/ruby/intern.h
@@ -707,6 +707,8 @@ VALUE rb_str_buf_new2(const char*);
VALUE rb_str_tmp_new(long);
VALUE rb_usascii_str_new(const char*, long);
VALUE rb_usascii_str_new_cstr(const char*);
+VALUE rb_utf8_str_new(const char*, long);
+VALUE rb_utf8_str_new_cstr(const char*);
void rb_str_free(VALUE);
void rb_str_shared_replace(VALUE, VALUE);
VALUE rb_str_buf_append(VALUE, VALUE);
@@ -787,6 +789,12 @@ VALUE rb_str_scrub(VALUE, VALUE);
rb_usascii_str_new((str), (long)strlen(str)) : \
rb_usascii_str_new_cstr(str); \
})
+#define rb_utf8_str_new_cstr(str) __extension__ ( \
+{ \
+ (__builtin_constant_p(str)) ? \
+ rb_utf8_str_new((str), (long)strlen(str)) : \
+ rb_utf8_str_new_cstr(str); \
+})
#define rb_external_str_new_cstr(str) __extension__ ( \
{ \
(__builtin_constant_p(str)) ? \
diff --git a/string.c b/string.c
index 05e4e802cd..9c562ff78d 100644
--- a/string.c
+++ b/string.c
@@ -34,6 +34,7 @@
#undef rb_str_new_cstr
#undef rb_tainted_str_new_cstr
#undef rb_usascii_str_new_cstr
+#undef rb_utf8_str_new_cstr
#undef rb_enc_str_new_cstr
#undef rb_external_str_new_cstr
#undef rb_locale_str_new_cstr
@@ -589,6 +590,14 @@ rb_usascii_str_new(const char *ptr, long len)
}
VALUE
+rb_utf8_str_new(const char *ptr, long len)
+{
+ VALUE str = str_new(rb_cString, ptr, len);
+ rb_enc_associate_index(str, rb_utf8_encindex());
+ return str;
+}
+
+VALUE
rb_enc_str_new(const char *ptr, long len, rb_encoding *enc)
{
VALUE str;
@@ -616,6 +625,14 @@ rb_usascii_str_new_cstr(const char *ptr)
}
VALUE
+rb_utf8_str_new_cstr(const char *ptr)
+{
+ VALUE str = rb_str_new_cstr(ptr);
+ rb_enc_associate_index(str, rb_utf8_encindex());
+ return str;
+}
+
+VALUE
rb_enc_str_new_cstr(const char *ptr, rb_encoding *enc)
{
must_not_null(ptr);