mbed I/F binding for mruby
Dependents: mruby_mbed_web mirb_mbed
etc.c
00001 /* 00002 ** etc.c - 00003 ** 00004 ** See Copyright Notice in mruby.h 00005 */ 00006 00007 #include "mruby.h" 00008 #include "mruby/string.h" 00009 #include "mruby/data.h" 00010 #include "mruby/class.h" 00011 #include "mruby/re.h" 00012 #include "mruby/irep.h" 00013 00014 MRB_API struct RData* 00015 mrb_data_object_alloc(mrb_state *mrb, struct RClass *klass, void *ptr, const mrb_data_type *type) 00016 { 00017 struct RData *data; 00018 00019 data = (struct RData*)mrb_obj_alloc(mrb, MRB_TT_DATA, klass); 00020 data->data = ptr; 00021 data->type = type; 00022 00023 return data; 00024 } 00025 00026 MRB_API void 00027 mrb_data_check_type(mrb_state *mrb, mrb_value obj, const mrb_data_type *type) 00028 { 00029 if (mrb_immediate_p(obj) || (mrb_type(obj) != MRB_TT_DATA)) { 00030 mrb_check_type(mrb, obj, MRB_TT_DATA); 00031 } 00032 if (DATA_TYPE(obj) != type) { 00033 const mrb_data_type *t2 = DATA_TYPE(obj); 00034 00035 if (t2) { 00036 mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %S (expected %S)", 00037 mrb_str_new_cstr(mrb, t2->struct_name), mrb_str_new_cstr(mrb, type->struct_name)); 00038 } 00039 else { 00040 struct RClass *c = mrb_class(mrb, obj); 00041 00042 mrb_raisef(mrb, E_TYPE_ERROR, "uninitialized %S (expected %S)", 00043 mrb_obj_value(c), mrb_str_new_cstr(mrb, type->struct_name)); 00044 } 00045 } 00046 } 00047 00048 MRB_API void* 00049 mrb_data_check_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type) 00050 { 00051 if (mrb_immediate_p(obj) || (mrb_type(obj) != MRB_TT_DATA)) { 00052 return NULL; 00053 } 00054 if (DATA_TYPE(obj) != type) { 00055 return NULL; 00056 } 00057 return DATA_PTR(obj); 00058 } 00059 00060 MRB_API void* 00061 mrb_data_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type) 00062 { 00063 mrb_data_check_type(mrb, obj, type); 00064 return DATA_PTR(obj); 00065 } 00066 00067 MRB_API mrb_sym 00068 mrb_obj_to_sym(mrb_state *mrb, mrb_value name) 00069 { 00070 mrb_value tmp; 00071 mrb_sym id; 00072 00073 switch (mrb_type(name)) { 00074 default: 00075 tmp = mrb_check_string_type(mrb, name); 00076 if (mrb_nil_p(tmp)) { 00077 tmp = mrb_inspect(mrb, name); 00078 mrb_raisef(mrb, E_TYPE_ERROR, "%S is not a symbol", tmp); 00079 } 00080 name = tmp; 00081 /* fall through */ 00082 case MRB_TT_STRING: 00083 name = mrb_str_intern(mrb, name); 00084 /* fall through */ 00085 case MRB_TT_SYMBOL: 00086 id = mrb_symbol(name); 00087 } 00088 return id; 00089 } 00090 00091 MRB_API mrb_int 00092 mrb_float_id(mrb_float f) 00093 { 00094 const char *p = (const char*)&f; 00095 int len = sizeof(f); 00096 mrb_int id = 0; 00097 00098 while (len--) { 00099 id = id*65599 + *p; 00100 p++; 00101 } 00102 id = id + (id>>5); 00103 00104 return id; 00105 } 00106 00107 MRB_API mrb_int 00108 mrb_obj_id(mrb_value obj) 00109 { 00110 mrb_int tt = mrb_type(obj); 00111 00112 #define MakeID2(p,t) (mrb_int)(((intptr_t)(p))^(t)) 00113 #define MakeID(p) MakeID2(p,tt) 00114 00115 switch (tt) { 00116 case MRB_TT_FREE: 00117 case MRB_TT_UNDEF: 00118 return MakeID(0); /* not define */ 00119 case MRB_TT_FALSE: 00120 if (mrb_nil_p(obj)) 00121 return MakeID(1); 00122 return MakeID(0); 00123 case MRB_TT_TRUE: 00124 return MakeID(1); 00125 case MRB_TT_SYMBOL: 00126 return MakeID(mrb_symbol(obj)); 00127 case MRB_TT_FIXNUM: 00128 return MakeID2(mrb_float_id((mrb_float)mrb_fixnum(obj)), MRB_TT_FLOAT); 00129 case MRB_TT_FLOAT: 00130 return MakeID(mrb_float_id(mrb_float(obj))); 00131 case MRB_TT_STRING: 00132 case MRB_TT_OBJECT: 00133 case MRB_TT_CLASS: 00134 case MRB_TT_MODULE: 00135 case MRB_TT_ICLASS: 00136 case MRB_TT_SCLASS: 00137 case MRB_TT_PROC: 00138 case MRB_TT_ARRAY: 00139 case MRB_TT_HASH: 00140 case MRB_TT_RANGE: 00141 case MRB_TT_EXCEPTION: 00142 case MRB_TT_FILE: 00143 case MRB_TT_DATA: 00144 default: 00145 return MakeID(mrb_ptr(obj)); 00146 } 00147 } 00148 00149 #ifdef MRB_WORD_BOXING 00150 MRB_API mrb_value 00151 mrb_word_boxing_float_value(mrb_state *mrb, mrb_float f) 00152 { 00153 mrb_value v; 00154 00155 v.value.p = mrb_obj_alloc(mrb, MRB_TT_FLOAT, mrb->float_class); 00156 v.value.fp->f = f; 00157 return v; 00158 } 00159 00160 MRB_API mrb_value 00161 mrb_word_boxing_float_pool(mrb_state *mrb, mrb_float f) 00162 { 00163 struct RFloat *nf = (struct RFloat *)mrb_malloc(mrb, sizeof(struct RFloat)); 00164 nf->tt = MRB_TT_FLOAT; 00165 nf->c = mrb->float_class; 00166 nf->f = f; 00167 return mrb_obj_value(nf); 00168 } 00169 00170 MRB_API mrb_value 00171 mrb_word_boxing_cptr_value(mrb_state *mrb, void *p) 00172 { 00173 mrb_value v; 00174 00175 v.value.p = mrb_obj_alloc(mrb, MRB_TT_CPTR, mrb->object_class); 00176 v.value.vp->p = p; 00177 return v; 00178 } 00179 #endif /* MRB_WORD_BOXING */ 00180 00181 MRB_API mrb_bool 00182 mrb_regexp_p(mrb_state *mrb, mrb_value v) 00183 { 00184 return mrb_class_defined(mrb, REGEXP_CLASS) && mrb_obj_is_kind_of(mrb, v, mrb_class_get(mrb, REGEXP_CLASS)); 00185 } 00186 00187 #if defined _MSC_VER && _MSC_VER < 1900 00188 00189 #ifndef va_copy 00190 static void 00191 mrb_msvc_va_copy(va_list *dest, va_list src) 00192 { 00193 *dest = src; 00194 } 00195 #define va_copy(dest, src) mrb_msvc_va_copy(&(dest), src) 00196 #endif 00197 00198 MRB_API int 00199 mrb_msvc_vsnprintf(char *s, size_t n, const char *format, va_list arg) 00200 { 00201 int cnt; 00202 va_list argcp; 00203 va_copy(argcp, arg); 00204 if (n == 0 || (cnt = _vsnprintf_s(s, n, _TRUNCATE, format, argcp)) < 0) { 00205 cnt = _vscprintf(format, arg); 00206 } 00207 va_end(argcp); 00208 return cnt; 00209 } 00210 00211 MRB_API int 00212 mrb_msvc_snprintf(char *s, size_t n, const char *format, ...) 00213 { 00214 va_list arg; 00215 int ret; 00216 va_start(arg, format); 00217 ret = mrb_msvc_vsnprintf(s, n, format, arg); 00218 va_end(arg); 00219 return ret; 00220 } 00221 00222 #endif /* defined _MSC_VER && _MSC_VER < 1900 */ 00223
Generated on Tue Jul 12 2022 18:00:34 by 1.7.2