⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tclunixinit.c

📁 tcl是工具命令语言
💻 C
📖 第 1 页 / 共 2 页
字号:
	else {	    fprintf(stderr, "setlocale returned NULL\n");	}#endif#endif /* HAVE_LANGINFO */	if (setSysEncCode != TCL_OK) {	    /*	     * Classic fallback check.  This tries a homebrew algorithm to	     * determine what encoding should be used based on env vars.	     */	    char *langEnv = getenv("LC_ALL");	    encoding = NULL;	    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;	    }	    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);			encoding = Tcl_DStringAppend(&ds, p, -1);			Tcl_UtfToLower(Tcl_DStringValue(&ds));			setSysEncCode = Tcl_SetSystemEncoding(NULL, encoding);			if (setSysEncCode != TCL_OK) {			    encoding = NULL;			}			Tcl_DStringFree(&ds);		    }		}#ifdef HAVE_LANGINFO_DEBUG		fprintf(stderr, "encoding fallback check '%s' => '%s'\n",			langEnv, encoding);#endif	    }	    if (setSysEncCode != TCL_OK) {		if (encoding == NULL) {		    encoding = TCL_DEFAULT_ENCODING;		}		Tcl_SetSystemEncoding(NULL, encoding);	    }	    /*	     * Initialize the C library's locale subsystem.  This is required	     * for input methods to work properly on X11.  We only do this for	     * LC_CTYPE because that's the necessary one, and we don't want to	     * affect LC_TIME here.  The side effect of setting the default	     * locale should be to load any locale specific modules that are	     * needed by X.  [BUG: 5422 3345 4236 2522 2521].	     * In HAVE_LANGINFO, this call is already done above.	     */#ifndef HAVE_LANGINFO	    setlocale(LC_CTYPE, "");#endif	}	/*	 * 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:	 *	 * 1. It was safe to allow the Tcl_SetSystemEncoding() call to 	 * append the ASCII chars that make up the encoding's filename to 	 * the names (in the native encoding) of directories in the library 	 * path, since all Unix multi-byte encodings have ASCII in the	 * beginning.	 *	 * 2. To open the encoding file, the native bytes in the file name	 * were passed to the OS, without translating from UTF-8 to native,	 * because the name was already in the native encoding.	 *	 * Now that the system encoding was actually successfully set,	 * translate all the names in the library path to UTF-8.  That way,	 * next time we search the library path, we'll translate the names 	 * from UTF-8 to the system encoding which will be the native 	 * encoding.	 */	pathPtr = TclGetLibraryPath();	if (pathPtr != NULL) {	    int objc;	    Tcl_Obj **objv;	    	    objc = 0;	    Tcl_ListObjGetElements(NULL, pathPtr, &objc, &objv);	    for (i = 0; i < objc; i++) {		int length;		char *string;		Tcl_DString ds;		string = Tcl_GetStringFromObj(objv[i], &length);		Tcl_ExternalToUtfDString(NULL, string, length, &ds);		Tcl_SetStringObj(objv[i], Tcl_DStringValue(&ds), 			Tcl_DStringLength(&ds));		Tcl_DStringFree(&ds);	    }	}	libraryPathEncodingFixed = 1;    }        /* This is only ever called from the startup thread */    if (binaryEncoding == NULL) {	/*	 * Keep the iso8859-1 encoding preloaded.  The IO package uses	 * it for gets on a binary channel.	 */	binaryEncoding = Tcl_GetEncoding(NULL, "iso8859-1");    }}/* *--------------------------------------------------------------------------- * * TclpSetVariables -- * *	Performs platform-specific interpreter initialization related to *	the tcl_library and tcl_platform variables, and other platform- *	specific things. * * Results: *	None. * * Side effects: *	Sets "tclDefaultLibrary", "tcl_pkgPath", and "tcl_platform" Tcl *	variables. * *---------------------------------------------------------------------- */voidTclpSetVariables(interp)    Tcl_Interp *interp;{#ifndef NO_UNAME    struct utsname name;#endif    int unameOK;    CONST char *user;    Tcl_DString ds;#ifdef HAVE_CFBUNDLE    char tclLibPath[MAXPATHLEN + 1];        if (Tcl_MacOSXGetLibraryPath(interp, MAXPATHLEN, tclLibPath) == TCL_OK) {        CONST char *str;        Tcl_DString ds;        CFBundleRef bundleRef;        Tcl_SetVar(interp, "tclDefaultLibrary", tclLibPath,                 TCL_GLOBAL_ONLY);        Tcl_SetVar(interp, "tcl_pkgPath", tclLibPath,                TCL_GLOBAL_ONLY);        Tcl_SetVar(interp, "tcl_pkgPath", " ",                TCL_GLOBAL_ONLY | TCL_APPEND_VALUE);        str = TclGetEnv("DYLD_FRAMEWORK_PATH", &ds);        if ((str != NULL) && (str[0] != '\0')) {            char *p = Tcl_DStringValue(&ds);            /* convert DYLD_FRAMEWORK_PATH from colon to space separated */            do {                if(*p == ':') *p = ' ';            } while (*p++);            Tcl_SetVar(interp, "tcl_pkgPath", Tcl_DStringValue(&ds),                    TCL_GLOBAL_ONLY | TCL_APPEND_VALUE);            Tcl_SetVar(interp, "tcl_pkgPath", " ",                    TCL_GLOBAL_ONLY | TCL_APPEND_VALUE);            Tcl_DStringFree(&ds);        }        if ((bundleRef = CFBundleGetMainBundle())) {            CFURLRef frameworksURL;            Tcl_StatBuf statBuf;            if((frameworksURL = CFBundleCopyPrivateFrameworksURL(bundleRef))) {                if(CFURLGetFileSystemRepresentation(frameworksURL, TRUE,                            tclLibPath, MAXPATHLEN) &&                        ! TclOSstat(tclLibPath, &statBuf) &&                        S_ISDIR(statBuf.st_mode)) {                    Tcl_SetVar(interp, "tcl_pkgPath", tclLibPath,                            TCL_GLOBAL_ONLY | TCL_APPEND_VALUE);                    Tcl_SetVar(interp, "tcl_pkgPath", " ",                            TCL_GLOBAL_ONLY | TCL_APPEND_VALUE);                }                CFRelease(frameworksURL);            }            if((frameworksURL = CFBundleCopySharedFrameworksURL(bundleRef))) {                if(CFURLGetFileSystemRepresentation(frameworksURL, TRUE,                            tclLibPath, MAXPATHLEN) &&                        ! TclOSstat(tclLibPath, &statBuf) &&                        S_ISDIR(statBuf.st_mode)) {                    Tcl_SetVar(interp, "tcl_pkgPath", tclLibPath,                            TCL_GLOBAL_ONLY | TCL_APPEND_VALUE);                    Tcl_SetVar(interp, "tcl_pkgPath", " ",                            TCL_GLOBAL_ONLY | TCL_APPEND_VALUE);                }                CFRelease(frameworksURL);            }        }        Tcl_SetVar(interp, "tcl_pkgPath", pkgPath,                TCL_GLOBAL_ONLY | TCL_APPEND_VALUE);    } else#endif /* HAVE_CFBUNDLE */    {        Tcl_SetVar(interp, "tclDefaultLibrary", defaultLibraryDir,                 TCL_GLOBAL_ONLY);        Tcl_SetVar(interp, "tcl_pkgPath", pkgPath, TCL_GLOBAL_ONLY);    }#ifdef DJGPP    Tcl_SetVar2(interp, "tcl_platform", "platform", "dos", TCL_GLOBAL_ONLY);#else    Tcl_SetVar2(interp, "tcl_platform", "platform", "unix", TCL_GLOBAL_ONLY);#endif    unameOK = 0;#ifndef NO_UNAME    if (uname(&name) >= 0) {	CONST char *native;		unameOK = 1;	native = Tcl_ExternalToUtfDString(NULL, name.sysname, -1, &ds);	Tcl_SetVar2(interp, "tcl_platform", "os", native, TCL_GLOBAL_ONLY);	Tcl_DStringFree(&ds);		/*	 * The following code is a special hack to handle differences in	 * the way version information is returned by uname.  On most	 * systems the full version number is available in name.release.	 * However, under AIX the major version number is in	 * name.version and the minor version number is in name.release.	 */	if ((strchr(name.release, '.') != NULL)		|| !isdigit(UCHAR(name.version[0]))) {	/* INTL: digit */	    Tcl_SetVar2(interp, "tcl_platform", "osVersion", name.release,		    TCL_GLOBAL_ONLY);	} else {	    Tcl_SetVar2(interp, "tcl_platform", "osVersion", name.version,		    TCL_GLOBAL_ONLY);	    Tcl_SetVar2(interp, "tcl_platform", "osVersion", ".",		    TCL_GLOBAL_ONLY|TCL_APPEND_VALUE);	    Tcl_SetVar2(interp, "tcl_platform", "osVersion", name.release,		    TCL_GLOBAL_ONLY|TCL_APPEND_VALUE);	}	Tcl_SetVar2(interp, "tcl_platform", "machine", name.machine,		TCL_GLOBAL_ONLY);    }#endif    if (!unameOK) {	Tcl_SetVar2(interp, "tcl_platform", "os", "", TCL_GLOBAL_ONLY);	Tcl_SetVar2(interp, "tcl_platform", "osVersion", "", TCL_GLOBAL_ONLY);	Tcl_SetVar2(interp, "tcl_platform", "machine", "", TCL_GLOBAL_ONLY);    }    /*     * Copy USER or LOGNAME environment variable into tcl_platform(user)     */    Tcl_DStringInit(&ds);    user = TclGetEnv("USER", &ds);    if (user == NULL) {	user = TclGetEnv("LOGNAME", &ds);	if (user == NULL) {	    user = "";	}    }    Tcl_SetVar2(interp, "tcl_platform", "user", user, TCL_GLOBAL_ONLY);    Tcl_DStringFree(&ds);}/* *---------------------------------------------------------------------- * * TclpFindVariable -- * *	Locate the entry in environ for a given name.  On Unix this  *	routine is case sensetive, on Windows this matches mixed case. * * Results: *	The return value is the index in environ of an entry with the *	name "name", or -1 if there is no such entry.   The integer at *	*lengthPtr is filled in with the length of name (if a matching *	entry is found) or the length of the environ array (if no matching *	entry is found). * * Side effects: *	None. * *---------------------------------------------------------------------- */intTclpFindVariable(name, lengthPtr)    CONST char *name;		/* Name of desired environment variable				 * (native). */    int *lengthPtr;		/* Used to return length of name (for				 * successful searches) or number of non-NULL				 * entries in environ (for unsuccessful				 * searches). */{    int i, result = -1;    register CONST char *env, *p1, *p2;    Tcl_DString envString;    Tcl_DStringInit(&envString);    for (i = 0, env = environ[i]; env != NULL; i++, env = environ[i]) {	p1 = Tcl_ExternalToUtfDString(NULL, env, -1, &envString);	p2 = name;	for (; *p2 == *p1; p1++, p2++) {	    /* NULL loop body. */	}	if ((*p1 == '=') && (*p2 == '\0')) {	    *lengthPtr = p2 - name;	    result = i;	    goto done;	}		Tcl_DStringFree(&envString);    }        *lengthPtr = i;    done:    Tcl_DStringFree(&envString);    return result;}/* *---------------------------------------------------------------------- * * Tcl_Init -- * *	This procedure is typically invoked by Tcl_AppInit procedures *	to find and source the "init.tcl" script, which should exist *	somewhere on the Tcl library path. * * Results: *	Returns a standard Tcl completion code and sets the interp's *	result if there is an error. * * Side effects: *	Depends on what's in the init.tcl script. * *---------------------------------------------------------------------- */intTcl_Init(interp)    Tcl_Interp *interp;		/* Interpreter to initialize. */{    Tcl_Obj *pathPtr;    if (tclPreInitScript != NULL) {	if (Tcl_Eval(interp, tclPreInitScript) == TCL_ERROR) {	    return (TCL_ERROR);	};    }        pathPtr = TclGetLibraryPath();    if (pathPtr == NULL) {	pathPtr = Tcl_NewObj();    }    Tcl_SetVar2Ex(interp, "tcl_libPath", NULL, pathPtr, TCL_GLOBAL_ONLY);    return Tcl_Eval(interp, initScript);}/* *---------------------------------------------------------------------- * * Tcl_SourceRCFile -- * *	This procedure is typically invoked by Tcl_Main of Tk_Main *	procedure to source an application specific rc file into the *	interpreter at startup time. * * Results: *	None. * * Side effects: *	Depends on what's in the rc script. * *---------------------------------------------------------------------- */voidTcl_SourceRCFile(interp)    Tcl_Interp *interp;		/* Interpreter to source rc file into. */{    Tcl_DString temp;    CONST char *fileName;    Tcl_Channel errChannel;    fileName = Tcl_GetVar(interp, "tcl_rcFileName", TCL_GLOBAL_ONLY);    if (fileName != NULL) {        Tcl_Channel c;	CONST char *fullName;        Tcl_DStringInit(&temp);	fullName = Tcl_TranslateFileName(interp, fileName, &temp);	if (fullName == NULL) {	    /*	     * Couldn't translate the file name (e.g. it referred to a	     * bogus user or there was no HOME environment variable).	     * Just do nothing.	     */	} else {	    /*	     * Test for the existence of the rc file before trying to read it.	     */            c = Tcl_OpenFileChannel(NULL, fullName, "r", 0);            if (c != (Tcl_Channel) NULL) {                Tcl_Close(NULL, c);		if (Tcl_EvalFile(interp, fullName) != TCL_OK) {		    errChannel = Tcl_GetStdChannel(TCL_STDERR);		    if (errChannel) {			Tcl_WriteObj(errChannel, Tcl_GetObjResult(interp));			Tcl_WriteChars(errChannel, "\n", 1);		    }		}	    }	}        Tcl_DStringFree(&temp);    }}/* *---------------------------------------------------------------------- * * TclpCheckStackSpace -- * *	Detect if we are about to blow the stack.  Called before an  *	evaluation can happen when nesting depth is checked. * * Results: *	1 if there is enough stack space to continue; 0 if not. * * Side effects: *	None. * *---------------------------------------------------------------------- */intTclpCheckStackSpace(){    /*     * This function is unimplemented on Unix platforms.     */    return 1;}#ifdef HAVE_CFBUNDLE/* *---------------------------------------------------------------------- * * Tcl_MacOSXGetLibraryPath -- * *	If we have a bundle structure for the Tcl installation, *	then check there first to see if we can find the libraries *	there. * * Results: *	TCL_OK if we have found the tcl library; TCL_ERROR otherwise. * * Side effects: *	Same as for Tcl_MacOSXOpenBundleResources. * *---------------------------------------------------------------------- */static int Tcl_MacOSXGetLibraryPath(Tcl_Interp *interp, int maxPathLen, char *tclLibPath){    int foundInFramework = TCL_ERROR;    if (strcmp(defaultLibraryDir, "@TCL_IN_FRAMEWORK@") == 0) {	foundInFramework = Tcl_MacOSXOpenBundleResources(interp, 	    "com.tcltk.tcllibrary", 0, maxPathLen, tclLibPath);    }    return foundInFramework;}#endif /* HAVE_CFBUNDLE */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -