mruby/c VM Source Code release 4.0.0
Loading...
Searching...
No Matches
c_range.c
Go to the documentation of this file.
1
14
15/***** Feature test switches ************************************************/
16/***** System headers *******************************************************/
17//@cond
18#include "vm_config.h"
19//@endcond
20
21/***** Local headers ********************************************************/
22#include "mrubyc.h"
23
24/***** Constat values *******************************************************/
25/***** Macros ***************************************************************/
26/***** Typedefs *************************************************************/
27/***** Function prototypes **************************************************/
28/***** Local variables ******************************************************/
29/***** Global variables *****************************************************/
30/***** Signal catching functions ********************************************/
31/***** Local functions ******************************************************/
32/***** Global functions *****************************************************/
33
34//================================================================
43mrbc_value mrbc_range_new(mrbc_vm *vm, mrbc_value *first, mrbc_value *last, int flag_exclude)
44{
45 mrbc_range *range = mrbc_alloc(vm, sizeof(mrbc_range));
46
47 *range = (mrbc_range){
49 .flag_exclude = flag_exclude,
50 .first = *first,
51 .last = *last,
52 };
53
54 return mrbc_immediate_value(MRBC_TT_RANGE, .range = range);
55}
56
57
58//================================================================
64{
65 mrbc_decref( &v->range->first );
66 mrbc_decref( &v->range->last );
67
68 mrbc_raw_free( v->range );
69}
70
71
72#if defined(MRBC_ALLOC_VMID)
73//================================================================
78void mrbc_range_clear_vm_id(mrbc_value *v)
79{
80 mrbc_set_vm_id( v->range, 0 );
81 mrbc_clear_vm_id( &v->range->first );
82 mrbc_clear_vm_id( &v->range->last );
83}
84#endif
85
86
87//================================================================
96int mrbc_range_compare(const mrbc_value *v1, const mrbc_value *v2)
97{
98 int res;
99
100 res = mrbc_compare( &v1->range->first, &v2->range->first );
101 if( res != 0 ) return res;
102
103 res = mrbc_compare( &v1->range->last, &v2->range->last );
104 if( res != 0 ) return res;
105
106 return (int)v2->range->flag_exclude - (int)v1->range->flag_exclude;
107}
108
109
110
111//================================================================
114static void c_range_equal3(mrbc_vm *vm, mrbc_value v[], int argc)
115{
116 if( mrbc_type(v[0]) == MRBC_TT_CLASS ) {
117 mrbc_value result = mrbc_send( vm, v, argc, &v[1], "kind_of?", 1, &v[0] );
118 SET_RETURN( result );
119 return;
120 }
121
122 int cmp_first = mrbc_compare( &v[0].range->first, &v[1] );
123 int result = (cmp_first <= 0);
124 if( !result ) goto DONE;
125
126 int cmp_last = mrbc_compare( &v[1], &v[0].range->last );
127 result = (v->range->flag_exclude) ? (cmp_last < 0) : (cmp_last <= 0);
128
129 DONE:
130 SET_BOOL_RETURN( result );
131}
132
133
134//================================================================
137static void c_range_first(mrbc_vm *vm, mrbc_value v[], int argc)
138{
140 SET_RETURN(ret);
141}
142
143
144//================================================================
147static void c_range_last(mrbc_vm *vm, mrbc_value v[], int argc)
148{
150 SET_RETURN(ret);
151}
152
153
154
155//================================================================
158static void c_range_exclude_end(mrbc_vm *vm, mrbc_value v[], int argc)
159{
160 int result = v->range->flag_exclude;
161 SET_BOOL_RETURN( result );
162}
163
164
165
166#if MRBC_USE_STRING
167//================================================================
170static void c_range_inspect(mrbc_vm *vm, mrbc_value v[], int argc)
171{
172 if( mrbc_type(v[0]) == MRBC_TT_CLASS ) {
173 mrbc_object_inspect(vm, v, argc);
174 return;
175 }
176
177 mrbc_value ret = mrbc_string_new(vm, NULL, 0);
178
179 for( int i = 0; i < 2; i++ ) {
180 if( i != 0 ) mrbc_string_append_cstr( &ret, ".." );
181 mrbc_value v1 = (i == 0) ? mrbc_range_first(v) : mrbc_range_last(v);
182 mrbc_value s1 = mrbc_send( vm, v, argc, &v1, "inspect", 0 );
183 mrbc_string_append( &ret, &s1 );
184 mrbc_string_delete( &s1 );
185 }
186
187 SET_RETURN(ret);
188}
189#endif
190
191
192/* MRBC_AUTOGEN_METHOD_TABLE
193
194 CLASS("Range")
195 FILE("_autogen_class_range.h")
196
197 METHOD("===", c_range_equal3 )
198 METHOD("first", c_range_first )
199 METHOD("last", c_range_last )
200 METHOD("exclude_end?", c_range_exclude_end )
201#if MRBC_USE_STRING
202 METHOD("inspect", c_range_inspect )
203 METHOD("to_s", c_range_inspect )
204#endif
205*/
206#include "_autogen_class_range.h"
void mrbc_raw_free(void *ptr)
Definition alloc.c:707
#define mrbc_immediate_value(...)
Definition boxing_no.h:71
#define mrbc_type(o)
Definition boxing_no.h:57
struct RObject mrbc_value
Value object. Default version.
void mrbc_object_inspect(mrbc_vm *vm, mrbc_value v[], int argc)
Definition c_object.c:83
void mrbc_range_delete(mrbc_value *v)
Definition c_range.c:63
mrbc_value mrbc_range_new(mrbc_vm *vm, mrbc_value *first, mrbc_value *last, int flag_exclude)
Definition c_range.c:43
int mrbc_range_compare(const mrbc_value *v1, const mrbc_value *v2)
Definition c_range.c:96
static mrbc_value mrbc_range_last(const mrbc_value *v)
Definition c_range.h:82
struct RRange mrbc_range
Range object.
static mrbc_value mrbc_range_first(const mrbc_value *v)
Definition c_range.h:66
void mrbc_string_delete(mrbc_value *str)
Definition c_string.c:107
mrbc_value mrbc_string_new(mrbc_vm *vm, const void *src, int len)
Definition c_string.c:64
int mrbc_string_append(mrbc_value *s1, const mrbc_value *s2)
Definition c_string.c:184
static int mrbc_string_append_cstr(mrbc_value *s1, const char *s2)
Definition c_string.h:134
mrbc_value mrbc_send(struct VM *vm, mrbc_value *v, int argc, mrbc_value *recv, const char *method_name, int n_params,...)
Definition class.c:526
Include at once the necessary header files.
struct RRange * range
Definition boxing_no.h:33
mrbc_value last
Definition c_range.h:47
mrbc_value first
Definition c_range.h:46
uint8_t flag_exclude
Definition c_range.h:45
int mrbc_compare(const mrbc_value *v1, const mrbc_value *v2)
Definition value.c:68
static void mrbc_decref(mrbc_value *v)
Definition value.h:561
#define MRBC_INIT_OBJECT_HEADER_DI(t)
Definition value.h:147
#define SET_BOOL_RETURN(n)
Definition value.h:238
@ MRBC_TT_RANGE
Range.
Definition value.h:99
@ MRBC_TT_CLASS
Class.
Definition value.h:90
#define SET_RETURN(n)
Definition value.h:221
struct VM mrbc_vm
Virtual Machine.
Global configuration of mruby/c VM's.