static VALUE rb_method_missing(int argc, const VALUE *argv, VALUE obj) { ID id; VALUE exc = rb_eNoMethodError; const char *format = 0; rb_thread_t *th = GET_THREAD(); int last_call_status = th->method_missing_reason; if (argc == 0 || !SYMBOL_P(argv[0])) { rb_raise(rb_eArgError, "no id given"); } stack_check(); id = SYM2ID(argv[0]); if (last_call_status & NOEX_PRIVATE) { format = "private method `%s' called for %s"; } else if (last_call_status & NOEX_PROTECTED) { format = "protected method `%s' called for %s"; } else if (last_call_status & NOEX_VCALL) { format = "undefined local variable or method `%s' for %s"; exc = rb_eNameError; } else if (last_call_status & NOEX_SUPER) { format = "super: no superclass method `%s' for %s"; } if (!format) { format = "undefined method `%s' for %s"; } { int n = 0; VALUE args[3]; args[n++] = rb_funcall(rb_const_get(exc, rb_intern("message")), '!', 3, rb_str_new2(format), obj, argv[0]); args[n++] = argv[0]; if (exc == rb_eNoMethodError) { args[n++] = rb_ary_new4(argc - 1, argv + 1); } exc = rb_class_new_instance(n, args, exc); th->cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(th->cfp); rb_exc_raise(exc); } return Qnil; /* not reached */ }
static VALUE enumerator_init(VALUE enum_obj, VALUE obj, VALUE meth, int argc, VALUE *argv) { struct enumerator *ptr = enumerator_ptr(enum_obj); ptr->obj = obj; ptr->meth = rb_to_id(meth); if (argc) GC_WB(&ptr->args, rb_ary_new4(argc, argv)); ptr->fib = 0; ptr->dst = Qnil; ptr->no_next = Qfalse; return enum_obj; }
/* * call-seq: * oradate.to_a -> array * * Returns a 6-element <i>array</i> of values for <i>oradate</i>: * {<code>[year, month, day, hour, minute, second]</code>}. */ static VALUE ora_date_to_a(VALUE self) { ora_date_t *od; VALUE ary[6]; Data_Get_Struct(self, ora_date_t, od); ary[0] = INT2FIX(Get_year(od)); ary[1] = INT2FIX(Get_month(od)); ary[2] = INT2FIX(Get_day(od)); ary[3] = INT2FIX(Get_hour(od)); ary[4] = INT2FIX(Get_minute(od)); ary[5] = INT2FIX(Get_second(od)); return rb_ary_new4(6, ary); }
static VALUE enumerator_with_index_i(VALUE val, VALUE m, int argc, VALUE *argv) { VALUE idx; VALUE *memo = (VALUE *)m; idx = INT2FIX(*memo); ++*memo; if (argc <= 1) return rb_yield_values(2, val, idx); return rb_yield_values(2, rb_ary_new4(argc, argv), idx); }
vm_resolve_args(VALUE **pargv, size_t argv_size, int *pargc, VALUE *args) { unsigned int i, argc = *pargc, real_argc = 0, j = 0; VALUE *argv = *pargv; bool splat_arg_follows = false; for (i = 0; i < argc; i++) { VALUE arg = args[j++]; if (arg == SPLAT_ARG_FOLLOWS) { splat_arg_follows = true; i--; } else { if (splat_arg_follows) { VALUE ary = rb_check_convert_type(arg, T_ARRAY, "Array", "to_a"); if (NIL_P(ary)) { ary = rb_ary_new4(1, &arg); } int count = RARRAY_LEN(ary); if (real_argc + count >= argv_size) { const size_t new_argv_size = real_argc + count + 100; VALUE *new_argv = (VALUE *)xmalloc_ptrs(sizeof(VALUE) * new_argv_size); memcpy(new_argv, argv, sizeof(VALUE) * argv_size); argv = new_argv; argv_size = new_argv_size; } int j; for (j = 0; j < count; j++) { argv[real_argc++] = RARRAY_AT(ary, j); } splat_arg_follows = false; } else { if (real_argc >= argv_size) { const size_t new_argv_size = real_argc + 100; VALUE *new_argv = (VALUE *)xmalloc_ptrs(sizeof(VALUE) * new_argv_size); memcpy(new_argv, argv, sizeof(VALUE) * argv_size); argv = new_argv; argv_size = new_argv_size; } argv[real_argc++] = arg; } } } *pargv = argv; *pargc = real_argc; }
// Transform#marshal_dump VALUE rbTransform::MarshalDump( VALUE aSelf ) { VALUE data[9]; const float* values = rbMacros::ToSFML< sf::Transform >( aSelf, rbTransform::Class )->getMatrix(); data[0] = rb_float_new( values[ 0 ] ); data[1] = rb_float_new( values[ 4 ] ); data[2] = rb_float_new( values[ 12 ] ); data[3] = rb_float_new( values[ 1 ] ); data[4] = rb_float_new( values[ 5 ] ); data[5] = rb_float_new( values[ 13 ] ); data[6] = rb_float_new( values[ 3 ] ); data[7] = rb_float_new( values[ 7 ] ); data[8] = rb_float_new( values[ 15 ] ); return rb_ary_new4( 9, data ); }
static VALUE iseq_location(rb_iseq_t *iseq) { VALUE loc[2]; if (!iseq) return Qnil; loc[0] = iseq->filename; if (iseq->insn_info_table) { loc[1] = INT2FIX(rb_iseq_first_lineno(iseq)); } else { loc[1] = Qnil; } return rb_ary_new4(2, loc); }
VALUE rb_proc_location(VALUE self) { rb_iseq_t *iseq = get_proc_iseq(self); VALUE loc[2]; if (!iseq) return Qnil; loc[0] = iseq->filename; if (iseq->insn_info_table) { loc[1] = INT2FIX(iseq->insn_info_table[0].line_no); } else { loc[1] = Qnil; } return rb_ary_new4(2, loc); }
PRIMITIVE VALUE vm_when_splat(unsigned char overriden, VALUE comparedTo, VALUE splat) { VALUE ary = rb_check_convert_type(splat, T_ARRAY, "Array", "to_a"); if (NIL_P(ary)) { ary = rb_ary_new4(1, &splat); } long i, count = RARRAY_LEN(ary); for (i = 0; i < count; i++) { VALUE o = RARRAY_AT(ary, i); if (RTEST(vm_fast_eqq(o, comparedTo, overriden))) { return Qtrue; } } return Qfalse; }
static VALUE cr_set_source_rgba (int argc, VALUE *argv, VALUE self) { VALUE red, green, blue, alpha; int n; n = rb_scan_args (argc, argv, "13", &red, &green, &blue, &alpha); if (n == 1 && rb_cairo__is_kind_of (red, rb_cArray)) { VALUE ary = red; n = RARRAY_LEN (ary); red = rb_ary_entry (ary, 0); green = rb_ary_entry (ary, 1); blue = rb_ary_entry (ary, 2); alpha = rb_ary_entry (ary, 3); } if (n == 3) { cairo_set_source_rgb (_SELF, NUM2DBL (red), NUM2DBL (green), NUM2DBL (blue)); } else if (n == 4) { cairo_set_source_rgba (_SELF, NUM2DBL (red), NUM2DBL (green), NUM2DBL (blue), NUM2DBL (alpha)); } else { VALUE inspected_arg = rb_inspect (rb_ary_new4 (argc, argv)); rb_raise (rb_eArgError, "invalid RGB%s: %s (expect " "(red, green, blue), (red, green, blue, alpha), " "([red, green, blue]) or ([red, green, blue, alpha]))", n == 4 ? "A" : "", StringValuePtr (inspected_arg)); } cr_check_status (_SELF); rb_ivar_set (self, cr_id_source, Qnil); return self; }
static force_inline void vm_fix_args(const VALUE *argv, VALUE *new_argv, const rb_vm_arity_t &arity, int argc) { assert(argc >= arity.min); assert((arity.max == -1) || (argc <= arity.max)); const int used_opt_args = argc - arity.min; int opt_args, rest_pos; if (arity.max == -1) { opt_args = arity.real - arity.min - 1; rest_pos = arity.left_req + opt_args; } else { opt_args = arity.real - arity.min; rest_pos = -1; } for (int i = 0; i < arity.real; ++i) { if (i < arity.left_req) { // required args before optional args new_argv[i] = argv[i]; } else if (i < arity.left_req + opt_args) { // optional args const int opt_arg_index = i - arity.left_req; if (opt_arg_index >= used_opt_args) { new_argv[i] = Qundef; } else { new_argv[i] = argv[i]; } } else if (i == rest_pos) { // rest const int rest_size = argc - arity.real + 1; if (rest_size <= 0) { new_argv[i] = rb_ary_new(); } else { new_argv[i] = rb_ary_new4(rest_size, &argv[i]); } } else { // required args after optional args new_argv[i] = argv[argc-(arity.real - i)]; } } }
static VALUE curry(VALUE dummy, VALUE args, int argc, VALUE *argv) { VALUE proc, passed, arity; proc = RARRAY_AT(args, 0); passed = RARRAY_AT(args, 1); arity = RARRAY_AT(args, 2); passed = rb_ary_plus(passed, rb_ary_new4(argc, argv)); rb_ary_freeze(passed); if(RARRAY_LEN(passed) < FIX2INT(arity)) { arity = make_curry_proc(proc, passed, arity); return arity; } arity = rb_proc_call(proc, passed); return arity; }
/* * call-seq: * Groonga::View.create(options={}) -> Groonga::View * Groonga::View.create(options={}) {|table| ... } * * 複数のテーブルを1つのテーブルとして扱う仮想的なテーブル * (ビュー)を生成する。ブロックを指定すると、そのブロック * に生成したテーブルが渡され、ブロックを抜けると自動的にテー * ブルが破棄される。 * * ビューにテーブルを追加するときはGroonga::View#add_tableを * 使う。 * * _options_に指定可能な値は以下の通り。 * * [+:context+] * ビューが利用するGroonga::Context。省略すると * Groonga::Context.defaultを用いる。 * * [+:name+] * ビューの名前。名前をつけると、Groonga::Context#[]に名 * 前を指定してビューを取得することができる。省略すると * 無名ビューになり、ビューIDでのみ取得できる。 * * [+:path+] * ビューを保存するパス。パスを指定すると永続ビューとな * り、プロセス終了後もレコードは保持される。次回起動時に * Groonga::View.openで保存されたビューを利用することが * できる。省略すると一時ビューになり、プロセスが終了する * とビューは破棄される。 * * [+:persistent+] * +true+を指定すると永続ビューとなる。+path+を省略した * 場合は自動的にパスが付加される。+:context+で指定した * Groonga::Contextに結びついているデータベースが一時デー * タベースの場合は例外が発生する。 * * 使用例: * * 無名一時ビューを生成する。 * Groonga::View.create * * 無名永続ブーを生成する。 * Groonga::View.create(:path => "/tmp/view.grn") * * 名前付き永続ビューを生成する。ただし、ファイル名は気に * しない。 * Groonga::View.create(:name => "Entries", * :persistent => true) * * +Users+テーブルと+Dogs+テーブルを横断検索するための * るビューを生成する。 * entries = Groonga::View.create(:name => "Entries") * entries.add_table("Users") * entries.add_table("Dogs") */ static VALUE rb_grn_view_s_create (int argc, VALUE *argv, VALUE klass) { grn_ctx *context; grn_obj *table; const char *name = NULL, *path = NULL; unsigned name_size = 0; grn_obj_flags flags = GRN_TABLE_VIEW; VALUE rb_table; VALUE options, rb_context, rb_name, rb_path, rb_persistent; rb_scan_args(argc, argv, "01", &options); rb_grn_scan_options(options, "context", &rb_context, "name", &rb_name, "path", &rb_path, "persistent", &rb_persistent, NULL); context = rb_grn_context_ensure(&rb_context); if (!NIL_P(rb_name)) { name = StringValuePtr(rb_name); name_size = RSTRING_LEN(rb_name); flags |= GRN_OBJ_PERSISTENT; } if (!NIL_P(rb_path)) { path = StringValueCStr(rb_path); flags |= GRN_OBJ_PERSISTENT; } if (RVAL2CBOOL(rb_persistent)) flags |= GRN_OBJ_PERSISTENT; table = grn_table_create(context, name, name_size, path, flags, NULL, NULL); if (!table) rb_grn_context_check(context, rb_ary_new4(argc, argv)); rb_table = GRNOBJECT2RVAL(klass, context, table, RB_GRN_TRUE); if (rb_block_given_p()) return rb_ensure(rb_yield, rb_table, rb_grn_object_close, rb_table); else return rb_table; }
void callback( ConstFSEventStreamRef streamRef, void *context, size_t numEvents, void *eventPaths, const FSEventStreamEventFlags eventFlags[], const FSEventStreamEventId eventIds[] ) { VALUE self = (VALUE)context; int i; char **paths = eventPaths; VALUE rb_paths[numEvents]; for (i = 0; i < numEvents; i++) { VALUE name = rb_str_new2(paths[i]); rb_paths[i] = name; } rb_funcall(self, rb_intern("on_change"), 1, rb_ary_new4(numEvents, rb_paths)); }
/* * call-seq: * enum.each {...} * * Iterates over the block according to how this Enumerable was constructed. * If no block is given, returns self. * */ static VALUE enumerator_each(int argc, VALUE *argv, VALUE obj) { if (argc > 0) { struct enumerator *e = enumerator_ptr(obj = rb_obj_dup(obj)); VALUE args = e->args; if (args) { args = rb_ary_dup(args); rb_ary_cat(args, argv, argc); } else { args = rb_ary_new4(argc, argv); } e->args = args; } if (!rb_block_given_p()) return obj; return enumerator_block_call(obj, 0, obj); }
static VALUE lazy_zip(int argc, VALUE *argv, VALUE obj) { VALUE ary; int i; if (rb_block_given_p()) { return rb_call_super(argc, argv); } ary = rb_ary_new2(argc); for (i = 0; i < argc; i++) { rb_ary_push(ary, rb_funcall(argv[i], id_lazy, 0)); } return lazy_set_method(rb_block_call(rb_cLazy, id_new, 1, &obj, lazy_zip_func, ary), rb_ary_new4(argc, argv)); }
static VALUE r_mpfi_matrix_to_array2 (VALUE self) { MPFIMatrix *ptr_self; int i, j; VALUE *ary, ret_ary; r_mpfi_get_matrix_struct(ptr_self, self); ary = ALLOC_N(VALUE, ptr_self->row); for (i = 0; i < ptr_self->row; i++) { ary[i] = rb_ary_new(); } for (i = 0; i < ptr_self->size; i += ptr_self->row) { for (j = 0; j < ptr_self->row; j++) { rb_ary_push(ary[j], r_mpfi_make_new_fi_obj(ptr_self->data + i + j)); } } ret_ary = rb_ary_new4(ptr_self->row, ary); free(ary); return ret_ary; }
static VALUE na_aref_md(int argc, VALUE *argv, VALUE self, int keep_dim, int result_nd) { VALUE args; // should be GC protected narray_t *na1; na_aref_md_data_t data; VALUE store = 0; VALUE idx; narray_t *nidx; GetNArray(self,na1); args = rb_ary_new4(argc,argv); if (argc == 1 && result_nd == 1) { idx = argv[0]; if (rb_obj_is_kind_of(idx, rb_cArray)) { idx = rb_apply(numo_cNArray,id_bracket,idx); } if (rb_obj_is_kind_of(idx, numo_cNArray)) { GetNArray(idx,nidx); if (NA_NDIM(nidx)>1) { store = nary_new(CLASS_OF(self),NA_NDIM(nidx),NA_SHAPE(nidx)); idx = na_flatten(idx); RARRAY_ASET(args,0,idx); } } // flatten should be done only for narray-view with non-uniform stride. if (na1->ndim > 1) { self = na_flatten(self); GetNArray(self,na1); } } data.args = args; data.self = self; data.store = store; data.ndim = result_nd; data.q = na_allocate_index_args(result_nd); data.na1 = na1; data.keep_dim = keep_dim; return rb_ensure(na_aref_md_protected, (VALUE)&data, na_aref_md_ensure, (VALUE)&data); }
static inline VALUE vm_yield_with_cfunc(rb_thread_t *th, const rb_block_t *block, VALUE self, int argc, const VALUE *argv, const rb_block_t *blockargptr) { NODE *ifunc = (NODE *) block->iseq; VALUE val, arg, blockarg; int lambda = block_proc_is_lambda(block->proc); if (lambda) { arg = rb_ary_new4(argc, argv); } else if (argc == 0) { arg = Qnil; } else { arg = argv[0]; } if (blockargptr) { if (blockargptr->proc) { blockarg = blockargptr->proc; } else { blockarg = rb_vm_make_proc(th, blockargptr, rb_cProc); } } else { blockarg = Qnil; } vm_push_frame(th, (rb_iseq_t *)ifunc, VM_FRAME_MAGIC_IFUNC, self, (VALUE)block->dfp, 0, th->cfp->sp, block->lfp, 1); if (blockargptr) { th->cfp->lfp[0] = GC_GUARDED_PTR((VALUE)blockargptr); } val = (*ifunc->nd_cfnc) (arg, ifunc->nd_tval, argc, argv, blockarg); th->cfp++; return val; }
/* uh = { * insn(Fixnum) => ihash(Hash) * } * ihash = { * -1(Fixnum) => count, # insn usage * 0(Fixnum) => ophash, # operand usage * } * ophash = { * val(interned string) => count(Fixnum) * } */ void vm_analysis_insn(int insn) { static ID usage_hash; static ID bigram_hash; static int prev_insn = -1; VALUE uh; VALUE ihash; VALUE cv; if (usage_hash == 0) { usage_hash = rb_intern("USAGE_ANALYSIS_INSN"); bigram_hash = rb_intern("USAGE_ANALYSIS_INSN_BIGRAM"); } uh = rb_const_get(rb_cVM, usage_hash); if ((ihash = rb_hash_aref(uh, INT2FIX(insn))) == Qnil) { ihash = rb_hash_new(); rb_hash_aset(uh, INT2FIX(insn), ihash); } if ((cv = rb_hash_aref(ihash, INT2FIX(-1))) == Qnil) { cv = INT2FIX(0); } rb_hash_aset(ihash, INT2FIX(-1), INT2FIX(FIX2INT(cv) + 1)); /* calc bigram */ if (prev_insn != -1) { VALUE bi; VALUE ary[2]; VALUE cv; ary[0] = INT2FIX(prev_insn); ary[1] = INT2FIX(insn); bi = rb_ary_new4(2, &ary[0]); uh = rb_const_get(rb_cVM, bigram_hash); if ((cv = rb_hash_aref(uh, bi)) == Qnil) { cv = INT2FIX(0); } rb_hash_aset(uh, bi, INT2FIX(FIX2INT(cv) + 1)); } prev_insn = insn; }
static VALUE lazy_cycle(int argc, VALUE *argv, VALUE obj) { VALUE args; int len = rb_long2int((long)argc + 2); if (rb_block_given_p()) { return rb_call_super(argc, argv); } args = rb_ary_tmp_new(len); rb_ary_push(args, obj); rb_ary_push(args, sym_cycle); if (argc > 0) { rb_ary_cat(args, argv, argc); } return lazy_set_method(rb_block_call(rb_cLazy, id_new, len, RARRAY_PTR(args), lazy_cycle_func, args /* prevent from GC */), rb_ary_new4(argc, argv)); }
static VALUE enumerator_init(VALUE enum_obj, VALUE obj, VALUE meth, int argc, VALUE *argv) { struct enumerator *ptr = enumerator_ptr(enum_obj); ptr->method = rb_obj_method(obj, meth); if (rb_block_given_p()) { ptr->proc = rb_block_proc(); ptr->iter = enumerator_iter_i; } else { ptr->iter = enumerator_each_i; } if (argc) ptr->args = rb_ary_new4(argc, argv); ptr->fib = 0; ptr->dst = Qnil; ptr->no_next = Qfalse; return enum_obj; }
static VALUE enumerator_init(VALUE enum_obj, VALUE obj, VALUE meth, int argc, VALUE *argv) { struct enumerator *ptr; Data_Get_Struct(enum_obj, struct enumerator, ptr); if (!ptr) { rb_raise(rb_eArgError, "unallocated enumerator"); } ptr->obj = obj; ptr->meth = rb_to_id(meth); if (argc) ptr->args = rb_ary_new4(argc, argv); ptr->fib = 0; ptr->dst = Qnil; ptr->no_next = Qfalse; return enum_obj; }
VALUE rb_check_backtrace(VALUE bt) { #define BACKTRACE_ERROR "backtrace must be Array of String" if (!NIL_P(bt)) { const int t = TYPE(bt); if (t == T_STRING) { return rb_ary_new4(1, &bt); } if (t != T_ARRAY) { rb_raise(rb_eTypeError, BACKTRACE_ERROR); } for (int i = 0, count = RARRAY_LEN(bt); i < count; i++) { if (TYPE(RARRAY_AT(bt, i)) != T_STRING) { rb_raise(rb_eTypeError, BACKTRACE_ERROR); } } } #undef BACKTRACE_ERROR return bt; }
/* * call-seq: * Groonga::Plugin.register(name, options=nil) * Groonga::Plugin.register({:path => path, :context => nil}) * * 既存のプラグインをデータベースに登録する。 * * _name_ を指定した場合はその名前のプラグインを登録する。 * * _path_ を指定した場合はそのパスのプラグインを登録する。 * * _options_ にはハッシュでオプションを指定する。指定できるオ * プションは以下の通り。 * @param options [::Hash] The name and value * pairs. Omitted names are initialized as the default value. * @option options :context (Groonga::Context.default) The context * * データベースを結びつけるコンテキスト。 */ static VALUE rb_grn_plugin_s_register (int argc, VALUE *argv, VALUE klass) { const char *name = NULL, *path = NULL; VALUE rb_options, rb_name = Qnil, rb_path, rb_context; grn_ctx *context; if (argc >= 1) { rb_name = rb_check_string_type(argv[0]); } if (NIL_P(rb_name)) { rb_scan_args(argc, argv, "01", &rb_options); rb_grn_scan_options(rb_options, "path", &rb_path, "context", &rb_context, NULL); path = StringValueCStr(rb_path); } else { rb_scan_args(argc, argv, "11", &rb_name, &rb_options); rb_grn_scan_options(rb_options, "context", &rb_context, NULL); name = StringValueCStr(rb_name); } if (NIL_P(rb_context)) { rb_context = rb_grn_context_get_default(); } context = RVAL2GRNCONTEXT(rb_context); if (name) { grn_plugin_register(context, name); } else { grn_plugin_register_by_path(context, path); } rb_grn_context_check(context, rb_ary_new4(argc, argv)); return Qnil; }
/* Returns an array of length 11, where items are counts for the following duration classes: 0: unknown duration 1: (inf,1) 2: [1,1/2) 3: [1/2,1/4) 4: [1/4,1/8) 5: [1/8,1/16) 6: [1/16,1/32) 7: [1/32,1/64) 8: [1/64,1/128) 9: [1/128,1/256) 10: [1/256,1/512) */ VALUE c_duration_histogram(VALUE self) { VALUE durations_obj[11]; char *chords, *cp; unsigned int i, j, k, chords_size, chordlen; double dur = 0, fullnoteduration, temp, durations[11]; chords = (char *) RSTRING_PTR(rb_iv_get(self, "@chords")); chords_size = NUM2UINT(rb_iv_get(self, "@num_chords")); fullnoteduration = 4 * NUM2DBL(rb_iv_get(self, "@quarternoteduration")); for (i = 0; i < 11; i++) durations[i] = 0; for (cp = chords, i = 0; i < chords_size; i++) { chordlen = *cp; cp += CHORDHEADERLEN; //printf("chord %u/%u: len=%u\n", i, chords_size, chordlen); for (j = 0; j < chordlen; j++, cp += NOTELEN) { dur = (double) *((unsigned short *) (cp + 1)); //printf("chord %u/%u: note %u/%u: pitch=%d:dur=%f\n", i, chords_size, j, chordlen, *cp, dur); temp = fullnoteduration; for (k = 1; k < 11; k++, temp /= 2) { //printf(" k=%u: dur=%f >= %f\n", k, dur, temp); if (dur > temp) { durations[k] += 1; break; } } if (k == 11) durations[0] += 1; } } for (i = 0; i < 11; i++) durations_obj[i] = UINT2NUM(durations[i]); return rb_ary_new4(11, durations_obj); }
/* Creates a histogram of note intervals. Track information is ignored. Intervals are calculated between notes in two chords. Note that the definition of a chord in this software is that notes with same onset time (strt) belong to same chord. MIDI pitch values have a minimum value of 0 and maximum value of 127. Therefore the minimum possible interval is 0 - 127 = -127 and maximum interval is 127 - 0 = 127. Thus there are 127 + 1 + 127 = 255 possible intervals. Returns an array containing count for each interval (-127-127). */ VALUE c_pitch_interval_histogram(VALUE self) { VALUE intervals_obj[255]; char *chords, *cp, *pp, *temp; unsigned int i, j, k, chords_size, chordlen, prevchordlen, intervals[255]; chords = (char *) RSTRING_PTR(rb_iv_get(self, "@chords")); chords_size = NUM2UINT(rb_iv_get(self, "@num_chords")); for (i = 0; i < 255; i++) intervals[i] = 0; /* scan all chords, start from the second chord */ pp = chords; prevchordlen = *pp; pp += CHORDHEADERLEN; cp = chords + CHORDHEADERLEN + chords[0] * NOTELEN; for (i = 0; i < chords_size; i++) { /* get chord size */ chordlen = *cp; cp += CHORDHEADERLEN; temp = cp; /* scan all notes in a chord */ for (j = 0; j < chordlen; j++, cp += NOTELEN) { /* scan all notes in the previous chord */ for (k = 0; k < prevchordlen; k++, pp += NOTELEN) { /* calculate interval */ intervals[127 + (int) *cp - (int) *pp] += 1; } } prevchordlen = chordlen; pp = temp; } for (i = 0; i < 255; i++) intervals_obj[i] = UINT2NUM(intervals[i]); return rb_ary_new4(255, intervals_obj); }
static VALUE strongtyping_expect(int argc, VALUE *argv, VALUE self UNUSED) { int i = 0; VALUE obj[MAXARGS], mod[MAXARGS]; VALUE typestr; if(!argc) return Qnil; if(argc % 2) rb_raise(rb_eSyntaxError, "expect() requires argument pairs"); #ifndef __GNUC__ if(argc*2 > MAXARGS*2) rb_raise(rb_eSyntaxError, "too many arguments to expect()"); #endif for(i = 0; i < argc; i += 2) { obj[i/2] = argv[i]; mod[(i+1)/2] = argv[i+1]; } if(rb_funcall(obj[0], id_isa, 1, cQueryParams)) { rb_funcall(obj[0], rb_intern("<<"), 1, rb_ary_new4(argc/2, mod)); rb_raise(eArgList, ""); // TODO: Why an empty string? Causes a warning in 1.9.x. } i = check_args(argc / 2, obj, mod); if(i < 0) return Qnil; typestr = rb_funcall(mod[i], id_inspect, 0); rb_raise( eArgumentTypeError, "Expecting %s as argument %d, got %s", RSTRING_PTR(typestr), i + 1, rb_class2name(rb_funcall(obj[i], id_class, 0)) ); }
static VALUE enumerator_init(VALUE enum_obj, VALUE obj, VALUE meth, int argc, VALUE *argv) { struct enumerator *ptr; TypedData_Get_Struct(enum_obj, struct enumerator, &enumerator_data_type, ptr); if (!ptr) { rb_raise(rb_eArgError, "unallocated enumerator"); } ptr->obj = obj; ptr->meth = rb_to_id(meth); if (argc) ptr->args = rb_ary_new4(argc, argv); ptr->fib = 0; ptr->dst = Qnil; ptr->lookahead = Qundef; ptr->feedvalue = Qundef; ptr->stop_exc = Qfalse; return enum_obj; }
static VALUE cr_mesh_pattern_set_corner_color_generic (int argc, VALUE *argv, VALUE self) { cairo_pattern_t *pattern; VALUE rb_nth_corner, rb_red, rb_green, rb_blue, rb_alpha; unsigned int nth_corner; double red, green, blue, alpha; rb_scan_args (argc, argv, "41", &rb_nth_corner, &rb_red, &rb_green, &rb_blue, &rb_alpha); nth_corner = NUM2UINT (rb_nth_corner); if (nth_corner > 3) { VALUE inspected; inspected = rb_funcall (rb_ary_new4 (argc, argv), id_inspect, 0); rb_raise (rb_eArgError, "nth_corner must be 0, 1, 2 or 3: <%u>: <%s>", nth_corner, RVAL2CSTR (inspected)); } pattern = _SELF (self); red = NUM2DBL (rb_red); green = NUM2DBL (rb_green); blue = NUM2DBL (rb_blue); if (NIL_P (rb_alpha)) { cairo_mesh_pattern_set_corner_color_rgb (pattern, nth_corner, red, green, blue); } else { alpha = NUM2DBL (rb_alpha); cairo_mesh_pattern_set_corner_color_rgba (pattern, nth_corner, red, green, blue, alpha); } cr_pattern_check_status (pattern); return self; }