mbed I/F binding for mruby

Dependents:   mruby_mbed_web mirb_mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers etc.c Source File

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