Blob Blame History Raw
diff -Nrup ext.bad/idna.c ext/idna.c
--- ext.bad/idna.c	2012-02-13 22:16:33.792135714 -0500
+++ ext/idna.c	2012-02-13 23:14:43.562413759 -0500
@@ -24,6 +24,16 @@
 #include <idna.h>
 #include "idn.h"
 
+#include <ruby/encoding.h>
+ 
+#define ENCODED_STR_NEW2(str, encoding) \
+  ({ \
+    VALUE _string = rb_str_new2((const char *)str); \
+    int _enc = rb_enc_find_index(encoding); \
+    rb_enc_associate_index(_string, _enc); \
+    _string; \
+  })
+ 
 /*
  * Document-class: IDN::Idna
  * The Idna module of LibIDN Ruby Bindings.
@@ -85,7 +95,7 @@ static VALUE toASCII(int argc, VALUE arg
     flags = 0x0000;
   }
 
-  rc = idna_to_ascii_8z(RSTRING(str)->ptr, &buf, flags);
+  rc = idna_to_ascii_8z(RSTRING_PTR(str), &buf, flags);
 
   if (rc != IDNA_SUCCESS) {
     xfree(buf);
@@ -93,7 +103,7 @@ static VALUE toASCII(int argc, VALUE arg
     return Qnil;
   }
 
-  retv = rb_str_new2(buf);
+  retv = ENCODED_STR_NEW2(buf, "ASCII-8BIT");
   xfree(buf);
   return retv;
 }
@@ -125,7 +135,7 @@ static VALUE toUnicode(int argc, VALUE a
     flags = 0x0000;
   }
 
-  rc = idna_to_unicode_8z8z(RSTRING(str)->ptr, &buf, flags);
+  rc = idna_to_unicode_8z8z(RSTRING_PTR(str), &buf, flags);
 
   if (rc != IDNA_SUCCESS) {
     xfree(buf);
@@ -133,7 +143,7 @@ static VALUE toUnicode(int argc, VALUE a
     return Qnil;
   }
 
-  retv = rb_str_new2(buf);
+  retv = ENCODED_STR_NEW2(buf, "UTF-8");
   xfree(buf);
   return retv;
 }
diff -Nrup ext.bad/punycode.c ext/punycode.c
--- ext.bad/punycode.c	2012-02-13 22:16:33.792135714 -0500
+++ ext/punycode.c	2012-02-13 23:19:39.499714035 -0500
@@ -26,6 +26,14 @@
 #include <punycode.h>
 #include "idn.h"
 
+#define ENCODED_STR_NEW(str, len, encoding) \
+  ({ \
+    VALUE _string = rb_str_new((const char *)str, (long)len); \
+    int _enc = rb_enc_find_index(encoding); \
+    rb_enc_associate_index(_string, _enc); \
+    _string; \
+  })
+
 /*
  * Document-class: IDN::Punycode
  * The Punycode module of LibIDN Ruby Bindings.
@@ -66,7 +74,7 @@ static VALUE encode(VALUE self, VALUE st
   VALUE retv;
 
   str = rb_check_convert_type(str, T_STRING, "String", "to_s");
-  ustr = stringprep_utf8_to_ucs4(RSTRING(str)->ptr, RSTRING(str)->len, &len);
+  ustr = stringprep_utf8_to_ucs4(RSTRING_PTR(str), RSTRING_LEN(str), &len);
 
   while (1) {
     buf = realloc(buf, buflen);
@@ -116,7 +124,7 @@ static VALUE decode(VALUE self, VALUE st
 
   str = rb_check_convert_type(str, T_STRING, "String", "to_s");
 
-  len = RSTRING(str)->len;
+  len = RSTRING_LEN(str);
   ustr = malloc(len * sizeof(punycode_uint));
 
   if (ustr == NULL) {
@@ -124,7 +132,7 @@ static VALUE decode(VALUE self, VALUE st
     return Qnil;
   }
 
-  rc = punycode_decode(RSTRING(str)->len, RSTRING(str)->ptr,
+  rc = punycode_decode(RSTRING_LEN(str), RSTRING_PTR(str),
                        &len, ustr, NULL);
 
   if (rc != PUNYCODE_SUCCESS) {
@@ -134,7 +142,7 @@ static VALUE decode(VALUE self, VALUE st
   }
 
   buf = stringprep_ucs4_to_utf8(ustr, len, NULL, &len);
-  retv = rb_str_new(buf, len);
+  retv = ENCODED_STR_NEW(buf, len, "UTF-8");
   xfree(ustr);
   xfree(buf);
   return retv;
diff -Nrup ext.bad/stringprep.c ext/stringprep.c
--- ext.bad/stringprep.c	2012-02-13 22:16:33.792135714 -0500
+++ ext/stringprep.c	2012-02-13 22:16:55.618862844 -0500
@@ -64,7 +64,7 @@ static VALUE stringprep_internal(VALUE s
   VALUE retv;
 
   str = rb_check_convert_type(str, T_STRING, "String", "to_s");
-  rc = stringprep_profile(RSTRING(str)->ptr, &buf, profile, 0);
+  rc = stringprep_profile(RSTRING_PTR(str), &buf, profile, 0);
 
   if (rc != STRINGPREP_OK) {
     rb_raise(eStringprepError, "%s (%d)", stringprep_strerror(rc), rc);
@@ -135,7 +135,7 @@ static VALUE resourceprep(VALUE self, VA
 static VALUE with_profile(VALUE self, VALUE str, VALUE profile)
 {
   profile = rb_check_convert_type(profile, T_STRING, "String", "to_s");
-  return stringprep_internal(str, RSTRING(profile)->ptr);
+  return stringprep_internal(str, RSTRING_PTR(profile));
 }
 
 /*
@@ -153,7 +153,7 @@ static VALUE nfkc_normalize(VALUE self,
   VALUE retv;
 
   str = rb_check_convert_type(str, T_STRING, "String", "to_s");
-  buf = stringprep_utf8_nfkc_normalize(RSTRING(str)->ptr, RSTRING(str)->len);
+  buf = stringprep_utf8_nfkc_normalize(RSTRING_PTR(str), RSTRING_LEN(str));
 
   retv = rb_str_new2(buf);
   xfree(buf);