Changeset 331 for EcnlProtoTool/trunk/mruby-1.3.0/src/range.c
- Timestamp:
- Jan 21, 2018, 12:10:09 AM (6 years ago)
- Location:
- EcnlProtoTool/trunk/mruby-1.3.0
- Files:
-
- 1 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/mruby-1.3.0/src/range.c
r321 r331 5 5 */ 6 6 7 #include "mruby.h"8 #include "mruby/class.h"9 #include "mruby/range.h"10 #include "mruby/string.h"11 #include "mruby/array.h"7 #include <mruby.h> 8 #include <mruby/class.h> 9 #include <mruby/range.h> 10 #include <mruby/string.h> 11 #include <mruby/array.h> 12 12 13 13 #define RANGE_CLASS (mrb_class_get(mrb, "Range")) 14 15 MRB_API struct RRange* 16 mrb_range_ptr(mrb_state *mrb, mrb_value v) 17 { 18 struct RRange *r = (struct RRange*)mrb_ptr(v); 19 20 if (r->edges == NULL) { 21 mrb_raise(mrb, E_ARGUMENT_ERROR, "uninitialized range"); 22 } 23 return r; 24 } 14 25 15 26 static void … … 58 69 mrb_range_beg(mrb_state *mrb, mrb_value range) 59 70 { 60 struct RRange *r = mrb_range_ptr( range);71 struct RRange *r = mrb_range_ptr(mrb, range); 61 72 62 73 return r->edges->beg; … … 77 88 mrb_range_end(mrb_state *mrb, mrb_value range) 78 89 { 79 struct RRange *r = mrb_range_ptr( range);90 struct RRange *r = mrb_range_ptr(mrb, range); 80 91 81 92 return r->edges->end; … … 91 102 mrb_range_excl(mrb_state *mrb, mrb_value range) 92 103 { 93 struct RRange *r = mrb_range_ptr( range);104 struct RRange *r = mrb_range_ptr(mrb, range); 94 105 95 106 return mrb_bool_value(r->excl); … … 99 110 range_init(mrb_state *mrb, mrb_value range, mrb_value beg, mrb_value end, mrb_bool exclude_end) 100 111 { 101 struct RRange *r = mrb_range_ ptr(range);112 struct RRange *r = mrb_range_raw_ptr(range); 102 113 103 114 range_check(mrb, beg, end); … … 130 141 } 131 142 /* Ranges are immutable, so that they should be initialized only once. */ 143 if (mrb_range_raw_ptr(range)->edges) { 144 mrb_name_error(mrb, mrb_intern_lit(mrb, "initialize"), "`initialize' called twice"); 145 } 132 146 range_init(mrb, range, beg, end, exclusive); 133 147 return range; … … 153 167 struct RRange *rr; 154 168 struct RRange *ro; 155 mrb_value obj ;169 mrb_value obj, v1, v2; 156 170 157 171 mrb_get_args(mrb, "o", &obj); … … 162 176 } 163 177 164 rr = mrb_range_ptr( range);165 ro = mrb_range_ptr( obj);166 if (!mrb_bool(mrb_funcall(mrb, rr->edges->beg, "==", 1, ro->edges->beg)) ||167 !mrb_bool(mrb_funcall(mrb, rr->edges->end, "==", 1, ro->edges->end)) ||168 178 rr = mrb_range_ptr(mrb, range); 179 ro = mrb_range_ptr(mrb, obj); 180 v1 = mrb_funcall(mrb, rr->edges->beg, "==", 1, ro->edges->beg); 181 v2 = mrb_funcall(mrb, rr->edges->end, "==", 1, ro->edges->end); 182 if (!mrb_bool(v1) || !mrb_bool(v2) || rr->excl != ro->excl) { 169 183 return mrb_false_value(); 170 184 } … … 220 234 { 221 235 mrb_value val; 222 struct RRange *r = mrb_range_ptr( range);236 struct RRange *r = mrb_range_ptr(mrb, range); 223 237 mrb_value beg, end; 224 238 mrb_bool include_p; … … 228 242 beg = r->edges->beg; 229 243 end = r->edges->end; 230 include_p = r_le(mrb, beg, val) && /* beg <= val */231 ( (r->excl && r_gt(mrb, end, val)) ||/* end > val */232 (r_ge(mrb, end, val))); /* end >= val */244 include_p = r_le(mrb, beg, val) && /* beg <= val */ 245 (r->excl ? r_gt(mrb, end, val) /* end > val */ 246 : r_ge(mrb, end, val)); /* end >= val */ 233 247 234 248 return mrb_bool_value(include_p); 235 249 } 236 250 237 static mrb_bool 238 range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len, mrb_bool trunc)251 MRB_API mrb_int 252 mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len, mrb_bool trunc) 239 253 { 240 254 mrb_int beg, end; 241 struct RRange *r = mrb_range_ptr(range); 242 243 if (mrb_type(range) != MRB_TT_RANGE) return FALSE; 255 struct RRange *r; 256 257 if (mrb_type(range) != MRB_TT_RANGE) return 0; 258 r = mrb_range_ptr(mrb, range); 244 259 245 260 beg = mrb_int(mrb, r->edges->beg); … … 248 263 if (beg < 0) { 249 264 beg += len; 250 if (beg < 0) return FALSE;265 if (beg < 0) return 2; 251 266 } 252 267 253 268 if (trunc) { 254 if (beg > len) return FALSE;269 if (beg > len) return 2; 255 270 if (end > len) end = len; 256 271 } … … 264 279 *begp = beg; 265 280 *lenp = len; 266 return TRUE; 267 } 268 269 MRB_API mrb_bool 270 mrb_range_beg_len(mrb_state *mrb, mrb_value range, mrb_int *begp, mrb_int *lenp, mrb_int len) 271 { 272 return range_beg_len(mrb, range, begp, lenp, len, TRUE); 281 return 1; 273 282 } 274 283 … … 285 294 { 286 295 mrb_value str, str2; 287 struct RRange *r = mrb_range_ptr( range);296 struct RRange *r = mrb_range_ptr(mrb, range); 288 297 289 298 str = mrb_obj_as_string(mrb, r->edges->beg); … … 310 319 { 311 320 mrb_value str, str2; 312 struct RRange *r = mrb_range_ptr( range);321 struct RRange *r = mrb_range_ptr(mrb, range); 313 322 314 323 str = mrb_inspect(mrb, r->edges->beg); … … 350 359 if (mrb_type(obj) != MRB_TT_RANGE) return mrb_false_value(); 351 360 352 r = mrb_range_ptr( range);353 o = mrb_range_ptr( obj);361 r = mrb_range_ptr(mrb, range); 362 o = mrb_range_ptr(mrb, obj); 354 363 if (!mrb_eql(mrb, r->edges->beg, o->edges->beg) || 355 364 !mrb_eql(mrb, r->edges->end, o->edges->end) || … … 374 383 } 375 384 376 r = mrb_range_ptr( src);385 r = mrb_range_ptr(mrb, src); 377 386 range_init(mrb, copy, r->edges->beg, r->edges->end, r->excl); 378 387 … … 391 400 mrb_ary_push(mrb, result, func(mrb, obj, mrb_fixnum(argv[i]))); 392 401 } 393 else if ( range_beg_len(mrb, argv[i], &beg, &len, olen, FALSE)) {402 else if (mrb_range_beg_len(mrb, argv[i], &beg, &len, olen, FALSE) == 1) { 394 403 mrb_int const end = olen < beg + len ? olen : beg + len; 395 404 for (j = beg; j < end; ++j) {
Note:
See TracChangeset
for help on using the changeset viewer.