Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}