From: AIDA S. <sh...@j1...> - 2003-07-12 20:18:09
|
相田です。 MacOS Xでスクロールバーを使えるように、libltdlに対応させてみました。実際にモジュールを ロードできるわけではなく、dlpreopenで誤魔化しただけですが、libtoolが対応してくれれば 本物のモジュールを使えます。 あと、UCSマッピングをローカライズする時に、システムのlocaleが取れない場合も、環境変数で 適切なマッピングを決めるようにしてくれませんか? diff -ru mlterm-2.7.0.orig/configure.in mlterm-2.7.0/configure.in --- mlterm-2.7.0.orig/configure.in Sat Jun 14 09:26:09 2003 +++ mlterm-2.7.0/configure.in Sun Jul 13 03:54:28 2003 @@ -25,6 +25,7 @@ AC_PROG_INSTALL AC_LIBTOOL_WIN32_DLL +AC_LIBTOOL_DLOPEN AC_ARG_WITH(libtool, [ --with-libtool libtool path[without]], libtool=$with_libtool) @@ -233,10 +234,14 @@ sample) MAKE_DIRS="scrollbar/sample ${MAKE_DIRS}" OUTPUT_FILES="scrollbar/sample/Makefile ${OUTPUT_FILES}" + MODULES='m4_foreach(Name, [sample,sample2], + [-dlopen $(top_builddir)/scrollbar/sample/lib[]Name.la ])'"${MODULES}" ;; extra) MAKE_DIRS="contrib/scrollbar/extra ${MAKE_DIRS}" OUTPUT_FILES="contrib/scrollbar/extra/Makefile ${OUTPUT_FILES}" + MODULES='m4_foreach(Name, [athena,motif,mozmodern,next], + [-dlopen $(top_builddir)/contrib/scrollbar/extra/lib[]Name.la ])'"${MODULES}" ;; *) echo "${scrollbar} is unknown scrollbar." @@ -249,6 +254,7 @@ AC_SUBST(MAKE_DIRS) AC_SUBST(OUTPUT_FILES) +AC_SUBST(MODULES) # gettext AM_INIT_AUTOMAKE(mlterm,2.7.0) diff -ru mlterm-2.7.0.orig/kiklib/configure.in mlterm-2.7.0/kiklib/configure.in --- mlterm-2.7.0.orig/kiklib/configure.in Sat May 10 03:47:46 2003 +++ mlterm-2.7.0/kiklib/configure.in Sun Jul 13 02:54:33 2003 @@ -12,6 +12,26 @@ AC_PROG_INSTALL AC_LIBTOOL_WIN32_DLL +AC_ARG_WITH(libltdl, + [ --with-libltdl[[=PREFIX]] load modules with libltdl[[without]]],, + [with_libltdl=no]) +if test "x$with_libltdl" != "xno" ; then + if test "x$with_libltdl" != "xyes"; then + LIBLTDL_CFLAGS="-I$with_libltdl/include" + kik_libltdl_libdir="-L$with_libltdl/lib" + fi + kik_ldflags_save="$LDFLAGS" + LDFLAGS="$LDFLAGS $kik_libltdl_libdir" + AC_CHECK_LIB(ltdl,lt_dlopen, + [LIBLTDL_LIBS="$kik_libltdl_libdir -lltdl"], + [AC_MSG_WARN([cannot find libltdl])]) + LDFLAGS="$kik_ldflags_save" + AC_DEFINE(USE_LIBLTDL) +fi +AC_SUBST(LIBLTDL_CFLAGS) +AC_SUBST(LIBLTDL_LIBS) +AC_SUBST(LIBLTDL_LDFLAGS) + AC_ARG_WITH(libtool, [ --with-libtool libtool path[without]], libtool=$with_libtool) @@ -133,6 +153,10 @@ # librarie name (cygwin: cygfoo.dll, darwin: libfoo.dylib, other: libfoo.so) # case ${target_os} in TODO: cross-compile support (sato) +if test "x$with_libltdl" != "xno"; then + LIB_PREFIX="lib" + LIB_SUFFIX=".la" +else case ${host_os} in cygwin*) LIB_PREFIX="cyg" @@ -147,6 +171,7 @@ LIB_SUFFIX=".so" ;; esac +fi AC_SUBST(LIB_PREFIX) AC_SUBST(LIB_SUFFIX) diff -ru mlterm-2.7.0.orig/kiklib/src/Makefile.in mlterm-2.7.0/kiklib/src/Makefile.in --- mlterm-2.7.0.orig/kiklib/src/Makefile.in Wed Jun 4 15:44:59 2003 +++ mlterm-2.7.0/kiklib/src/Makefile.in Thu Jul 10 23:59:40 2003 @@ -16,8 +16,9 @@ INSTALL = @INSTALL@ LIBTOOL = @LIBTOOL@ -CFLAGS = $(CFLAGS_LOCAL) @DEB_CFLAGS@ @CFLAGS@ @CPPFLAGS@ -DLIB_PREFIX=¥"@LIB_PREFIX@¥" -DLIB_SUFFIX=¥"@LIB_SUFFIX@¥" -LIBS = $(LIBS_LOCAL) @XPG4_LIBS@ @DL_LIBS@ @UTMPER_LIBS@ @LOGIN_LIBS@ +CFLAGS = $(CFLAGS_LOCAL) @DEB_CFLAGS@ @CFLAGS@ @CPPFLAGS@ @LIBLTDL_CFLAGS@ ¥ + -DLIB_PREFIX=¥"@LIB_PREFIX@¥" -DLIB_SUFFIX=¥"@LIB_SUFFIX@¥" +LIBS = $(LIBS_LOCAL) @XPG4_LIBS@ @DL_LIBS@ @UTMPER_LIBS@ @LOGIN_LIBS@ @LIBLTDL_LIBS@ COMOBJ = kik_debug.o kik_map.o kik_args.o kik_dlfcn.o kik_mem.o kik_conf.o kik_file.o kik_path.o ¥ kik_conf_io.o kik_str.o kik_cycle_index.o kik_langinfo.o kik_time.o kik_locale.o ¥ diff -ru mlterm-2.7.0.orig/kiklib/src/kik_config.h.in mlterm-2.7.0/kiklib/src/kik_config.h.in --- mlterm-2.7.0.orig/kiklib/src/kik_config.h.in Sun Jan 12 21:34:31 2003 +++ mlterm-2.7.0/kiklib/src/kik_config.h.in Thu Jul 10 23:10:35 2003 @@ -12,6 +12,8 @@ #undef HAVE_DLFCN_H +#undef USE_LIBLTDL + #undef HAVE_STRSEP #undef HAVE_FGETLN diff -ru mlterm-2.7.0.orig/kiklib/src/kik_dlfcn.c mlterm-2.7.0/kiklib/src/kik_dlfcn.c --- mlterm-2.7.0.orig/kiklib/src/kik_dlfcn.c Tue Jun 3 21:00:55 2003 +++ mlterm-2.7.0/kiklib/src/kik_dlfcn.c Sun Jul 13 02:58:18 2003 @@ -12,7 +12,48 @@ /* --- global functions --- */ -#if defined(HAVE_DL_H) +#if defined(USE_LIBLTDL) + +static int ltdl_ok = 0; + +kik_dl_handle_t +kik_dl_open( + char * dirpath , + char * name + ) +{ + char * path ; + + if (!ltdl_ok) + return NULL; + if( ( path = alloca( strlen( dirpath) + strlen( LIB_PREFIX) + strlen( name) + 1)) == NULL) + { + return NULL ; + } + + sprintf( path , "%s%s%s" , dirpath , LIB_PREFIX , name) ; + + return lt_dlopenext( path ) ; +} + +int +kik_dl_close( + kik_dl_handle_t handle + ) +{ + return lt_dlclose( handle) ; +} + +void * +kik_dl_func_symbol( + kik_dl_handle_t handle , + char * symbol + ) +{ + return lt_dlsym( handle , symbol) ; +} + +#elif defined(HAVE_DL_H) kik_dl_handle_t kik_dl_open( @@ -123,6 +164,41 @@ ) { return NULL ; +} + +#endif + +#ifdef USE_LIBLTDL + +int +kik_dl_init(void) +{ + const char *msg; + if (lt_dlinit()) + return 0; + ltdl_ok = 1; + return 1; +} + +void +kik_dl_exit(void) +{ + ltdl_ok = 0; + lt_dlexit(); /* ignore returned code */ +} + +#else + +int +kik_dl_init(void) +{ + return 1; +} + +void +kik_dl_exit(void) +{ + /* do nothing */ } #endif diff -ru mlterm-2.7.0.orig/kiklib/src/kik_dlfcn.h mlterm-2.7.0/kiklib/src/kik_dlfcn.h --- mlterm-2.7.0.orig/kiklib/src/kik_dlfcn.h Sun Apr 13 19:29:09 2003 +++ mlterm-2.7.0/kiklib/src/kik_dlfcn.h Sun Jul 13 03:07:03 2003 @@ -9,7 +9,21 @@ #include "kik_config.h" -#if defined(HAVE_DL_H) +#if defined(USE_LIBLTDL) + +#include <ltdl.h> + +typedef lt_dlhandle kik_dl_handle_t ; +/* + * We don't include this to kik_dl_init for maximum binary compatibility. + * Unfortunatelly dlpreopened modules must linked with main program + * to avoid duplicate of lt_preloaded_symbols. If you want to link + * them with your library you need to find another way. One way is explicit + * lt_dlpreload_default() invocation and peeking $lt_cv_dlopen. + */ +#define KIK_LTDL_SET_PRELOADED_SYMBOLS() LTDL_SET_PRELOADED_SYMBOLS() + +#elif defined(HAVE_DL_H) #include <dl.h> @@ -27,12 +41,19 @@ #endif +#ifndef KIK_LTDL_SET_PRELOADED_SYMBOLS +# define KIK_LTDL_SET_PRELOADED_SYMBOLS() +#endif kik_dl_handle_t kik_dl_open( char * dirpath , char * name) ; int kik_dl_close( kik_dl_handle_t handle) ; void * kik_dl_func_symbol( kik_dl_handle_t handle , char * symbol) ; + +int kik_dl_init(void) ; + +void kik_dl_exit(void) ; #endif diff -ru mlterm-2.7.0.orig/xwindow/Makefile.in mlterm-2.7.0/xwindow/Makefile.in --- mlterm-2.7.0.orig/xwindow/Makefile.in Wed Jun 4 15:45:01 2003 +++ mlterm-2.7.0/xwindow/Makefile.in Sun Jul 13 03:49:27 2003 @@ -28,6 +28,7 @@ LKIK = @KIK_LIBS@ LMKF = @MKF_LIBS@ +MODULES = @MODULES@ LMLTERM = ../mlterm/libmlterm.a LKIK_DEB = -lkik_deb LMKF_DEB = -lmkf_deb @@ -38,7 +39,7 @@ -DLIBEXECDIR=¥"$(LIBEXECDIR)¥" ¥ -I$(top_srcdir)/mlterm -I${top_builddir}/xwindow -I/usr/X11R6/include -I/usr/local/include -LIBS=$(LIBS_LOCAL) @IND_LIBS@ @FRIBIDI_LIBS@ @IMAGELIB_LIBS@ @AA_LIBS@ @X_EXTRA_LIBS@ ¥ +LIBS=$(LIBS_LOCAL) $(MODULES) @IND_LIBS@ @FRIBIDI_LIBS@ @IMAGELIB_LIBS@ @AA_LIBS@ @X_EXTRA_LIBS@ ¥ -lX11 $(LMLTERM) $(LMKF) $(LKIK) ¥ -L/usr/X11R6/lib -L/usr/local/lib -R/usr/X11R6/lib -R/usr/local/lib diff -ru mlterm-2.7.0.orig/xwindow/x_term_manager.c mlterm-2.7.0/xwindow/x_term_manager.c --- mlterm-2.7.0.orig/xwindow/x_term_manager.c Fri Jun 13 21:27:49 2003 +++ mlterm-2.7.0/xwindow/x_term_manager.c Fri Jul 11 00:15:26 2003 @@ -624,6 +624,7 @@ kik_msg_printf( "reporting unfreed memories --->¥n") ; kik_mem_free_all() ; #endif + kik_dl_exit(); if( un_file) { diff -ru mlterm-2.7.0.orig/mkf/lib/mkf_locale_ucs4_map.c mlterm-2.7.0/mkf/lib/mkf_locale_ucs4_map.c --- mlterm-2.7.0.orig/mkf/lib/mkf_locale_ucs4_map.c Sun Mar 30 22:20:19 2003 +++ mlterm-2.7.0/mkf/lib/mkf_locale_ucs4_map.c Wed Jul 9 07:16:13 2003 @@ -24,7 +24,8 @@ typedef struct map_ucs4_to_func_table { - char * locale ; + char * lang ; + char * country ; map_func_t func ; } map_ucs4_to_func_table_t ; @@ -41,16 +42,16 @@ */ static map_ucs4_to_func_table_t map_ucs4_to_func_table[] = { - { "ja" , mkf_map_ucs4_to_ja_jp } , - { "ko" , mkf_map_ucs4_to_ko_kr } , - { "ru" , mkf_map_ucs4_to_ru } , - { "uk" , mkf_map_ucs4_to_uk } , - { "tg" , mkf_map_ucs4_to_tg } , - { "vi" , mkf_map_ucs4_to_viet } , - { "zh_CN" , mkf_map_ucs4_to_zh_cn } , - { "zh_TW" , mkf_map_ucs4_to_zh_tw } , - { "zh_HK" , mkf_map_ucs4_to_zh_hk } , - { "zh" , mkf_map_ucs4_to_zh_cn } , + { "ja" , NULL , mkf_map_ucs4_to_ja_jp } , + { "ko" , NULL , mkf_map_ucs4_to_ko_kr } , + { "ru" , NULL , mkf_map_ucs4_to_ru } , + { "uk" , NULL , mkf_map_ucs4_to_uk } , + { "tg" , NULL , mkf_map_ucs4_to_tg } , + { "vi" , NULL , mkf_map_ucs4_to_viet } , + { "zh" , "CN" , mkf_map_ucs4_to_zh_cn } , + { "zh" , "TW" , mkf_map_ucs4_to_zh_tw } , + { "zh" , "HK" , mkf_map_ucs4_to_zh_hk } , + { "zh" , NULL , mkf_map_ucs4_to_zh_cn } , } ; @@ -60,17 +61,19 @@ get_map_ucs4_to_func_for_current_locale(void) { int count ; - char * locale ; + char * lang ; + char * country ; - locale = kik_get_locale() ; + lang = kik_get_lang() ; + country = kik_get_country() ; for( count = 0 ; count < sizeof( map_ucs4_to_func_table) / sizeof( map_ucs4_to_func_table[0]) ; count ++) { - if( strncmp( map_ucs4_to_func_table[count].locale , locale , - K_MIN( strlen( map_ucs4_to_func_table[count].locale) , - strlen( locale))) == 0) + map_ucs4_to_func_table_t * tablep = map_ucs4_to_func_table + count; + if( (!tablep->lang || !strcmp(tablep->lang, lang)) + && (!tablep->country || !strcmp(tablep->country, country))) { return map_ucs4_to_func_table[count].func ; } |