diff options
author | stanton <stanton> | 1999-05-14 02:18:31 (GMT) |
---|---|---|
committer | stanton <stanton> | 1999-05-14 02:18:31 (GMT) |
commit | a0ab2701b222435532aa1941280d76fbfef9a8eb (patch) | |
tree | bf323d5146956cc24306dbbb2993ea9e5ec4a1cf /unix | |
parent | d384504a71f7fc403210d9574f3e57af920036d1 (diff) | |
download | tcl-a0ab2701b222435532aa1941280d76fbfef9a8eb.zip tcl-a0ab2701b222435532aa1941280d76fbfef9a8eb.tar.gz tcl-a0ab2701b222435532aa1941280d76fbfef9a8eb.tar.bz2 |
* unix/Makefile.in:
* unix/tclAppInit.c: Minor cleanup related to Xt notifier.
* unix/tclUnixInit.c (TclpSetInitialEncodings): Tcl now looks for
an encoding subfield in the LANG/LC_ALL variables in cases where
the locale is not found in the locale table. Ensure that
setlocale() is called at least once so X11 will initialize
properly. Also, forces the LC_NUMERIC locale to be "C" so numeric
processing in scripts is not affected by the current locale
setting. [Bug: 1989]
Diffstat (limited to 'unix')
-rw-r--r-- | unix/Makefile.in | 35 | ||||
-rw-r--r-- | unix/tclAppInit.c | 7 | ||||
-rw-r--r-- | unix/tclUnixInit.c | 78 |
3 files changed, 100 insertions, 20 deletions
diff --git a/unix/Makefile.in b/unix/Makefile.in index 0992aa9..3babe19 100644 --- a/unix/Makefile.in +++ b/unix/Makefile.in @@ -5,7 +5,7 @@ # "autoconf" program (constructs like "@foo@" will get replaced in the # actual Makefile. # -# RCS: @(#) $Id: Makefile.in,v 1.24 1999/04/21 21:50:32 rjohnson Exp $ +# RCS: @(#) $Id: Makefile.in,v 1.25 1999/05/14 02:18:31 stanton Exp $ # Current Tcl version; used in various names. @@ -256,8 +256,8 @@ TCLSH_OBJS = tclAppInit.o TCLTEST_OBJS = tclTestInit.o tclTest.o tclTestObj.o tclTestProcBodyObj.o \ tclThreadTest.o tclUnixTest.o -XTTEST_OBJS = tclTest.o tclTestObj.o tclUnixTest.o tclXtNotify.o \ - tclXtTest.o xtTestInit.o +XTTEST_OBJS = xtTestInit.o tclTest.o tclTestObj.o tclTestProcBodyObj.o \ + tclThreadTest.o tclUnixTest.o tclXtNotify.o tclXtTest.o GENERIC_OBJS = regcomp.o regexec.o regfree.o regerror.o tclAlloc.o \ tclAsync.o tclBasic.o tclBinary.o \ @@ -425,12 +425,6 @@ tcltest: ${TCLTEST_OBJS} ${TCL_LIB_FILE} ${BUILD_DLTEST} ${CC} @LD_FLAGS@ ${TCLTEST_OBJS} @TCL_BUILD_LIB_SPEC@ ${LIBS} \ @TCL_LD_SEARCH_FLAGS@ -o tcltest -xttest: ${XTTEST_OBJS} ${GENERIC_OBJS} ${UNIX_OBJS} ${COMPAT_OBJS} \ - @DL_OBJS@ ${BUILD_DLTEST} - ${CC} ${XTTEST_OBJS} ${GENERIC_OBJS} ${UNIX_OBJS} ${COMPAT_OBJS} \ - @DL_OBJS@ @TCL_BUILD_LIB_SPEC@ ${LIBS} \ - @TCL_LD_SEARCH_FLAGS@ -lXt -o xttest - # Note, in the target below TCL_LIBRARY needs to be set or else # "make test" won't work in the case where the compilation directory @@ -652,8 +646,9 @@ xtTestInit.o: $(UNIX_DIR)/tclAppInit.c rm -f tclAppInit.sav; \ mv tclAppInit.o tclAppInit.sav; \ fi; - $(CC) -c $(CC_SWITCHES) -DTCL_TEST -DTCL_XT_TEST \ - $(UNIX_DIR)/tclAppInit.c + $(CC) -c $(CC_SWITCHES) \ + -DTCL_BUILDTIME_LIBRARY="\"${TCL_BUILDTIME_LIBRARY}\"" \ + -DTCL_TEST -DTCL_XT_TEST $(UNIX_DIR)/tclAppInit.c rm -f xtTestInit.o mv tclAppInit.o xtTestInit.o @if test -f tclAppInit.sav ; then \ @@ -923,6 +918,24 @@ tclUnixInit.o: $(UNIX_DIR)/tclUnixInit.c $(GENERIC_DIR)/tclInitScript.h tclConfi -DTCL_PACKAGE_PATH="\"${TCL_PACKAGE_PATH}\"" \ $(UNIX_DIR)/tclUnixInit.c +# The following targets are not completely general. They are provide +# purely for documentation purposes so people who are interested in +# the Xt based notifier can modify them to suit their own installation. + +xttest: ${XTTEST_OBJS} ${GENERIC_OBJS} ${UNIX_OBJS} ${COMPAT_OBJS} \ + @DL_OBJS@ ${BUILD_DLTEST} + ${CC} ${XTTEST_OBJS} ${GENERIC_OBJS} ${UNIX_OBJS} ${COMPAT_OBJS} \ + @DL_OBJS@ @TCL_BUILD_LIB_SPEC@ ${LIBS} \ + @TCL_LD_SEARCH_FLAGS@ -L/usr/openwin/lib -lXt -o xttest + +tclXtNotify.o: $(UNIX_DIR)/tclXtNotify.c + $(CC) -c $(CC_SWITCHES) -I/usr/openwin/include \ + $(UNIX_DIR)/tclXtNotify.c + +tclXtTest.o: $(UNIX_DIR)/tclXtTest.c + $(CC) -c $(CC_SWITCHES) -I/usr/openwin/include \ + $(UNIX_DIR)/tclXtTest.c + # compat binaries, these must be compiled for use in a shared library # even though they may be placed in a static executable or library. Since # they are included in both the tcl library and the stub library, they diff --git a/unix/tclAppInit.c b/unix/tclAppInit.c index b37189e..e452705 100644 --- a/unix/tclAppInit.c +++ b/unix/tclAppInit.c @@ -11,13 +11,9 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclAppInit.c,v 1.5 1999/04/16 00:48:03 stanton Exp $ + * RCS: @(#) $Id: tclAppInit.c,v 1.6 1999/05/14 02:18:32 stanton Exp $ */ -#ifdef TCL_XT_TEST -#include <X11/Intrinsic.h> -#endif - #include "tcl.h" /* @@ -44,6 +40,7 @@ extern int TclThread_Init _ANSI_ARGS_((Tcl_Interp *interp)); #endif /* TCL_TEST */ #ifdef TCL_XT_TEST +extern void XtToolkitInitialize _ANSI_ARGS_((void)); extern int Tclxttest_Init _ANSI_ARGS_((Tcl_Interp *interp)); #endif diff --git a/unix/tclUnixInit.c b/unix/tclUnixInit.c index 349b0ff..4d5f8c7 100644 --- a/unix/tclUnixInit.c +++ b/unix/tclUnixInit.c @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclUnixInit.c,v 1.14 1999/04/21 22:00:29 stanton Exp $ + * RCS: @(#) $Id: tclUnixInit.c,v 1.15 1999/05/14 02:18:32 stanton Exp $ */ #include "tclInt.h" @@ -46,6 +46,11 @@ static char defaultLibraryDir[sizeof(TCL_LIBRARY)+200] = TCL_LIBRARY; static char pkgPath[sizeof(TCL_PACKAGE_PATH)+200] = TCL_PACKAGE_PATH; +/* + * The following table is used to map from Unix locale strings to + * encoding files. + */ + typedef struct LocaleTable { CONST char *lang; CONST char *encoding; @@ -80,6 +85,10 @@ static CONST LocaleTable localeTable[] = { {"ko_KR.eucKR", "euc-kr"}, {"korean", "euc-kr"}, + {"ru", "iso8859-5"}, + {"ru_RU", "iso8859-5"}, + {"ru_SU", "iso8859-5"}, + {"zh", "cp936"}, {NULL, NULL} @@ -361,34 +370,94 @@ TclpSetInitialEncodings() int i; Tcl_Obj *pathPtr; char *langEnv; + Tcl_DString ds; /* - * Determine the current encoding from the LC_TYPE or LANG environment + * Determine the current encoding from the LC_* or LANG environment * variables. We previously used setlocale() to determine the locale, * but this does not work on some systems (e.g. Linux/i386 RH 5.0). */ - langEnv = getenv("LC_CTYPE"); + langEnv = getenv("LC_ALL"); if (langEnv == NULL || langEnv[0] == '\0') { + langEnv = getenv("LC_CTYPE"); + } + if (langEnv == NULL || langEnv[0] == '\0') { langEnv = getenv("LANG"); } if (langEnv == NULL || langEnv[0] == '\0') { langEnv = NULL; } - encoding = "iso8859-1"; + encoding = NULL; if (langEnv != NULL) { for (i = 0; localeTable[i].lang != NULL; i++) { if (strcmp(localeTable[i].lang, langEnv) == 0) { encoding = localeTable[i].encoding; + break; } } + /* + * There was no mapping in the locale table. If there is an + * encoding subfield, we can try to guess from that. + */ + + if (encoding == NULL) { + char *p; + for (p = langEnv; *p != '\0'; p++) { + if (*p == '.') { + p++; + break; + } + } + if (*p != '\0') { + Tcl_DString ds; + Tcl_DStringInit(&ds); + Tcl_DStringAppend(&ds, p, -1); + + encoding = Tcl_DStringValue(&ds); + Tcl_UtfToLower(Tcl_DStringValue(&ds)); + if (Tcl_SetSystemEncoding(NULL, encoding) == TCL_OK) { + Tcl_DStringFree(&ds); + goto resetPath; + } + Tcl_DStringFree(&ds); + encoding = NULL; + } + } + } + if (encoding == NULL) { + encoding = "iso8859-1"; } Tcl_SetSystemEncoding(NULL, encoding); /* + * Initialize the C library's locale subsystem. This is required + * for input methods to work properly on X11. Note that we need to + * retore the initial "C" locale so that Tcl can parse numbers + * properly. The side effect of setting the default locale should be to + * load any locale specific modules that are needed by X. + */ + + Tcl_DStringInit(&ds); + Tcl_DStringAppend(&ds, setlocale(LC_ALL, NULL), -1); + setlocale(LC_ALL, ""); + setlocale(LC_ALL, Tcl_DStringValue(&ds)); + Tcl_DStringFree(&ds); + + /* + * In case the initial locale is not "C", ensure that the numeric + * processing is done in "C" locale regardless. This is needed because + * Tcl relies on routines like strtod, but should not have locale + * dependent behavior. + */ + + setlocale(LC_NUMERIC, "C"); + + + /* * Until the system encoding was actually set, the library path was * actually in the native multi-byte encoding, and not really UTF-8 * as advertised. We cheated as follows: @@ -410,6 +479,7 @@ TclpSetInitialEncodings() * encoding. */ + resetPath: pathPtr = TclGetLibraryPath(); if (pathPtr != NULL) { int objc; |