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_string.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 <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 |