int rb_enc_get_index(VALUE obj) { int i = -1; VALUE tmp; if (SPECIAL_CONST_P(obj)) { if (!SYMBOL_P(obj)) return -1; obj = rb_sym2str(obj); } switch (BUILTIN_TYPE(obj)) { case T_STRING: case T_SYMBOL: case T_REGEXP: i = enc_get_index_str(obj); break; case T_FILE: tmp = rb_funcallv(obj, rb_intern("internal_encoding"), 0, 0); if (NIL_P(tmp)) { tmp = rb_funcallv(obj, rb_intern("external_encoding"), 0, 0); } if (is_obj_encoding(tmp)) { i = enc_check_encoding(tmp); } break; case T_DATA: if (is_data_encoding(obj)) { i = enc_check_encoding(obj); } break; default: break; } return i; }
static int enc_check_encoding(VALUE obj) { if (!is_obj_encoding(obj)) { return -1; } return check_encoding(RDATA(obj)->data); }
/* * call-seq: * Encoding.find(string) -> enc * Encoding.find(symbol) -> enc * * Search the encoding with specified <i>name</i>. * <i>name</i> should be a string or symbol. * * Encoding.find("US-ASCII") #=> #<Encoding:US-ASCII> * Encoding.find(:Shift_JIS) #=> #<Encoding:Shift_JIS> * * Names which this method accept are encoding names and aliases * including following special aliases * * "external":: default external encoding * "internal":: default internal encoding * "locale":: locale encoding * "filesystem":: filesystem encoding * * An ArgumentError is raised when no encoding with <i>name</i>. * Only <code>Encoding.find("internal")</code> however returns nil * when no encoding named "internal", in other words, when Ruby has no * default internal encoding. */ static VALUE enc_find(VALUE klass, VALUE enc) { int idx; if (is_obj_encoding(enc)) return enc; idx = str_to_encindex(enc); if (idx == UNSPECIFIED_ENCODING) return Qnil; return rb_enc_from_encoding_index(idx); }