mbed I/F binding for mruby
Dependents: mruby_mbed_web mirb_mbed
mbed-mruby
How to use
Class
src/etc.c@0:158c61bb030f, 2015-03-25 (annotated)
- Committer:
- mzta
- Date:
- Wed Mar 25 17:36:16 2015 +0000
- Revision:
- 0:158c61bb030f
mirb_mbed initial commit;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mzta | 0:158c61bb030f | 1 | /* |
mzta | 0:158c61bb030f | 2 | ** etc.c - |
mzta | 0:158c61bb030f | 3 | ** |
mzta | 0:158c61bb030f | 4 | ** See Copyright Notice in mruby.h |
mzta | 0:158c61bb030f | 5 | */ |
mzta | 0:158c61bb030f | 6 | |
mzta | 0:158c61bb030f | 7 | #include "mruby.h" |
mzta | 0:158c61bb030f | 8 | #include "mruby/string.h" |
mzta | 0:158c61bb030f | 9 | #include "mruby/data.h" |
mzta | 0:158c61bb030f | 10 | #include "mruby/class.h" |
mzta | 0:158c61bb030f | 11 | #include "mruby/re.h" |
mzta | 0:158c61bb030f | 12 | #include "mruby/irep.h" |
mzta | 0:158c61bb030f | 13 | |
mzta | 0:158c61bb030f | 14 | MRB_API struct RData* |
mzta | 0:158c61bb030f | 15 | mrb_data_object_alloc(mrb_state *mrb, struct RClass *klass, void *ptr, const mrb_data_type *type) |
mzta | 0:158c61bb030f | 16 | { |
mzta | 0:158c61bb030f | 17 | struct RData *data; |
mzta | 0:158c61bb030f | 18 | |
mzta | 0:158c61bb030f | 19 | data = (struct RData*)mrb_obj_alloc(mrb, MRB_TT_DATA, klass); |
mzta | 0:158c61bb030f | 20 | data->data = ptr; |
mzta | 0:158c61bb030f | 21 | data->type = type; |
mzta | 0:158c61bb030f | 22 | |
mzta | 0:158c61bb030f | 23 | return data; |
mzta | 0:158c61bb030f | 24 | } |
mzta | 0:158c61bb030f | 25 | |
mzta | 0:158c61bb030f | 26 | MRB_API void |
mzta | 0:158c61bb030f | 27 | mrb_data_check_type(mrb_state *mrb, mrb_value obj, const mrb_data_type *type) |
mzta | 0:158c61bb030f | 28 | { |
mzta | 0:158c61bb030f | 29 | if (mrb_immediate_p(obj) || (mrb_type(obj) != MRB_TT_DATA)) { |
mzta | 0:158c61bb030f | 30 | mrb_check_type(mrb, obj, MRB_TT_DATA); |
mzta | 0:158c61bb030f | 31 | } |
mzta | 0:158c61bb030f | 32 | if (DATA_TYPE(obj) != type) { |
mzta | 0:158c61bb030f | 33 | const mrb_data_type *t2 = DATA_TYPE(obj); |
mzta | 0:158c61bb030f | 34 | |
mzta | 0:158c61bb030f | 35 | if (t2) { |
mzta | 0:158c61bb030f | 36 | mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %S (expected %S)", |
mzta | 0:158c61bb030f | 37 | mrb_str_new_cstr(mrb, t2->struct_name), mrb_str_new_cstr(mrb, type->struct_name)); |
mzta | 0:158c61bb030f | 38 | } |
mzta | 0:158c61bb030f | 39 | else { |
mzta | 0:158c61bb030f | 40 | struct RClass *c = mrb_class(mrb, obj); |
mzta | 0:158c61bb030f | 41 | |
mzta | 0:158c61bb030f | 42 | mrb_raisef(mrb, E_TYPE_ERROR, "uninitialized %S (expected %S)", |
mzta | 0:158c61bb030f | 43 | mrb_obj_value(c), mrb_str_new_cstr(mrb, type->struct_name)); |
mzta | 0:158c61bb030f | 44 | } |
mzta | 0:158c61bb030f | 45 | } |
mzta | 0:158c61bb030f | 46 | } |
mzta | 0:158c61bb030f | 47 | |
mzta | 0:158c61bb030f | 48 | MRB_API void* |
mzta | 0:158c61bb030f | 49 | mrb_data_check_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type) |
mzta | 0:158c61bb030f | 50 | { |
mzta | 0:158c61bb030f | 51 | if (mrb_immediate_p(obj) || (mrb_type(obj) != MRB_TT_DATA)) { |
mzta | 0:158c61bb030f | 52 | return NULL; |
mzta | 0:158c61bb030f | 53 | } |
mzta | 0:158c61bb030f | 54 | if (DATA_TYPE(obj) != type) { |
mzta | 0:158c61bb030f | 55 | return NULL; |
mzta | 0:158c61bb030f | 56 | } |
mzta | 0:158c61bb030f | 57 | return DATA_PTR(obj); |
mzta | 0:158c61bb030f | 58 | } |
mzta | 0:158c61bb030f | 59 | |
mzta | 0:158c61bb030f | 60 | MRB_API void* |
mzta | 0:158c61bb030f | 61 | mrb_data_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type) |
mzta | 0:158c61bb030f | 62 | { |
mzta | 0:158c61bb030f | 63 | mrb_data_check_type(mrb, obj, type); |
mzta | 0:158c61bb030f | 64 | return DATA_PTR(obj); |
mzta | 0:158c61bb030f | 65 | } |
mzta | 0:158c61bb030f | 66 | |
mzta | 0:158c61bb030f | 67 | MRB_API mrb_sym |
mzta | 0:158c61bb030f | 68 | mrb_obj_to_sym(mrb_state *mrb, mrb_value name) |
mzta | 0:158c61bb030f | 69 | { |
mzta | 0:158c61bb030f | 70 | mrb_value tmp; |
mzta | 0:158c61bb030f | 71 | mrb_sym id; |
mzta | 0:158c61bb030f | 72 | |
mzta | 0:158c61bb030f | 73 | switch (mrb_type(name)) { |
mzta | 0:158c61bb030f | 74 | default: |
mzta | 0:158c61bb030f | 75 | tmp = mrb_check_string_type(mrb, name); |
mzta | 0:158c61bb030f | 76 | if (mrb_nil_p(tmp)) { |
mzta | 0:158c61bb030f | 77 | tmp = mrb_inspect(mrb, name); |
mzta | 0:158c61bb030f | 78 | mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", tmp); |
mzta | 0:158c61bb030f | 79 | } |
mzta | 0:158c61bb030f | 80 | name = tmp; |
mzta | 0:158c61bb030f | 81 | /* fall through */ |
mzta | 0:158c61bb030f | 82 | case MRB_TT_STRING: |
mzta | 0:158c61bb030f | 83 | name = mrb_str_intern(mrb, name); |
mzta | 0:158c61bb030f | 84 | /* fall through */ |
mzta | 0:158c61bb030f | 85 | case MRB_TT_SYMBOL: |
mzta | 0:158c61bb030f | 86 | id = mrb_symbol(name); |
mzta | 0:158c61bb030f | 87 | } |
mzta | 0:158c61bb030f | 88 | return id; |
mzta | 0:158c61bb030f | 89 | } |
mzta | 0:158c61bb030f | 90 | |
mzta | 0:158c61bb030f | 91 | MRB_API mrb_int |
mzta | 0:158c61bb030f | 92 | mrb_float_id(mrb_float f) |
mzta | 0:158c61bb030f | 93 | { |
mzta | 0:158c61bb030f | 94 | const char *p = (const char*)&f; |
mzta | 0:158c61bb030f | 95 | int len = sizeof(f); |
mzta | 0:158c61bb030f | 96 | mrb_int id = 0; |
mzta | 0:158c61bb030f | 97 | |
mzta | 0:158c61bb030f | 98 | while (len--) { |
mzta | 0:158c61bb030f | 99 | id = id*65599 + *p; |
mzta | 0:158c61bb030f | 100 | p++; |
mzta | 0:158c61bb030f | 101 | } |
mzta | 0:158c61bb030f | 102 | id = id + (id>>5); |
mzta | 0:158c61bb030f | 103 | |
mzta | 0:158c61bb030f | 104 | return id; |
mzta | 0:158c61bb030f | 105 | } |
mzta | 0:158c61bb030f | 106 | |
mzta | 0:158c61bb030f | 107 | MRB_API mrb_int |
mzta | 0:158c61bb030f | 108 | mrb_obj_id(mrb_value obj) |
mzta | 0:158c61bb030f | 109 | { |
mzta | 0:158c61bb030f | 110 | mrb_int tt = mrb_type(obj); |
mzta | 0:158c61bb030f | 111 | |
mzta | 0:158c61bb030f | 112 | #define MakeID2(p,t) (mrb_int)(((intptr_t)(p))^(t)) |
mzta | 0:158c61bb030f | 113 | #define MakeID(p) MakeID2(p,tt) |
mzta | 0:158c61bb030f | 114 | |
mzta | 0:158c61bb030f | 115 | switch (tt) { |
mzta | 0:158c61bb030f | 116 | case MRB_TT_FREE: |
mzta | 0:158c61bb030f | 117 | case MRB_TT_UNDEF: |
mzta | 0:158c61bb030f | 118 | return MakeID(0); /* not define */ |
mzta | 0:158c61bb030f | 119 | case MRB_TT_FALSE: |
mzta | 0:158c61bb030f | 120 | if (mrb_nil_p(obj)) |
mzta | 0:158c61bb030f | 121 | return MakeID(1); |
mzta | 0:158c61bb030f | 122 | return MakeID(0); |
mzta | 0:158c61bb030f | 123 | case MRB_TT_TRUE: |
mzta | 0:158c61bb030f | 124 | return MakeID(1); |
mzta | 0:158c61bb030f | 125 | case MRB_TT_SYMBOL: |
mzta | 0:158c61bb030f | 126 | return MakeID(mrb_symbol(obj)); |
mzta | 0:158c61bb030f | 127 | case MRB_TT_FIXNUM: |
mzta | 0:158c61bb030f | 128 | return MakeID2(mrb_float_id((mrb_float)mrb_fixnum(obj)), MRB_TT_FLOAT); |
mzta | 0:158c61bb030f | 129 | case MRB_TT_FLOAT: |
mzta | 0:158c61bb030f | 130 | return MakeID(mrb_float_id(mrb_float(obj))); |
mzta | 0:158c61bb030f | 131 | case MRB_TT_STRING: |
mzta | 0:158c61bb030f | 132 | case MRB_TT_OBJECT: |
mzta | 0:158c61bb030f | 133 | case MRB_TT_CLASS: |
mzta | 0:158c61bb030f | 134 | case MRB_TT_MODULE: |
mzta | 0:158c61bb030f | 135 | case MRB_TT_ICLASS: |
mzta | 0:158c61bb030f | 136 | case MRB_TT_SCLASS: |
mzta | 0:158c61bb030f | 137 | case MRB_TT_PROC: |
mzta | 0:158c61bb030f | 138 | case MRB_TT_ARRAY: |
mzta | 0:158c61bb030f | 139 | case MRB_TT_HASH: |
mzta | 0:158c61bb030f | 140 | case MRB_TT_RANGE: |
mzta | 0:158c61bb030f | 141 | case MRB_TT_EXCEPTION: |
mzta | 0:158c61bb030f | 142 | case MRB_TT_FILE: |
mzta | 0:158c61bb030f | 143 | case MRB_TT_DATA: |
mzta | 0:158c61bb030f | 144 | default: |
mzta | 0:158c61bb030f | 145 | return MakeID(mrb_ptr(obj)); |
mzta | 0:158c61bb030f | 146 | } |
mzta | 0:158c61bb030f | 147 | } |
mzta | 0:158c61bb030f | 148 | |
mzta | 0:158c61bb030f | 149 | #ifdef MRB_WORD_BOXING |
mzta | 0:158c61bb030f | 150 | MRB_API mrb_value |
mzta | 0:158c61bb030f | 151 | mrb_word_boxing_float_value(mrb_state *mrb, mrb_float f) |
mzta | 0:158c61bb030f | 152 | { |
mzta | 0:158c61bb030f | 153 | mrb_value v; |
mzta | 0:158c61bb030f | 154 | |
mzta | 0:158c61bb030f | 155 | v.value.p = mrb_obj_alloc(mrb, MRB_TT_FLOAT, mrb->float_class); |
mzta | 0:158c61bb030f | 156 | v.value.fp->f = f; |
mzta | 0:158c61bb030f | 157 | return v; |
mzta | 0:158c61bb030f | 158 | } |
mzta | 0:158c61bb030f | 159 | |
mzta | 0:158c61bb030f | 160 | MRB_API mrb_value |
mzta | 0:158c61bb030f | 161 | mrb_word_boxing_float_pool(mrb_state *mrb, mrb_float f) |
mzta | 0:158c61bb030f | 162 | { |
mzta | 0:158c61bb030f | 163 | struct RFloat *nf = (struct RFloat *)mrb_malloc(mrb, sizeof(struct RFloat)); |
mzta | 0:158c61bb030f | 164 | nf->tt = MRB_TT_FLOAT; |
mzta | 0:158c61bb030f | 165 | nf->c = mrb->float_class; |
mzta | 0:158c61bb030f | 166 | nf->f = f; |
mzta | 0:158c61bb030f | 167 | return mrb_obj_value(nf); |
mzta | 0:158c61bb030f | 168 | } |
mzta | 0:158c61bb030f | 169 | |
mzta | 0:158c61bb030f | 170 | MRB_API mrb_value |
mzta | 0:158c61bb030f | 171 | mrb_word_boxing_cptr_value(mrb_state *mrb, void *p) |
mzta | 0:158c61bb030f | 172 | { |
mzta | 0:158c61bb030f | 173 | mrb_value v; |
mzta | 0:158c61bb030f | 174 | |
mzta | 0:158c61bb030f | 175 | v.value.p = mrb_obj_alloc(mrb, MRB_TT_CPTR, mrb->object_class); |
mzta | 0:158c61bb030f | 176 | v.value.vp->p = p; |
mzta | 0:158c61bb030f | 177 | return v; |
mzta | 0:158c61bb030f | 178 | } |
mzta | 0:158c61bb030f | 179 | #endif /* MRB_WORD_BOXING */ |
mzta | 0:158c61bb030f | 180 | |
mzta | 0:158c61bb030f | 181 | MRB_API mrb_bool |
mzta | 0:158c61bb030f | 182 | mrb_regexp_p(mrb_state *mrb, mrb_value v) |
mzta | 0:158c61bb030f | 183 | { |
mzta | 0:158c61bb030f | 184 | return mrb_class_defined(mrb, REGEXP_CLASS) && mrb_obj_is_kind_of(mrb, v, mrb_class_get(mrb, REGEXP_CLASS)); |
mzta | 0:158c61bb030f | 185 | } |
mzta | 0:158c61bb030f | 186 | |
mzta | 0:158c61bb030f | 187 | #if defined _MSC_VER && _MSC_VER < 1900 |
mzta | 0:158c61bb030f | 188 | |
mzta | 0:158c61bb030f | 189 | #ifndef va_copy |
mzta | 0:158c61bb030f | 190 | static void |
mzta | 0:158c61bb030f | 191 | mrb_msvc_va_copy(va_list *dest, va_list src) |
mzta | 0:158c61bb030f | 192 | { |
mzta | 0:158c61bb030f | 193 | *dest = src; |
mzta | 0:158c61bb030f | 194 | } |
mzta | 0:158c61bb030f | 195 | #define va_copy(dest, src) mrb_msvc_va_copy(&(dest), src) |
mzta | 0:158c61bb030f | 196 | #endif |
mzta | 0:158c61bb030f | 197 | |
mzta | 0:158c61bb030f | 198 | MRB_API int |
mzta | 0:158c61bb030f | 199 | mrb_msvc_vsnprintf(char *s, size_t n, const char *format, va_list arg) |
mzta | 0:158c61bb030f | 200 | { |
mzta | 0:158c61bb030f | 201 | int cnt; |
mzta | 0:158c61bb030f | 202 | va_list argcp; |
mzta | 0:158c61bb030f | 203 | va_copy(argcp, arg); |
mzta | 0:158c61bb030f | 204 | if (n == 0 || (cnt = _vsnprintf_s(s, n, _TRUNCATE, format, argcp)) < 0) { |
mzta | 0:158c61bb030f | 205 | cnt = _vscprintf(format, arg); |
mzta | 0:158c61bb030f | 206 | } |
mzta | 0:158c61bb030f | 207 | va_end(argcp); |
mzta | 0:158c61bb030f | 208 | return cnt; |
mzta | 0:158c61bb030f | 209 | } |
mzta | 0:158c61bb030f | 210 | |
mzta | 0:158c61bb030f | 211 | MRB_API int |
mzta | 0:158c61bb030f | 212 | mrb_msvc_snprintf(char *s, size_t n, const char *format, ...) |
mzta | 0:158c61bb030f | 213 | { |
mzta | 0:158c61bb030f | 214 | va_list arg; |
mzta | 0:158c61bb030f | 215 | int ret; |
mzta | 0:158c61bb030f | 216 | va_start(arg, format); |
mzta | 0:158c61bb030f | 217 | ret = mrb_msvc_vsnprintf(s, n, format, arg); |
mzta | 0:158c61bb030f | 218 | va_end(arg); |
mzta | 0:158c61bb030f | 219 | return ret; |
mzta | 0:158c61bb030f | 220 | } |
mzta | 0:158c61bb030f | 221 | |
mzta | 0:158c61bb030f | 222 | #endif /* defined _MSC_VER && _MSC_VER < 1900 */ |
mzta | 0:158c61bb030f | 223 |