summaryrefslogtreecommitdiff
path: root/encoding.c
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-12-10 03:59:34 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-12-10 03:59:34 +0000
commit614a8427ce87a16844a8c4f961085877ebfcfe20 (patch)
tree61d328926950103ea586cb9e9641cc0236d06ef1 /encoding.c
parentae76a2323e062869f9235c7a23627d427127a9f2 (diff)
* encoding.c (enc_replicate): add Encoding#replicate(name).
* encoding.c (enc_replicate_with_index): renamed from old enc_replicate. * encoding.c (rb_enc_from_encoding_index): split from rb_enc_from_encoding. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26059 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'encoding.c')
-rw-r--r--encoding.c39
1 files changed, 26 insertions, 13 deletions
diff --git a/encoding.c b/encoding.c
index 38d81b8e2f..2d50f9f8ac 100644
--- a/encoding.c
+++ b/encoding.c
@@ -70,26 +70,30 @@ enc_new(rb_encoding *encoding)
return TypedData_Wrap_Struct(rb_cEncoding, &encoding_data_type, encoding);
}
-VALUE
-rb_enc_from_encoding(rb_encoding *encoding)
+static VALUE
+rb_enc_from_encoding_index(int idx)
{
VALUE list, enc;
- int idx;
- if (!encoding) return Qnil;
- idx = ENC_TO_ENCINDEX(encoding);
if (!(list = rb_encoding_list)) {
- rb_bug("rb_enc_from_encoding(%d\"%s\"): no rb_encoding_list",
- idx, rb_enc_name(encoding));
+ rb_bug("rb_enc_from_encoding_index(%d): no rb_encoding_list", idx);
}
enc = rb_ary_entry(list, idx);
if (NIL_P(enc)) {
- rb_bug("rb_enc_from_encoding(%d\"%s\"): not created yet",
- idx, rb_enc_name(encoding));
+ rb_bug("rb_enc_from_encoding_index(%d): not created yet", idx);
}
return enc;
}
+VALUE
+rb_enc_from_encoding(rb_encoding *encoding)
+{
+ int idx;
+ if (!encoding) return Qnil;
+ idx = ENC_TO_ENCINDEX(encoding);
+ return rb_enc_from_encoding_index(idx);
+}
+
static int enc_autoload(rb_encoding *);
static int
@@ -309,8 +313,16 @@ rb_enc_replicate(const char *name, rb_encoding *encoding)
return idx;
}
+static VALUE
+enc_replicate(VALUE encoding, VALUE name)
+{
+ return rb_enc_from_encoding_index(
+ rb_enc_replicate(RSTRING_PTR(name),
+ rb_to_encoding(encoding)));
+}
+
static int
-enc_replicate(int idx, const char *name, rb_encoding *origenc)
+enc_replicate_with_index(const char *name, rb_encoding *origenc, int idx)
{
if (idx < 0) {
idx = enc_register(name, origenc);
@@ -334,7 +346,7 @@ rb_encdb_replicate(const char *name, const char *orig)
if (origidx < 0) {
origidx = enc_register(orig, 0);
}
- return enc_replicate(idx, name, rb_enc_from_index(origidx));
+ return enc_replicate_with_index(name, rb_enc_from_index(origidx), idx);
}
int
@@ -350,8 +362,8 @@ rb_define_dummy_encoding(const char *name)
int
rb_encdb_dummy(const char *name)
{
- int index = enc_replicate(rb_enc_registered(name), name,
- rb_ascii8bit_encoding());
+ int index = enc_replicate_with_index(name, rb_ascii8bit_encoding(),
+ rb_enc_registered(name));
rb_encoding *enc = enc_table.list[index].enc;
ENC_SET_DUMMY(enc);
@@ -1490,6 +1502,7 @@ Init_Encoding(void)
rb_define_method(rb_cEncoding, "names", enc_names, 0);
rb_define_method(rb_cEncoding, "dummy?", enc_dummy_p, 0);
rb_define_method(rb_cEncoding, "ascii_compatible?", enc_ascii_compatible_p, 0);
+ rb_define_method(rb_cEncoding, "replicate", enc_replicate, 1);
rb_define_singleton_method(rb_cEncoding, "list", enc_list, 0);
rb_define_singleton_method(rb_cEncoding, "name_list", rb_enc_name_list, 0);
rb_define_singleton_method(rb_cEncoding, "aliases", rb_enc_aliases, 0);