diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-10-06 05:56:09 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-10-06 05:56:09 +0000 |
commit | 597974c21fed42a7e781718bcaa39315b041d800 (patch) | |
tree | 52160ca24830b1bbb1973eabdfb6acc819b56e44 /encoding.c | |
parent | d751dad12abeee9b257da2269e26a12e386b786f (diff) | |
download | ruby-597974c21fed42a7e781718bcaa39315b041d800.tar.gz |
* encoding.c (rb_enc_register): returns new index or -1 if failed.
* encoding.c (rb_enc_alias): check if original name is registered.
* encoding.c (rb_enc_init): register in same order as kcode options in
re.c. added new aliases.
* string.c (rb_str_force_encoding): check if valid encoding name.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13643 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'encoding.c')
-rw-r--r-- | encoding.c | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/encoding.c b/encoding.c index 70309f4f6f..5b0450f190 100644 --- a/encoding.c +++ b/encoding.c @@ -25,31 +25,45 @@ static struct rb_encoding_entry *enc_table; static int enc_table_size; static st_table *enc_table_alias; -void +int rb_enc_register(const char *name, rb_encoding *encoding) { struct rb_encoding_entry *ent; + int newsize; if (!enc_table) { - enc_table = malloc(sizeof(struct rb_encoding_entry)); - enc_table_size = 1; + ent = malloc(sizeof(*enc_table)); + newsize = 1; } else { - enc_table_size++; - enc_table = realloc(enc_table, sizeof(struct rb_encoding_entry)*enc_table_size); + newsize = enc_table_size + 1; + ent = realloc(enc_table, sizeof(*enc_table)*newsize); } - ent = &enc_table[enc_table_size-1]; + if (!ent) return -1; + enc_table = ent; + enc_table_size = newsize; + ent = &enc_table[--newsize]; ent->name = name; ent->enc = encoding; + return newsize; } -void +int rb_enc_alias(const char *alias, const char *orig) { + st_data_t data; + int idx; + if (!enc_table_alias) { enc_table_alias = st_init_strcasetable(); } + while ((idx = rb_enc_find_index(orig)) < 0) { + if (!st_lookup(enc_table_alias, (st_data_t)orig, &data)) + return -1; + orig = (const char *)data; + } st_insert(enc_table_alias, (st_data_t)alias, (st_data_t)orig); + return idx; } void @@ -57,11 +71,13 @@ rb_enc_init(void) { #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_SJIS); ENC_REGISTER(ONIG_ENCODING_UTF8); #undef ENC_REGISTER - rb_enc_alias("binary", "ascii"); + rb_enc_alias("ascii", "us-ascii"); + rb_enc_alias("binary", "us-ascii"); + rb_enc_alias("iso-8859-1", "us-ascii"); rb_enc_alias("sjis", "shift_jis"); } |