diff options
| author | dgp <dgp@users.sourceforge.net> | 2004-11-30 19:34:44 (GMT) | 
|---|---|---|
| committer | dgp <dgp@users.sourceforge.net> | 2004-11-30 19:34:44 (GMT) | 
| commit | 999c1d1867082cb366aeb7bb7d6f46f27ed40596 (patch) | |
| tree | 3f6ea55c8096d98ba728284819430a49be305cf6 /unix/tclUnixFile.c | |
| parent | f1608d9d16479048838c99d496b9f2812de574f2 (diff) | |
| download | tcl-999c1d1867082cb366aeb7bb7d6f46f27ed40596.zip tcl-999c1d1867082cb366aeb7bb7d6f46f27ed40596.tar.gz tcl-999c1d1867082cb366aeb7bb7d6f46f27ed40596.tar.bz2 | |
        Patch 976520 reworks several of the details involved with
        startup/initialization of the Tcl library, focused on the
        activities of Tcl_FindExecutable().
        * generic/tclIO.c:      Removed bogus claim in comment that
        encoding "iso8859-1" is "built-in" to Tcl.
        * generic/tclInt.h:     Created a new struct ProcessGlobalValue,
        * generic/tclUtil.c:    routines Tcl(Get|Set)ProcessGlobalValue,
        and function type TclInitProcessGlobalValueProc.  Together, these
        take care of the housekeeping for "values" (things that can be
        held in a Tcl_Obj) that are global across a whole process.  That is,
        they are shared among multiple threads, and epoch and mutex
        protection must govern the validity of cached copies maintained
        in each thread.
        * generic/tclNotify.c:  Modified TclInitNotifier() to tolerate
        being called multiple times in the same thread.
        * generic/tclEvent.c:   Dropped the unused argv0 argument to
        TclInitSubsystems().  Removed machinery to unsure only one
        TclInitNotifier() call per thread, now that that is safe.
        Converted Tcl(Get|Set)LibraryPath to use a ProcessGlobalValue,
        and moved them to tclEncoding.c.
        * generic/tclBasic.c:   Updated caller.
        * generic/tclInt.h:     TclpFindExecutable now returns void.
        * unix/tclUnixFile.c:
        * win/tclWinFile.c:
        * win/tclWinPipe.c:
        * generic/tclEncoding.c: Built new encoding search initialization
        on a foundation of ProcessGlobalValues, exposing new routines
        Tcl(Get|Set)EncodingSearchPath.  A cache of a map from encoding name
        to directory pathname keeps track of where encodings are available
        for loading.  Tcl_FindExecutable greatly simplified into just
        three function calls.  The "library path" is now misnamed, as its
        only remaining purpose is as a foundation for the default encoding
        search path.
        * generic/tclInterp.c:  Inlined the initScript that is evaluated
        by Tcl_Init().  Added verification after initScript evaluation
        that Tcl can find its installed *.enc files, and that it has
        initialized [encoding system] in agreement with what the environment
        expects.  [tclInit] no longer driven by the value of $::tcl_libPath;
        it largely constructs its own search path now, rather than attempt
        to share one with the encoding system.
        * unix/tclUnixInit.c:   TclpSetInitialEncodings factored so that a new
        * win/tclWinInit.c:     routine TclpGetEncodingNameFromEnvironment
        can reveal that Tcl thinks the [encoding system] should be, even
        when an incomplete encoding search path, or a missing *.enc file
        won't allow that initialization to succeed.  TclpInitLibraryPath
        reworked as an initializer of a ProcessGlobalValue.
        * unix/tclUnixTest.c:   Update implementations of [testfindexecutable],
        [testgetdefenc], and [testsetdefenc].
        * tests/unixInit.test:  Corrected tests to operate properly even
        when a value of TCL_LIBRARY is required to find encodings.
        * generic/tclInt.decls: New internal stubs: TclGetEncodingSearchPath,
        TclSetEncodingSearchPath, TclpGetEncodingNameFromEnvironment.  These
        are candidates for public exposure by future TIPs.
        * generic/tclIntDecls.h:        make genstubs
        * generic/tclStubInit.c:
        * generic/tclTest.c:    Updated [testencoding] to use
        * tests/encoding.test:  Tcl(Get|Set)EncodingSearchPath.  Updated tests.
