static int enc_register(const char *name, rb_encoding *encoding) { int index = enc_table.count; if ((index = enc_table_expand(index + 1)) < 0) return -1; enc_table.count = index; return enc_register_at(index - 1, name, encoding); }
static int enc_replicate_with_index(const char *name, rb_encoding *origenc, int idx) { if (idx < 0) { idx = enc_register(name, origenc); } else { idx = enc_register_at(idx, name, origenc); } if (idx >= 0) { set_base_encoding(idx, origenc); set_encoding_const(name, rb_enc_from_index(idx)); } return idx; }
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_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; }