/* * call-seq: * Encoding.compatible?(str1, str2) -> enc or nil * * Checks the compatibility of two strings. * If they are compatible, means concatenatable, * returns an encoding which the concatenated string will be. * If they are not compatible, nil is returned. * * Encoding.compatible?("\xa1".force_encoding("iso-8859-1"), "b") * #=> #<Encoding:ISO-8859-1> * * Encoding.compatible?( * "\xa1".force_encoding("iso-8859-1"), * "\xa1\xa1".force_encoding("euc-jp")) * #=> nil * */ static VALUE enc_compatible_p(VALUE klass, VALUE str1, VALUE str2) { rb_encoding *enc; if (!enc_capable(str1)) return Qnil; if (!enc_capable(str2)) return Qnil; enc = rb_enc_compatible(str1, str2); if (!enc) return Qnil; return rb_enc_from_encoding(enc); }
static void enc_set_index(VALUE obj, int idx) { if (!enc_capable(obj)) { rb_raise(rb_eArgError, "cannot set encoding on non-encoding capable object"); } if (idx < ENCODING_INLINE_MAX) { ENCODING_SET_INLINED(obj, idx); return; } ENCODING_SET_INLINED(obj, ENCODING_INLINE_MAX); rb_ivar_set(obj, rb_id_encoding(), INT2NUM(idx)); }
int rb_enc_capable(VALUE obj) { return enc_capable(obj); }