1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* encoding.c (rb_enc_alias): allow encodings multiple aliases.

* encoding.c (rb_enc_find_index): search the encoding which has the
  given name and return its index if found, or -1.

* st.c (type_strcasehash): case-insensitive string hash type.

* string.c (rb_str_force_encoding): force encoding of self.  this name
  comes from [ruby-dev:31894] by Martin Duerst.  [ruby-dev:31744]

* include/ruby/encoding.h (rb_enc_find_index, rb_enc_associate_index):
  prototyped.

* include/ruby/encoding.h (rb_enc_isctype): direct interface to ctype.

* include/ruby/st.h (st_init_strcasetable): prototyped.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13556 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2007-09-28 19:27:10 +00:00
parent 534d057e58
commit c351afc372
6 changed files with 128 additions and 12 deletions

View file

@ -23,6 +23,7 @@ struct rb_encoding_entry {
static struct rb_encoding_entry *enc_table;
static int enc_table_size;
static st_table *enc_table_alias;
void
rb_enc_register(const char *name, rb_encoding *encoding)
@ -42,13 +43,26 @@ rb_enc_register(const char *name, rb_encoding *encoding)
ent->enc = encoding;
}
void
rb_enc_alias(const char *alias, const char *orig)
{
if (!enc_table_alias) {
enc_table_alias = st_init_strcasetable();
}
st_insert(enc_table_alias, (st_data_t)alias, (st_data_t)orig);
}
void
rb_enc_init(void)
{
rb_enc_register("ascii", ONIG_ENCODING_ASCII);
rb_enc_register("sjis", ONIG_ENCODING_SJIS);
rb_enc_register("euc-jp", ONIG_ENCODING_EUC_JP);
rb_enc_register("utf-8", ONIG_ENCODING_UTF8);
#define ENC_REGISTER(enc) rb_enc_register(rb_enc_name(enc), enc)
ENC_REGISTER(ONIG_ENCODING_ASCII);
ENC_REGISTER(ONIG_ENCODING_SJIS);
ENC_REGISTER(ONIG_ENCODING_EUC_JP);
ENC_REGISTER(ONIG_ENCODING_UTF8);
#undef ENC_REGISTER
rb_enc_alias("binary", "ascii");
rb_enc_alias("sjis", "shift_jis");
}
rb_encoding *
@ -63,20 +77,37 @@ rb_enc_from_index(int index)
return enc_table[index].enc;
}
rb_encoding *
rb_enc_find(const char *name)
int
rb_enc_find_index(const char *name)
{
int i;
st_data_t alias = 0;
if (!name) return -1;
if (!enc_table) {
rb_enc_init();
}
find:
for (i=0; i<enc_table_size; i++) {
if (strcmp(name, enc_table[i].name) == 0) {
return enc_table[i].enc;
if (strcasecmp(name, enc_table[i].name) == 0) {
return i;
}
}
return ONIG_ENCODING_ASCII;
if (!alias && enc_table_alias) {
if (st_lookup(enc_table_alias, (st_data_t)name, &alias)) {
name = (const char *)alias;
goto find;
}
}
return -1;
}
rb_encoding *
rb_enc_find(const char *name)
{
rb_encoding *enc = rb_enc_from_index(rb_enc_find_index(name));
if (!enc) enc = ONIG_ENCODING_ASCII;
return enc;
}
static int
@ -163,7 +194,7 @@ rb_enc_get_index(VALUE obj)
{
int i;
enc_check_capable(obj);
if (!enc_capable(obj)) return -1;
i = ENCODING_GET(obj);
if (i == ENCODING_INLINE_MAX) {
VALUE iv;