void Transcoding::declare(STATE, const char* from, const char* to, const char* lib) { LookupTable* map = Encoding::transcoding_map(state); Object* obj = map->fetch(state, encoding_symbol(state, from)); LookupTable* table; if(obj->nil_p()) { table = LookupTable::create(state); map->store(state, encoding_symbol(state, from), table); } else { table = as<LookupTable>(obj); } table->store(state, encoding_symbol(state, to), String::create(state, lib)); }
void Transcoding::define(STATE, OnigTranscodingType* tr) { LookupTable* map = Encoding::transcoding_map(state); Object* obj = map->fetch(state, encoding_symbol(state, tr->src_encoding)); LookupTable* table; if(obj->nil_p()) { table = LookupTable::create(state); map->store(state, encoding_symbol(state, tr->src_encoding), table); } else { table = as<LookupTable>(obj); } Transcoding* t = Transcoding::create(state, tr); table->store(state, encoding_symbol(state, tr->dst_encoding), t); }
int Encoding::find_index(STATE, const char* name) { Object* obj = encoding_map(state)->fetch(state, encoding_symbol(state, name)); if(Tuple* ref = try_as<Tuple>(obj)) { return as<Fixnum>(ref->at(1))->to_native(); } else { return -1; } }
Encoding* Encoding::alias(STATE, const char* name, const char* original) { int index = find_index(state, original); if(index < 0) return nil<Encoding>(); Tuple* ref = encoding_reference(state, index, name); encoding_map(state)->store(state, encoding_symbol(state, name), ref); add_constant(state, name, from_index(state, index)); return as<Encoding>(encoding_list(state)->get(state, index)); }
Encoding* Encoding::create_bootstrap(STATE, const char* name, Index index, OnigEncodingType* enc) { Encoding* e = create(state, enc); Tuple* ref = encoding_reference(state, index); encoding_map(state)->store(state, encoding_symbol(state, name), ref); encoding_list(state)->set(state, index, e); add_constant(state, name, e); return e; }
Encoding* Encoding::define(STATE, const char* name, OnigEncodingType* enc, Object* dummy) { Encoding* e = create(state, enc, dummy); e->name(state, String::create(state, name)); Array* list = encoding_list(state); size_t index = list->size(); Tuple* ref = encoding_reference(state, index); encoding_map(state)->store(state, encoding_symbol(state, name), ref); list->set(state, index, e); add_constant(state, name, e); return e; }
void Encoding::create_internal(STATE, const char* name, int index) { Tuple* ref = encoding_reference(state, index, name); encoding_map(state)->store(state, encoding_symbol(state, name), ref); }