mbed I/F binding for mruby

Dependents:   mruby_mbed_web mirb_mbed

mbed-mruby

How to use

Class

Committer:
mzta
Date:
Mon Apr 13 05:20:15 2015 +0000
Revision:
1:8ccd1d494a4b
Parent:
0:158c61bb030f
- code refactoring.; - add SPI, SPISlave, I2C class to mruby-mbed (Incomplete).

Who changed what in which revision?

UserRevisionLine numberNew 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