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 <string.h>
tk_takateku 0:33feccbba3ff 2 #include "c_string.h"
tk_takateku 0:33feccbba3ff 3
tk_takateku 0:33feccbba3ff 4 #include "alloc.h"
tk_takateku 0:33feccbba3ff 5 #include "class.h"
tk_takateku 0:33feccbba3ff 6 #include "static.h"
tk_takateku 0:33feccbba3ff 7 #include "value.h"
tk_takateku 0:33feccbba3ff 8 #include "vm.h"
tk_takateku 0:33feccbba3ff 9
tk_takateku 0:33feccbba3ff 10 // dupulicate string (clone)
tk_takateku 0:33feccbba3ff 11 // returns duplicated string pointer
tk_takateku 0:33feccbba3ff 12 char* mrbc_string_dup(mrb_vm *vm, const char *str)
tk_takateku 0:33feccbba3ff 13 {
tk_takateku 0:33feccbba3ff 14 int len = strlen((char *)str);
tk_takateku 0:33feccbba3ff 15 char *ptr = (char *)mrbc_alloc(vm, len+1);
tk_takateku 0:33feccbba3ff 16 if( ptr == NULL ) return NULL; // ENOMEM
tk_takateku 0:33feccbba3ff 17
tk_takateku 0:33feccbba3ff 18 strcpy(ptr, str);
tk_takateku 0:33feccbba3ff 19 return ptr;
tk_takateku 0:33feccbba3ff 20 }
tk_takateku 0:33feccbba3ff 21
tk_takateku 0:33feccbba3ff 22 // catination string
tk_takateku 0:33feccbba3ff 23 // returns new string
tk_takateku 0:33feccbba3ff 24 char *mrbc_string_cat(mrb_vm *vm, char *s1, const char *s2)
tk_takateku 0:33feccbba3ff 25 {
tk_takateku 0:33feccbba3ff 26 int len1 = strlen(s1);
tk_takateku 0:33feccbba3ff 27 int len2 = strlen(s2);
tk_takateku 0:33feccbba3ff 28 char *ptr = (char *)mrbc_alloc(vm, len1+len2+1);
tk_takateku 0:33feccbba3ff 29 if( ptr == NULL ) return NULL; // ENOMEM
tk_takateku 0:33feccbba3ff 30
tk_takateku 0:33feccbba3ff 31 strcpy(ptr, s1);
tk_takateku 0:33feccbba3ff 32 strcpy(ptr+len1, s2);
tk_takateku 0:33feccbba3ff 33 return ptr;
tk_takateku 0:33feccbba3ff 34 }
tk_takateku 0:33feccbba3ff 35
tk_takateku 0:33feccbba3ff 36 // substr
tk_takateku 0:33feccbba3ff 37 // returns new string
tk_takateku 0:33feccbba3ff 38 static char *mrbc_string_substr(mrb_vm *vm, char *s, int start, int len)
tk_takateku 0:33feccbba3ff 39 {
tk_takateku 0:33feccbba3ff 40 char *ptr = (char *)mrbc_alloc(vm, len+1);
tk_takateku 0:33feccbba3ff 41 if( ptr == NULL ) return NULL; // ENOMEM
tk_takateku 0:33feccbba3ff 42
tk_takateku 0:33feccbba3ff 43 int i;
tk_takateku 0:33feccbba3ff 44 for( i=0 ; i<len ; i++ ){
tk_takateku 0:33feccbba3ff 45 ptr[i] = s[start+i];
tk_takateku 0:33feccbba3ff 46 }
tk_takateku 0:33feccbba3ff 47 ptr[len] = 0;
tk_takateku 0:33feccbba3ff 48 return ptr;
tk_takateku 0:33feccbba3ff 49 }
tk_takateku 0:33feccbba3ff 50
tk_takateku 0:33feccbba3ff 51
tk_takateku 0:33feccbba3ff 52 // method
tk_takateku 0:33feccbba3ff 53 // string size
tk_takateku 0:33feccbba3ff 54 static void c_string_size(mrb_vm *vm, mrb_value *v)
tk_takateku 0:33feccbba3ff 55 {
tk_takateku 0:33feccbba3ff 56 int cnt = strlen(v->value.str);
tk_takateku 0:33feccbba3ff 57 SET_INT_RETURN( cnt );
tk_takateku 0:33feccbba3ff 58 }
tk_takateku 0:33feccbba3ff 59
tk_takateku 0:33feccbba3ff 60
tk_takateku 0:33feccbba3ff 61 // method
tk_takateku 0:33feccbba3ff 62 // string !=
tk_takateku 0:33feccbba3ff 63 static void c_string_neq(mrb_vm *vm, mrb_value *v)
tk_takateku 0:33feccbba3ff 64 {
tk_takateku 0:33feccbba3ff 65 if( mrbc_eq(v, v+1) ){
tk_takateku 0:33feccbba3ff 66 SET_FALSE_RETURN();
tk_takateku 0:33feccbba3ff 67 } else {
tk_takateku 0:33feccbba3ff 68 SET_TRUE_RETURN();
tk_takateku 0:33feccbba3ff 69 }
tk_takateku 0:33feccbba3ff 70 }
tk_takateku 0:33feccbba3ff 71
tk_takateku 0:33feccbba3ff 72 // method
tk_takateku 0:33feccbba3ff 73 // string []
tk_takateku 0:33feccbba3ff 74 // string[Fixnum]
tk_takateku 0:33feccbba3ff 75 static void c_string_idx_get(mrb_vm *vm, mrb_value *v)
tk_takateku 0:33feccbba3ff 76 {
tk_takateku 0:33feccbba3ff 77 int index = GET_INT_ARG(0);
tk_takateku 0:33feccbba3ff 78 char *str = mrbc_string_substr(vm, v->value.str, index, 1);
tk_takateku 0:33feccbba3ff 79 v->value.str = str;
tk_takateku 0:33feccbba3ff 80 }
tk_takateku 0:33feccbba3ff 81
tk_takateku 0:33feccbba3ff 82
tk_takateku 0:33feccbba3ff 83 // method
tk_takateku 0:33feccbba3ff 84 // string to_i
tk_takateku 0:33feccbba3ff 85 static void c_string_to_fixnum(mrb_vm *vm, mrb_value *v)
tk_takateku 0:33feccbba3ff 86 {
tk_takateku 0:33feccbba3ff 87 char *str = v->value.str;
tk_takateku 0:33feccbba3ff 88 int value = 0;
tk_takateku 0:33feccbba3ff 89 while( *str && *str >= '0' && *str <= '9' ){
tk_takateku 0:33feccbba3ff 90 value *= 10;
tk_takateku 0:33feccbba3ff 91 value += *str - '0';
tk_takateku 0:33feccbba3ff 92 str++;
tk_takateku 0:33feccbba3ff 93 }
tk_takateku 0:33feccbba3ff 94 SET_INT_RETURN(value);
tk_takateku 0:33feccbba3ff 95 }
tk_takateku 0:33feccbba3ff 96
tk_takateku 0:33feccbba3ff 97
tk_takateku 0:33feccbba3ff 98
tk_takateku 0:33feccbba3ff 99 // init class
tk_takateku 0:33feccbba3ff 100 void mrbc_init_class_string(mrb_vm *vm)
tk_takateku 0:33feccbba3ff 101 {
tk_takateku 0:33feccbba3ff 102 mrbc_class_string = mrbc_class_alloc(vm, "String", mrbc_class_object);
tk_takateku 0:33feccbba3ff 103
tk_takateku 0:33feccbba3ff 104 mrbc_define_method(vm, mrbc_class_string, "size", c_string_size);
tk_takateku 0:33feccbba3ff 105 mrbc_define_method(vm, mrbc_class_string, "length", c_string_size);
tk_takateku 0:33feccbba3ff 106 mrbc_define_method(vm, mrbc_class_string, "!=", c_string_neq);
tk_takateku 0:33feccbba3ff 107 mrbc_define_method(vm, mrbc_class_string, "to_i", c_string_to_fixnum);
tk_takateku 0:33feccbba3ff 108 }
tk_takateku 0:33feccbba3ff 109