mrb_value mrb_enc_from_encoding(mrb_state *mrb, mrb_encoding *encoding) { int idx; if (!encoding) return mrb_nil_value(); idx = ENC_TO_ENCINDEX(encoding); return mrb_enc_from_encoding_index(mrb, idx); }
VALUE rb_enc_from_encoding(rb_encoding *encoding) { int idx; if (!encoding) return Qnil; idx = ENC_TO_ENCINDEX(encoding); return rb_enc_from_encoding_index(idx); }
static rb_encoding * must_encindex(int index) { rb_encoding *enc = rb_enc_from_index(index); if (!enc) { rb_raise(rb_eEncodingError, "encoding index out of bound: %d", index); } if (ENC_TO_ENCINDEX(enc) != (int)(index & ENC_INDEX_MASK)) { rb_raise(rb_eEncodingError, "wrong encoding index %d for %s (expected %d)", index, rb_enc_name(enc), ENC_TO_ENCINDEX(enc)); } if (enc_autoload_p(enc) && enc_autoload(enc) == -1) { rb_loaderror("failed to load encoding (%s)", rb_enc_name(enc)); } return enc; }
static int enc_autoload(rb_encoding *enc) { int i; rb_encoding *base = enc_table.list[ENC_TO_ENCINDEX(enc)].base; if (base) { i = 0; do { if (i >= enc_table.count) return -1; } while (enc_table.list[i].enc != base && (++i, 1)); if (enc_autoload_p(base)) { if (enc_autoload(base) < 0) return -1; } i = ENC_TO_ENCINDEX(enc); enc_register_at(i, rb_enc_name(enc), base); } else { i = load_encoding(rb_enc_name(enc)); } return i; }
VALUE rb_enc_from_encoding(rb_encoding *encoding) { VALUE list, enc; int idx; if (!encoding) return Qnil; idx = ENC_TO_ENCINDEX(encoding); if (!(list = rb_encoding_list)) { rb_bug("rb_enc_from_encoding(%d\"%s\"): no rb_encoding_list", idx, rb_enc_name(encoding)); } enc = rb_ary_entry(list, idx); if (NIL_P(enc)) { rb_bug("rb_enc_from_encoding(%d\"%s\"): not created yet", idx, rb_enc_name(encoding)); } return enc; }
static int enc_autoload(rb_encoding *enc) { int i; rb_encoding *base = enc_table.list[ENC_TO_ENCINDEX(enc)].base; if (base) { i = 0; do { if (i >= enc_table.count) return -1; } while (enc_table.list[i].enc != base && (++i, 1)); if (enc_autoload_p(base)) { if (enc_autoload(base) < 0) return -1; } i = enc->ruby_encoding_index; enc_register_at(i & ENC_INDEX_MASK, rb_enc_name(enc), base); ((rb_raw_encoding *)enc)->ruby_encoding_index = i; i &= ENC_INDEX_MASK; } else { i = load_encoding(rb_enc_name(enc)); } return i; }
int rb_enc_to_index(rb_encoding *enc) { return enc ? ENC_TO_ENCINDEX(enc) : 0; }