static mrb_value mrb_ary_shuffle_bang(mrb_state *mrb, mrb_value ary) { mrb_int i; mrb_value random = mrb_nil_value(); if (RARRAY_LEN(ary) > 1) { mrb_get_args(mrb, "|o", &random); if( mrb_nil_p(random) ) { mrb_random_g_rand_seed(mrb); } else { mrb_data_check_type(mrb, random, &mt_state_type); mrb_random_rand_seed(mrb, random); } mrb_ary_modify(mrb, mrb_ary_ptr(ary)); for (i = RARRAY_LEN(ary) - 1; i > 0; i--) { mrb_int j; if( mrb_nil_p(random) ) { j = mrb_fixnum(mrb_random_mt_g_rand(mrb, mrb_fixnum_value(RARRAY_LEN(ary)))); } else { j = mrb_fixnum(mrb_random_mt_rand(mrb, DATA_PTR(random), mrb_fixnum_value(RARRAY_LEN(ary)))); } mrb_value t = RARRAY_PTR(ary)[i]; RARRAY_PTR(ary)[i] = RARRAY_PTR(ary)[j]; RARRAY_PTR(ary)[j] = t; } } return ary; }
static mrb_value mrb_ssl_set_socket(mrb_state *mrb, mrb_value self) { ssl_context *ssl; struct mrb_io *fptr; mrb_value socket; mrb_get_args(mrb, "o", &socket); mrb_data_check_type(mrb, socket, &mrb_io_type); fptr = DATA_CHECK_GET_PTR(mrb, socket, &mrb_io_type, struct mrb_io); ssl = DATA_CHECK_GET_PTR(mrb, self, &mrb_ssl_type, ssl_context); ssl_set_bio( ssl, net_recv, &fptr->fd, net_send, &fptr->fd ); return mrb_true_value(); }
static mrb_value mrb_ssl_set_rng(mrb_state *mrb, mrb_value self) { ssl_context *ssl; ctr_drbg_context *ctr_drbg; mrb_value rng; mrb_get_args(mrb, "o", &rng); mrb_data_check_type(mrb, rng, &mrb_ctr_drbg_type); ctr_drbg = DATA_CHECK_GET_PTR(mrb, rng, &mrb_ctr_drbg_type, ctr_drbg_context); ssl = DATA_CHECK_GET_PTR(mrb, self, &mrb_ssl_type, ssl_context); ssl_set_rng(ssl, ctr_drbg_random, ctr_drbg); return mrb_true_value(); }