mruby/c VM Source Code release 3.4
Loading...
Searching...
No Matches
c_range.c
Go to the documentation of this file.
1
13
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(struct VM *vm, mrbc_value *first, mrbc_value *last, int flag_exclude)
44{
45 mrbc_value value = {.tt = MRBC_TT_RANGE};
46
47 value.range = mrbc_alloc(vm, sizeof(mrbc_range));
48 if( !value.range ) return value; // ENOMEM
49
50 MRBC_INIT_OBJECT_HEADER( value.range, "RA" );
51 value.range->flag_exclude = flag_exclude;
52 value.range->first = *first;
53 value.range->last = *last;
54
55 return value;
56}
57
58
59//================================================================
65{
66 mrbc_decref( &v->range->first );
67 mrbc_decref( &v->range->last );
68
69 mrbc_raw_free( v->range );
70}
71
72
73#if defined(MRBC_ALLOC_VMID)
74//================================================================
79void mrbc_range_clear_vm_id(mrbc_value *v)
80{
81 mrbc_set_vm_id( v->range, 0 );
82 mrbc_clear_vm_id( &v->range->first );
83 mrbc_clear_vm_id( &v->range->last );
84}
85#endif
86
87
88//================================================================
97int mrbc_range_compare(const mrbc_value *v1, const mrbc_value *v2)
98{
99 int res;
100
101 res = mrbc_compare( &v1->range->first, &v2->range->first );
102 if( res != 0 ) return res;
103
104 res = mrbc_compare( &v1->range->last, &v2->range->last );
105 if( res != 0 ) return res;
106
107 return (int)v2->range->flag_exclude - (int)v1->range->flag_exclude;
108}
109
110
111
112//================================================================
115static void c_range_equal3(struct VM *vm, mrbc_value v[], int argc)
116{
117 if( mrbc_type(v[0]) == MRBC_TT_CLASS ) {
118 mrbc_value result = mrbc_send( vm, v, argc, &v[1], "kind_of?", 1, &v[0] );
119 SET_RETURN( result );
120 return;
121 }
122
123 int cmp_first = mrbc_compare( &v[0].range->first, &v[1] );
124 int result = (cmp_first <= 0);
125 if( !result ) goto DONE;
126
127 int cmp_last = mrbc_compare( &v[1], &v[0].range->last );
128 result = (v->range->flag_exclude) ? (cmp_last < 0) : (cmp_last <= 0);
129
130 DONE:
131 SET_BOOL_RETURN( result );
132}
133
134
135//================================================================
138static void c_range_first(struct VM *vm, mrbc_value v[], int argc)
139{
141 SET_RETURN(ret);
142}
143
144
145//================================================================
148static void c_range_last(struct VM *vm, mrbc_value v[], int argc)
149{
151 SET_RETURN(ret);
152}
153
154
155
156//================================================================
159static void c_range_exclude_end(struct VM *vm, mrbc_value v[], int argc)
160{
161 int result = v->range->flag_exclude;
162 SET_BOOL_RETURN( result );
163}
164
165
166
167#if MRBC_USE_STRING
168//================================================================
171static void c_range_inspect(struct VM *vm, mrbc_value v[], int argc)
172{
173 if( v[0].tt == MRBC_TT_CLASS ) {
174 v[0] = mrbc_string_new_cstr(vm, mrbc_symid_to_str( v[0].cls->sym_id ));
175 return;
176 }
177
178 mrbc_value ret = mrbc_string_new(vm, NULL, 0);
179 if( !ret.string ) goto RETURN_NIL; // ENOMEM
180
181 int i;
182 for( i = 0; i < 2; i++ ) {
183 if( i != 0 ) mrbc_string_append_cstr( &ret, ".." );
184 mrbc_value v1 = (i == 0) ? mrbc_range_first(v) : mrbc_range_last(v);
185 mrbc_value s1 = mrbc_send( vm, v, argc, &v1, "inspect", 0 );
186 mrbc_string_append( &ret, &s1 );
187 mrbc_string_delete( &s1 );
188 }
189
190 SET_RETURN(ret);
191 return;
192
193 RETURN_NIL:
195}
196#endif
197
198
199/* MRBC_AUTOGEN_METHOD_TABLE
200
201 CLASS("Range")
202 FILE("_autogen_class_range.h")
203
204 METHOD("===", c_range_equal3 )
205 METHOD("first", c_range_first )
206 METHOD("last", c_range_last )
207 METHOD("exclude_end?", c_range_exclude_end )
208#if MRBC_USE_STRING
209 METHOD("inspect", c_range_inspect )
210 METHOD("to_s", c_range_inspect )
211#endif
212*/
213#include "_autogen_class_range.h"
void mrbc_raw_free(void *ptr)
Definition alloc.c:695
void mrbc_range_delete(mrbc_value *v)
Definition c_range.c:64
mrbc_value mrbc_range_new(struct 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:97
static mrbc_value mrbc_range_last(const mrbc_value *v)
Definition c_range.h:72
struct RRange mrbc_range
Range object.
static mrbc_value mrbc_range_first(const mrbc_value *v)
Definition c_range.h:64
void mrbc_string_delete(mrbc_value *str)
Definition c_string.c:129
int mrbc_string_append(mrbc_value *s1, const mrbc_value *s2)
Definition c_string.c:210
mrbc_value mrbc_string_new(struct VM *vm, const void *src, int len)
Definition c_string.c:62
static mrbc_value mrbc_string_new_cstr(struct VM *vm, const char *src)
Definition c_string.h:85
static int mrbc_string_append_cstr(mrbc_value *s1, const char *s2)
Definition c_string.h:128
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:538
Include at once the necessary header files.
struct RString * string
Definition value.h:164
struct RRange * range
Definition value.h:165
mrbc_value last
Definition c_range.h:45
mrbc_value first
Definition c_range.h:44
uint8_t flag_exclude
Definition c_range.h:43
Virtual Machine.
Definition vm.h:140
const char * mrbc_symid_to_str(mrbc_sym sym_id)
Definition symbol.c:238
int mrbc_compare(const mrbc_value *v1, const mrbc_value *v2)
Definition value.c:66
static void mrbc_decref(mrbc_value *v)
Definition value.h:604
#define MRBC_INIT_OBJECT_HEADER(p, t)
Definition value.h:307
#define SET_BOOL_RETURN(n)
Definition value.h:278
#define SET_NIL_RETURN()
Definition value.h:266
#define mrbc_type(o)
Definition value.h:193
@ MRBC_TT_RANGE
Range.
Definition value.h:96
@ MRBC_TT_CLASS
Class.
Definition value.h:87
struct RObject mrbc_value
Definition value.h:174
#define SET_RETURN(n)
Definition value.h:261
Global configuration of mruby/c VM's.