aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ext/-test-/printf/extconf.rb1
-rw-r--r--ext/-test-/printf/printf.c31
-rw-r--r--test/-ext-/test_printf.rb24
3 files changed, 56 insertions, 0 deletions
diff --git a/ext/-test-/printf/extconf.rb b/ext/-test-/printf/extconf.rb
new file mode 100644
index 0000000000..7b96da0c85
--- /dev/null
+++ b/ext/-test-/printf/extconf.rb
@@ -0,0 +1 @@
+create_makefile("-test-/printf")
diff --git a/ext/-test-/printf/printf.c b/ext/-test-/printf/printf.c
new file mode 100644
index 0000000000..f338637e04
--- /dev/null
+++ b/ext/-test-/printf/printf.c
@@ -0,0 +1,31 @@
+#include <ruby.h>
+#include <ruby/encoding.h>
+
+static VALUE
+printf_i(VALUE self, VALUE obj)
+{
+ char buf[256];
+ snprintf(buf, sizeof(buf), "<%"PRIsVALUE">", obj);
+ return rb_usascii_str_new2(buf);
+}
+
+static VALUE
+printf_s(VALUE self, VALUE obj)
+{
+ return rb_enc_sprintf(rb_usascii_encoding(), "<%"PRIsVALUE">", obj);
+}
+
+static VALUE
+printf_v(VALUE self, VALUE obj)
+{
+ return rb_enc_sprintf(rb_usascii_encoding(), "{%+"PRIsVALUE"}", obj);
+}
+
+void
+Init_printf(void)
+{
+ VALUE m = rb_define_module_under(rb_define_module("Bug"), "Printf");
+ rb_define_singleton_method(m, "i", printf_i, 1);
+ rb_define_singleton_method(m, "s", printf_s, 1);
+ rb_define_singleton_method(m, "v", printf_v, 1);
+}
diff --git a/test/-ext-/test_printf.rb b/test/-ext-/test_printf.rb
new file mode 100644
index 0000000000..f801030c07
--- /dev/null
+++ b/test/-ext-/test_printf.rb
@@ -0,0 +1,24 @@
+require 'test/unit'
+require "-test-/printf"
+
+class Test_SPrintf < Test::Unit::TestCase
+ def to_s
+ "#{self.class}:#{object_id}"
+ end
+
+ def inspect
+ "<#{self.class}:#{object_id}>"
+ end
+
+ def test_int
+ assert_match(/\A<-?\d+>\z/, Bug::Printf.i(self))
+ end
+
+ def test_to_str
+ assert_equal("<#{self.class}:#{object_id}>", Bug::Printf.s(self))
+ end
+
+ def test_inspect
+ assert_equal("{<#{self.class}:#{object_id}>}", Bug::Printf.v(self))
+ end
+end