diff options
| author | Masaki Muranaka <[email protected]> | 2013-03-23 19:33:25 +0900 |
|---|---|---|
| committer | Masaki Muranaka <[email protected]> | 2013-03-23 20:00:04 +0900 |
| commit | bbb367841a7ea6bdc420342d31d7c0f33afaa128 (patch) | |
| tree | 721e3d661fca55d88e24f167b7a344d8f214f4b2 | |
| parent | 00c45e71c04d6c87fa7efd436bb663ca8d8326f2 (diff) | |
| download | mruby-bbb367841a7ea6bdc420342d31d7c0f33afaa128.tar.gz mruby-bbb367841a7ea6bdc420342d31d7c0f33afaa128.zip | |
Add new API mrb_ptr_as_string().
| -rw-r--r-- | include/mruby/string.h | 1 | ||||
| -rw-r--r-- | src/string.c | 30 |
2 files changed, 31 insertions, 0 deletions
diff --git a/include/mruby/string.h b/include/mruby/string.h index 3dc4094aa..df41497ab 100644 --- a/include/mruby/string.h +++ b/include/mruby/string.h @@ -43,6 +43,7 @@ void mrb_str_decref(mrb_state*, mrb_shared_string*); mrb_value mrb_str_literal(mrb_state*, mrb_value); void mrb_str_concat(mrb_state*, mrb_value, mrb_value); mrb_value mrb_str_plus(mrb_state*, mrb_value, mrb_value); +mrb_value mrb_ptr_as_string(mrb_state *, void *); mrb_value mrb_obj_as_string(mrb_state *mrb, mrb_value obj); mrb_value mrb_str_resize(mrb_state *mrb, mrb_value str, int len); /* mrb_str_resize */ mrb_value mrb_string_value(mrb_state *mrb, mrb_value *ptr); /* StringValue */ diff --git a/src/string.c b/src/string.c index 165cdbccd..15abb47d7 100644 --- a/src/string.c +++ b/src/string.c @@ -1535,6 +1535,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"); |
