From: Nobuyoshi Nakada Date: 2007-12-15T13:11:43+09:00 Subject: [ruby-dev:32606] encoding loading なかだです。 encodingを自動的にロードするようにするパッチです。 とりあえず enc/ENCODING というライブラリをrequireするようになっ ています。win32系は未対応ですが。 Index: configure.in =================================================================== --- configure.in (revision 14234) +++ configure.in (working copy) @@ -1204,4 +1247,5 @@ AC_DEFINE_UNQUOTED(DLEXT_MAXLEN, `expr $ test ".$DLEXT" = "." || AC_DEFINE_UNQUOTED(DLEXT, ".$DLEXT") test ".$DLEXT2" = "." || AC_DEFINE_UNQUOTED(DLEXT2, ".$DLEXT2") +AC_SUBST(DLEXT) AC_SUBST(STRIP)dnl @@ -1579,5 +1630,5 @@ AC_SUBST(MINIOBJS) AC_SUBST(THREAD_MODEL) -MAKEFILES="Makefile `echo $FIRSTMAKEFILE | sed 's/:.*//'`" +MAKEFILES="Makefile `echo $FIRSTMAKEFILE | sed 's/:.*//'` enc/GNUmakefile" MAKEFILES="`echo $MAKEFILES`" AC_SUBST(MAKEFILES) @@ -1735,5 +1786,34 @@ fi tr -d '\015' < largefile.h > confdefs.h +test -d enc || mkdir enc +BUILTIN_ENCS='ascii euc_jp sjis unicode utf8' +EXTERNAL_ENCS= +for e in "${srcdir}/enc"/*.c; do + e=`basename "$e" .c` + case " $BUILTIN_ENCS " in + *" $e "*) ;; + *) EXTERNAL_ENCS="$EXTERNAL_ENCS $e";; + esac +done +echo $EX +BUILTIN_ENCOBJS= +for e in $BUILTIN_ENCS; do BUILTIN_ENCOBJS="$BUILTIN_ENCOBJS $e"'.$(OBJEXT)'; done +EXTERNAL_ENCOBJS= +for e in $EXTERNAL_ENCS; do EXTERNAL_ENCOBJS="$EXTERNAL_ENCOBJS $e"'.$(OBJEXT)'; done +ENCSOS= +for e in $EXTERNAL_ENCS; do ENCSOS="$ENCSOS "'$(ENCSODIR)/'"$e"'.$(DLEXT)'; done + +AC_SUBST(BUILTIN_ENCOBJS) +AC_SUBST(EXTERNAL_ENCOBJS) +AC_SUBST(ENCSOS) + AC_CONFIG_FILES($FIRSTMAKEFILE) +AC_CONFIG_FILES(enc/Makefile, [{ + for e in $ENCS; do + echo '' + echo '$(ENCSODIR)/'"$e"'.$(DLEXT): '"$e"'.$(OBJEXT)' + echo ' $(LDSHARED) $(DLDFLAGS) $< $(OUTFLAG)$''@' + done >> enc/Makefile +}], [ENCS="$EXTERNAL_ENCS"]) AC_CONFIG_FILES(Makefile, [{ sed '/^MISSING/s/\$U\././g' Makefile Index: common.mk =================================================================== --- common.mk (revision 14234) +++ common.mk (working copy) @@ -19,10 +19,4 @@ RDOCOUT = $(EXTOUT)/rdoc DLDOBJS = $(DMYEXT) -ENCOBJS = ascii.$(OBJEXT) \ - euc_jp.$(OBJEXT) \ - sjis.$(OBJEXT) \ - unicode.$(OBJEXT) \ - utf8.$(OBJEXT) - COMMONOBJS = array.$(OBJEXT) \ bignum.$(OBJEXT) \ @@ -80,5 +73,5 @@ COMMONOBJS = array.$(OBJEXT) \ cont.$(OBJEXT) \ id.$(OBJEXT) \ - $(ENCOBJS) \ + $(BUILTIN_ENCOBJS) \ $(MISSING) Index: Makefile.in =================================================================== --- Makefile.in (revision 14234) +++ Makefile.in (working copy) @@ -52,4 +52,5 @@ SOLIBS = @SOLIBS@ MAINLIBS = @MAINLIBS@ MINIOBJS = @MINIOBJS@ miniprelude.$(OBJEXT) +BUILTIN_ENCOBJS = @BUILTIN_ENCOBJS@ RUBY_INSTALL_NAME=@RUBY_INSTALL_NAME@ @@ -94,4 +95,5 @@ ASFLAGS = @ASFLAGS@ OBJEXT = @OBJEXT@ ASMEXT = S +DLEXT = @DLEXT@ MANTYPE = @MANTYPE@ Index: enc/Makefile.in =================================================================== --- enc/Makefile.in (revision 0) +++ enc/Makefile.in (revision 0) @@ -0,0 +1,29 @@ +srcdir = @srcdir@ +top_srcdir = $(srcdir:/enc=) +arch = @arch@ +EXTOUT = $(top_srcdir)/@EXTOUT@ +hdrdir = $(top_srcdir)/include +arch_hdrdir = $(EXTOUT)/include/$(arch) +VPATH = $(arch_hdrdir)/ruby:$(hdrdir)/ruby:$(top_srcdir):$(srcdir) +ENCSODIR = $(EXTOUT)/$(arch)/enc +DLEXT = @DLEXT@ +OBJEXT = @OBJEXT@ + +ENCOBJS = @EXTERNAL_ENCOBJS@ +ENCSOS = @ENCSOS@ +empty = +CC = @CC@ +OUTFLAG = @OUTFLAG@$(empty) +CFLAGS = @CFLAGS@ @ARCH_FLAG@ +XCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir) -I$(top_srcdir) @XCFLAGS@ +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @STATIC@ $(CFLAGS) @LDFLAGS@ +XLDFLAGS = @XLDFLAGS@ $(EXTLDFLAGS) +LIBS = @LIBS@ $(EXTLIBS) +LDSHARED = @LDSHARED@ +DLDFLAGS = @DLDFLAGS@ $(EXTLDFLAGS) @ARCH_FLAG@ + +all: $(ENCOBJS) $(ENCSOS) + +.c.@OBJEXT@: + $(CC) $(CFLAGS) $(XCFLAGS) $(CPPFLAGS) -c $< Index: encoding.c =================================================================== --- encoding.c (revision 14234) +++ encoding.c (working copy) @@ -156,5 +156,5 @@ enc_register(const char *name, rb_encodi static VALUE enc_based_encoding(VALUE); -#define rb_enc_registered(name) rb_enc_find_index(name) +int rb_enc_registered(const char *name); int @@ -253,5 +253,5 @@ rb_enc_from_index(int index) int -rb_enc_find_index(const char *name) +rb_enc_registered(const char *name) { int i; @@ -279,4 +279,24 @@ rb_enc_find_index(const char *name) } +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) -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