This is a port of the mruby/c tutorial Chapter 03 to the mbed environment.

Dependencies:   mbed

For details, refer to the following.

http://www.s-itoc.jp/activity/research/mrubyc/mrubyc_tutorial/436

Note:There is a change in rtt0.h from the original source in the mruby/c. It was necessary for inclusion in C ++ source.

Committer:
tk_takateku
Date:
Wed Feb 15 01:03:35 2017 +0000
Revision:
0:33feccbba3ff
Commit before publishing

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tk_takateku 0:33feccbba3ff 1 #include <stdio.h>
tk_takateku 0:33feccbba3ff 2
tk_takateku 0:33feccbba3ff 3 #include "vm_config.h"
tk_takateku 0:33feccbba3ff 4 #include "c_numeric.h"
tk_takateku 0:33feccbba3ff 5 #include "alloc.h"
tk_takateku 0:33feccbba3ff 6 #include "class.h"
tk_takateku 0:33feccbba3ff 7 #include "static.h"
tk_takateku 0:33feccbba3ff 8 #include "value.h"
tk_takateku 0:33feccbba3ff 9 #include "console.h"
tk_takateku 0:33feccbba3ff 10
tk_takateku 0:33feccbba3ff 11 static void c_fixnum_eq(mrb_vm *vm, mrb_value *v)
tk_takateku 0:33feccbba3ff 12 {
tk_takateku 0:33feccbba3ff 13 console_printf("ERROR ==\n");
tk_takateku 0:33feccbba3ff 14 }
tk_takateku 0:33feccbba3ff 15
tk_takateku 0:33feccbba3ff 16 // Operator %
tk_takateku 0:33feccbba3ff 17 static void c_fixnum_mod(mrb_vm *vm, mrb_value *v)
tk_takateku 0:33feccbba3ff 18 {
tk_takateku 0:33feccbba3ff 19 int num = GET_INT_ARG(0);
tk_takateku 0:33feccbba3ff 20 SET_INT_RETURN( v->value.i % num );
tk_takateku 0:33feccbba3ff 21 }
tk_takateku 0:33feccbba3ff 22
tk_takateku 0:33feccbba3ff 23 // Operator <=>
tk_takateku 0:33feccbba3ff 24 static void c_fixnum_comp(mrb_vm *vm, mrb_value *v)
tk_takateku 0:33feccbba3ff 25 {
tk_takateku 0:33feccbba3ff 26 int num = GET_INT_ARG(0);
tk_takateku 0:33feccbba3ff 27 if(v->value.i > num){
tk_takateku 0:33feccbba3ff 28 SET_INT_RETURN(1);
tk_takateku 0:33feccbba3ff 29 }else if(v->value.i == num){
tk_takateku 0:33feccbba3ff 30 SET_INT_RETURN(0);
tk_takateku 0:33feccbba3ff 31 }else{
tk_takateku 0:33feccbba3ff 32 SET_INT_RETURN(-1);
tk_takateku 0:33feccbba3ff 33 }
tk_takateku 0:33feccbba3ff 34 }
tk_takateku 0:33feccbba3ff 35
tk_takateku 0:33feccbba3ff 36 // Unary Operator ~; bit operation NOT
tk_takateku 0:33feccbba3ff 37 static void c_fixnum_deny(mrb_vm *vm, mrb_value *v)
tk_takateku 0:33feccbba3ff 38 {
tk_takateku 0:33feccbba3ff 39 SET_INT_RETURN( (v->value.i + 1) * (-1) );
tk_takateku 0:33feccbba3ff 40 }
tk_takateku 0:33feccbba3ff 41
tk_takateku 0:33feccbba3ff 42
tk_takateku 0:33feccbba3ff 43 // Operator &; bit operation AND
tk_takateku 0:33feccbba3ff 44 static void c_fixnum_and(mrb_vm *vm, mrb_value *v)
tk_takateku 0:33feccbba3ff 45 {
tk_takateku 0:33feccbba3ff 46 int num = GET_INT_ARG(0);
tk_takateku 0:33feccbba3ff 47 SET_INT_RETURN(v->value.i & num);
tk_takateku 0:33feccbba3ff 48 }
tk_takateku 0:33feccbba3ff 49
tk_takateku 0:33feccbba3ff 50 // x-bit left shift for x
tk_takateku 0:33feccbba3ff 51 static int32_t shift(int32_t x, int32_t y)
tk_takateku 0:33feccbba3ff 52 {
tk_takateku 0:33feccbba3ff 53 if( y >= 33 ){
tk_takateku 0:33feccbba3ff 54 x = 0;
tk_takateku 0:33feccbba3ff 55 } else if( y >= 0 ){
tk_takateku 0:33feccbba3ff 56 x <<= y;
tk_takateku 0:33feccbba3ff 57 } else if( y > -33 ){
tk_takateku 0:33feccbba3ff 58 x = x >> -y;
tk_takateku 0:33feccbba3ff 59 } else {
tk_takateku 0:33feccbba3ff 60 x = 0;
tk_takateku 0:33feccbba3ff 61 }
tk_takateku 0:33feccbba3ff 62 return x;
tk_takateku 0:33feccbba3ff 63 }
tk_takateku 0:33feccbba3ff 64
tk_takateku 0:33feccbba3ff 65 // Operator <<; bit operation LEFT_SHIFT
tk_takateku 0:33feccbba3ff 66 static void c_fixnum_lshift(mrb_vm *vm, mrb_value *v)
tk_takateku 0:33feccbba3ff 67 {
tk_takateku 0:33feccbba3ff 68 int num = GET_INT_ARG(0);
tk_takateku 0:33feccbba3ff 69 SET_INT_RETURN( shift(v->value.i, num) );
tk_takateku 0:33feccbba3ff 70 }
tk_takateku 0:33feccbba3ff 71
tk_takateku 0:33feccbba3ff 72 // Operator >>; bit operation RIGHT_SHIFT
tk_takateku 0:33feccbba3ff 73 static void c_fixnum_rshift(mrb_vm *vm, mrb_value *v)
tk_takateku 0:33feccbba3ff 74 {
tk_takateku 0:33feccbba3ff 75 int num = GET_INT_ARG(0);
tk_takateku 0:33feccbba3ff 76 SET_INT_RETURN( shift(v->value.i, -num) );
tk_takateku 0:33feccbba3ff 77 }
tk_takateku 0:33feccbba3ff 78
tk_takateku 0:33feccbba3ff 79 #if MRBC_USE_STRING
tk_takateku 0:33feccbba3ff 80 static void c_fixnum_to_s(mrb_vm *vm, mrb_value *v)
tk_takateku 0:33feccbba3ff 81 {
tk_takateku 0:33feccbba3ff 82 int num = v->value.i;
tk_takateku 0:33feccbba3ff 83 int i = 0, j = 0;
tk_takateku 0:33feccbba3ff 84 char buf[10];
tk_takateku 0:33feccbba3ff 85 int sign = 0;
tk_takateku 0:33feccbba3ff 86
tk_takateku 0:33feccbba3ff 87 if( num < 0 ){
tk_takateku 0:33feccbba3ff 88 sign = 1;
tk_takateku 0:33feccbba3ff 89 num = -num;
tk_takateku 0:33feccbba3ff 90 }
tk_takateku 0:33feccbba3ff 91 do {
tk_takateku 0:33feccbba3ff 92 buf[i++] = (num % 10) + '0';
tk_takateku 0:33feccbba3ff 93 num = num / 10;
tk_takateku 0:33feccbba3ff 94 } while( num > 0 );
tk_takateku 0:33feccbba3ff 95 if( sign ){
tk_takateku 0:33feccbba3ff 96 buf[i] = '-';
tk_takateku 0:33feccbba3ff 97 } else {
tk_takateku 0:33feccbba3ff 98 i--;
tk_takateku 0:33feccbba3ff 99 }
tk_takateku 0:33feccbba3ff 100 char *str = (char *)mrbc_alloc(vm, i+2);
tk_takateku 0:33feccbba3ff 101 if( str == NULL ) return; // ENOMEM
tk_takateku 0:33feccbba3ff 102 while( i>=0 ){
tk_takateku 0:33feccbba3ff 103 str[j++] = buf[i--];
tk_takateku 0:33feccbba3ff 104 }
tk_takateku 0:33feccbba3ff 105 str[j] = 0;
tk_takateku 0:33feccbba3ff 106 v->tt = MRB_TT_STRING;
tk_takateku 0:33feccbba3ff 107 v->value.str = str;
tk_takateku 0:33feccbba3ff 108 }
tk_takateku 0:33feccbba3ff 109 #endif
tk_takateku 0:33feccbba3ff 110
tk_takateku 0:33feccbba3ff 111
tk_takateku 0:33feccbba3ff 112
tk_takateku 0:33feccbba3ff 113 void mrbc_init_class_fixnum(mrb_vm *vm)
tk_takateku 0:33feccbba3ff 114 {
tk_takateku 0:33feccbba3ff 115 // Fixnum
tk_takateku 0:33feccbba3ff 116 mrbc_class_fixnum = mrbc_class_alloc(vm, "Fixnum", mrbc_class_object);
tk_takateku 0:33feccbba3ff 117 mrbc_define_method(vm, mrbc_class_fixnum, "==", c_fixnum_eq);
tk_takateku 0:33feccbba3ff 118 mrbc_define_method(vm, mrbc_class_fixnum, "%", c_fixnum_mod);
tk_takateku 0:33feccbba3ff 119 mrbc_define_method(vm, mrbc_class_fixnum, "<=>", c_fixnum_comp);
tk_takateku 0:33feccbba3ff 120 mrbc_define_method(vm, mrbc_class_fixnum, "~", c_fixnum_deny);
tk_takateku 0:33feccbba3ff 121 mrbc_define_method(vm, mrbc_class_fixnum, "&", c_fixnum_and);
tk_takateku 0:33feccbba3ff 122 mrbc_define_method(vm, mrbc_class_fixnum, "<<", c_fixnum_lshift);
tk_takateku 0:33feccbba3ff 123 mrbc_define_method(vm, mrbc_class_fixnum, ">>", c_fixnum_rshift);
tk_takateku 0:33feccbba3ff 124 #if MRBC_USE_STRING
tk_takateku 0:33feccbba3ff 125 mrbc_define_method(vm, mrbc_class_fixnum, "to_s", c_fixnum_to_s);
tk_takateku 0:33feccbba3ff 126 #endif
tk_takateku 0:33feccbba3ff 127 }
tk_takateku 0:33feccbba3ff 128
tk_takateku 0:33feccbba3ff 129
tk_takateku 0:33feccbba3ff 130 // Float
tk_takateku 0:33feccbba3ff 131 #if MRBC_USE_FLOAT
tk_takateku 0:33feccbba3ff 132
tk_takateku 0:33feccbba3ff 133 void mrbc_init_class_float(mrb_vm *vm)
tk_takateku 0:33feccbba3ff 134 {
tk_takateku 0:33feccbba3ff 135 // Float
tk_takateku 0:33feccbba3ff 136 mrbc_class_float = mrbc_class_alloc(vm, "Float", mrbc_class_object);
tk_takateku 0:33feccbba3ff 137
tk_takateku 0:33feccbba3ff 138 }
tk_takateku 0:33feccbba3ff 139
tk_takateku 0:33feccbba3ff 140 #endif
tk_takateku 0:33feccbba3ff 141