This is a port of the mruby/c tutorial Chapter 03 to the mbed environment.
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.
mrubyc/c_numeric.c@0:33feccbba3ff, 2017-02-15 (annotated)
- Committer:
- tk_takateku
- Date:
- Wed Feb 15 01:03:35 2017 +0000
- Revision:
- 0:33feccbba3ff
Commit before publishing
Who changed what in which revision?
User | Revision | Line number | New 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 |