Diffstat (limited to 'unix/tclUnixFile.c')
| -rw-r--r-- | unix/tclUnixFile.c | 41 | 
1 files changed, 23 insertions, 18 deletions
| diff --git a/unix/tclUnixFile.c b/unix/tclUnixFile.c index 842d1b6..421ea16 100644 --- a/unix/tclUnixFile.c +++ b/unix/tclUnixFile.c @@ -9,7 +9,7 @@   * See the file "license.terms" for information on usage and redistribution   * of this file, and for a DISCLAIMER OF ALL WARRANTIES.   * - * RCS: @(#) $Id: tclUnixFile.c,v 1.42 2004/10/07 14:50:23 vincentdarley Exp $ + * RCS: @(#) $Id: tclUnixFile.c,v 1.43 2004/11/30 19:34:51 dgp Exp $   */  #include "tclInt.h" @@ -42,7 +42,7 @@ static int NativeMatchType(CONST char* nativeName, Tcl_GlobTypeData *types);   *---------------------------------------------------------------------------   */ -char * +void  TclpFindExecutable(argv0)      CONST char *argv0;		/* The value of the application's argv[0]  				 * (native). */ @@ -50,13 +50,13 @@ TclpFindExecutable(argv0)      CONST char *name, *p;      Tcl_StatBuf statBuf;      int length; -    Tcl_DString buffer, nameString; +    Tcl_DString buffer, nameString, cwd;      if (argv0 == NULL) { -	return NULL; +	return;      }      if (tclFindExecutableSearchDone) { -	return tclNativeExecutableName; +	return;      }      tclFindExecutableSearchDone = 1; @@ -135,7 +135,7 @@ TclpFindExecutable(argv0)      goto done;      /* -     * If the name starts with "/" then just copy it to tclExecutableName. +     * If the name starts with "/" then just copy it to tclNativeExecutableName.       */  gotName: @@ -144,11 +144,9 @@ gotName:  #else      if (name[0] == '/')  {  #endif -	Tcl_ExternalToUtfDString(NULL, name, -1, &nameString);  	tclNativeExecutableName = (char *) -		ckalloc((unsigned) (Tcl_DStringLength(&nameString) + 1)); -	strcpy(tclNativeExecutableName, Tcl_DStringValue(&nameString)); -	Tcl_DStringFree(&nameString); +		ckalloc((unsigned int) strlen(name) + 1); +	strcpy(tclNativeExecutableName, name);  	goto done;      } @@ -162,22 +160,29 @@ gotName:  	name += 2;      } -    Tcl_ExternalToUtfDString(NULL, name, -1, &nameString); +    Tcl_DStringInit(&nameString); +    Tcl_DStringAppend(&nameString, name, -1); + +    TclpGetCwd(NULL, &cwd);      Tcl_DStringFree(&buffer); -    TclpGetCwd(NULL, &buffer); +    Tcl_UtfToExternalDString(NULL, Tcl_DStringValue(&cwd), +	    Tcl_DStringLength(&cwd), &buffer); +    if (Tcl_DStringValue(&cwd)[Tcl_DStringLength(&cwd) -1] != '/') { +	Tcl_DStringAppend(&buffer, "/", 1); +    } +    Tcl_DStringFree(&cwd); +    Tcl_DStringAppend(&buffer, Tcl_DStringValue(&nameString), +	    Tcl_DStringLength(&nameString)); +    Tcl_DStringFree(&nameString); -    length = Tcl_DStringLength(&buffer) + Tcl_DStringLength(&nameString) + 2; +    length = Tcl_DStringLength(&buffer) + 1;      tclNativeExecutableName = (char *) ckalloc((unsigned) length);      strcpy(tclNativeExecutableName, Tcl_DStringValue(&buffer)); -    tclNativeExecutableName[Tcl_DStringLength(&buffer)] = '/'; -    strcpy(tclNativeExecutableName + Tcl_DStringLength(&buffer) + 1, -	    Tcl_DStringValue(&nameString)); -    Tcl_DStringFree(&nameString);  done:      Tcl_DStringFree(&buffer); -    return tclNativeExecutableName; +    Tcl_GetNameOfExecutable();  }  /* | 
