summaryrefslogtreecommitdiffhomepage
path: root/src/string.c
diff options
context:
space:
mode:
authorYukihiro Matz Matsumoto <[email protected]>2013-03-23 21:53:49 +0900
committerYukihiro Matz Matsumoto <[email protected]>2013-03-23 21:53:49 +0900
commitd8f48e9782a0d4e70c67f11b83d9976ab279dc51 (patch)
tree92381b9941e17b559a20b4d090b687321f8cb406 /src/string.c
parent8ae2c2498ebbd7966c4f2ff5cb7c2bd52d3bf941 (diff)
parentbdd8f7b4a7321675d72322f518e8252e0f7422ef (diff)
downloadmruby-d8f48e9782a0d4e70c67f11b83d9976ab279dc51.tar.gz
mruby-d8f48e9782a0d4e70c67f11b83d9976ab279dc51.zip
Merge branch 'pr-add-mrb_ptr_as_string' of https://github.com/monaka/mruby into monaka-pr-add-mrb_ptr_as_string
Diffstat (limited to 'src/string.c')
-rw-r--r--src/string.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/string.c b/src/string.c
index 78d706cc5..4495be77f 100644
--- a/src/string.c
+++ b/src/string.c
@@ -1529,6 +1529,36 @@ mrb_obj_as_string(mrb_state *mrb, mrb_value obj)
}
mrb_value
+mrb_ptr_as_string(mrb_state *mrb, void *p)
+{
+ struct RString *p_str;
+ char *p1;
+ char *p2;
+ intptr_t n = (intptr_t)p;
+
+ p_str = str_new(mrb, NULL, 2 + sizeof(uintptr_t) * CHAR_BIT / 4);
+ p1 = p_str->ptr;
+ *p1++ = '0';
+ *p1++ = 'x';
+ p2 = p1;
+
+ do {
+ *p2++ = mrb_digitmap[n % 16];
+ n /= 16;
+ } while (n > 0);
+ *p2 = '\0';
+ p_str->len = (mrb_int)(p2 - p_str->ptr);
+
+ while (p1 < p2) {
+ const char c = *p1;
+ *p1++ = *--p2;
+ *p2 = c;
+ }
+
+ return mrb_obj_value(p_str);
+}
+
+mrb_value
mrb_check_string_type(mrb_state *mrb, mrb_value str)
{
return mrb_check_convert_type(mrb, str, MRB_TT_STRING, "String", "to_str");