static int load_encoding(const char *name) { VALUE enclib = rb_sprintf("enc/%s.so", name); VALUE verbose = ruby_verbose; VALUE debug = ruby_debug; VALUE loaded; char *s = RSTRING_PTR(enclib) + 4, *e = RSTRING_END(enclib) - 3; int idx; while (s < e) { if (!ISALNUM(*s)) *s = '_'; else if (ISUPPER(*s)) *s = TOLOWER(*s); ++s; } OBJ_FREEZE(enclib); ruby_verbose = Qfalse; ruby_debug = Qfalse; loaded = rb_protect(require_enc, enclib, 0); ruby_verbose = verbose; ruby_debug = debug; rb_set_errinfo(Qnil); if (NIL_P(loaded)) return -1; if ((idx = rb_enc_registered(name)) < 0) return -1; if (enc_autoload_p(enc_table.list[idx].enc)) return -1; return idx; }
static int load_encoding(const char *name) { VALUE enclib = rb_sprintf("enc/%s.so", name); VALUE verbose = ruby_verbose; VALUE debug = ruby_debug; VALUE errinfo; char *s = RSTRING_PTR(enclib) + 4, *e = RSTRING_END(enclib) - 3; int loaded; int idx; while (s < e) { if (!ISALNUM(*s)) *s = '_'; else if (ISUPPER(*s)) *s = (char)TOLOWER(*s); ++s; } FL_UNSET(enclib, FL_TAINT); enclib = rb_fstring(enclib); ruby_verbose = Qfalse; ruby_debug = Qfalse; errinfo = rb_errinfo(); loaded = rb_require_internal(enclib, rb_safe_level()); ruby_verbose = verbose; ruby_debug = debug; rb_set_errinfo(errinfo); if (loaded < 0 || 1 < loaded) return -1; if ((idx = rb_enc_registered(name)) < 0) return -1; if (enc_autoload_p(enc_table.list[idx].enc)) return -1; return idx; }
static int check_encoding(rb_encoding *enc) { int index = rb_enc_to_index(enc); if (rb_enc_from_index(index) != enc) return -1; if (enc_autoload_p(enc)) { index = enc_autoload(enc); } return index; }
static int check_encoding(mrb_state *mrb, mrb_encoding *enc) { int index = mrb_enc_to_index(enc); if (mrb_enc_from_index(mrb, index) != enc) return -1; if (enc_autoload_p(enc)) { index = enc_autoload(mrb, enc); } return index; }
/* * call-seq: * enc.inspect -> string * * Returns a string which represents the encoding for programmers. * * Encoding::UTF_8.inspect #=> "#<Encoding:UTF-8>" * Encoding::ISO_2022_JP.inspect #=> "#<Encoding:ISO-2022-JP (dummy)>" */ static VALUE enc_inspect(VALUE self) { rb_encoding *enc; if (!is_data_encoding(self)) { not_encoding(self); } if (!(enc = DATA_PTR(self)) || rb_enc_from_index(rb_enc_to_index(enc)) != enc) { rb_raise(rb_eTypeError, "broken Encoding"); } return rb_enc_sprintf(rb_usascii_encoding(), "#<%"PRIsVALUE":%s%s%s>", rb_obj_class(self), rb_enc_name(enc), (ENC_DUMMY_P(enc) ? " (dummy)" : ""), enc_autoload_p(enc) ? " (autoload)" : ""); }
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; }
int rb_enc_find_index(const char *name) { int i = rb_enc_registered(name); rb_encoding *enc; if (i < 0) { i = load_encoding(name); } else if (!(enc = rb_enc_from_index(i))) { if (i != UNSPECIFIED_ENCODING) { rb_raise(rb_eArgError, "encoding %s is not registered", name); } } else if (enc_autoload_p(enc)) { if (enc_autoload(enc) < 0) { rb_warn("failed to load encoding (%s); use ASCII-8BIT instead", name); return 0; } } return i; }
int rb_enc_register(const char *name, rb_encoding *encoding) { int index = rb_enc_registered(name); if (index >= 0) { rb_encoding *oldenc = rb_enc_from_index(index); if (STRCASECMP(name, rb_enc_name(oldenc))) { index = enc_register(name, encoding); } else if (enc_autoload_p(oldenc) || !ENC_DUMMY_P(oldenc)) { enc_register_at(index, name, encoding); } else { rb_raise(rb_eArgError, "encoding %s is already registered", name); } } else { index = enc_register(name, encoding); set_encoding_const(name, rb_enc_from_index(index)); } return index; }
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; }