summaryrefslogtreecommitdiff
path: root/encoding.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-15 09:56:59 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-12-15 09:56:59 +0000
commitf2bd108d8df6def3ff39674337eb4d40cfb25e3b (patch)
tree7520d2b73558bb8a6a4973eaf86f861d2c4f3b9b /encoding.c
parentc5851d1d6906e130bbb156d9ace962c59c8b0086 (diff)
* configure.in (enc/Makefile): add external encoding objects list.
* common.mk (BUILTIN_ENCOBJS): renamed from ENCOBJS. * Makefile.in (BUILTIN_ENCOBJS): substitued by autoconf. * enc/Makefile.in: new file to compile external encoding sources. * encoding.c (rb_enc_find_index): auto-load external encoding objects as "ext/ENCODING_NAME". [ruby-dev:32606] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@14238 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'encoding.c')
-rw-r--r--encoding.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/encoding.c b/encoding.c
index b2d9359694..325ee7a73b 100644
--- a/encoding.c
+++ b/encoding.c
@@ -155,7 +155,7 @@ enc_register(const char *name, rb_encoding *encoding)
}
static VALUE enc_based_encoding(VALUE);
-#define rb_enc_registered(name) rb_enc_find_index(name)
+int rb_enc_registered(const char *name);
int
rb_enc_register(const char *name, rb_encoding *encoding)
@@ -252,7 +252,7 @@ rb_enc_from_index(int index)
}
int
-rb_enc_find_index(const char *name)
+rb_enc_registered(const char *name)
{
int i;
st_data_t alias = 0;
@@ -278,6 +278,26 @@ rb_enc_find_index(const char *name)
return -1;
}
+static VALUE
+require_enc(VALUE enclib)
+{
+ return rb_require_safe(enclib, rb_safe_level());
+}
+
+int
+rb_enc_find_index(const char *name)
+{
+ int i = rb_enc_registered(name);
+ if (i < 0) {
+ VALUE enclib = rb_sprintf("enc/%s", name);
+ OBJ_FREEZE(enclib);
+ if (RTEST(rb_protect(require_enc, enclib, 0)))
+ i = rb_enc_registered(name);
+ rb_set_errinfo(Qnil);
+ }
+ return i;
+}
+
rb_encoding *
rb_enc_find(const char *name)
{