Attachment "main-85.patch" to
ticket [1306162fff]
added by
dgp
2005-09-29 22:10:00.
Index: generic/tclMain.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclMain.c,v
retrieving revision 1.32
diff -u -r1.32 tclMain.c
--- generic/tclMain.c 15 Sep 2005 16:40:02 -0000 1.32
+++ generic/tclMain.c 29 Sep 2005 14:47:28 -0000
@@ -339,17 +339,13 @@
* procedure to call after most initialization
* but before starting to execute commands. */
{
- Tcl_Obj *path;
- Tcl_Obj *resultPtr;
- Tcl_Obj *commandPtr = NULL;
+ Tcl_Obj *path, *resultPtr, *argvPtr, *commandPtr = NULL;
CONST char *encodingName = NULL;
- char *args;
PromptType prompt = PROMPT_START;
- int code, length, tty;
- int exitCode = 0;
+ int code, length, tty, exitCode = 0;
Tcl_Channel inChannel, outChannel, errChannel;
Tcl_Interp *interp;
- Tcl_DString argString;
+ Tcl_DString appName;
Tcl_FindExecutable(argv[0]);
@@ -383,31 +379,31 @@
}
}
- /*
- * The CONST casting is safe, and better we do it here than force all
- * callers of Tcl_Main to do it. (Those callers are likely in a main()
- * that can't easily change its signature.)
- */
-
- args = Tcl_Merge(argc-1, (CONST char **)argv+1);
- Tcl_ExternalToUtfDString(NULL, args, -1, &argString);
- Tcl_SetVar(interp, "argv", Tcl_DStringValue(&argString), TCL_GLOBAL_ONLY);
- Tcl_DStringFree(&argString);
- ckfree(args);
-
path = Tcl_GetStartupScript(&encodingName);
if (path == NULL) {
- Tcl_ExternalToUtfDString(NULL, argv[0], -1, &argString);
+ Tcl_ExternalToUtfDString(NULL, argv[0], -1, &appName);
} else {
CONST char *pathName = Tcl_GetStringFromObj(path, &length);
- Tcl_ExternalToUtfDString(NULL, pathName, length, &argString);
- path = Tcl_NewStringObj(Tcl_DStringValue(&argString), -1);
+ Tcl_ExternalToUtfDString(NULL, pathName, length, &appName);
+ path = Tcl_NewStringObj(Tcl_DStringValue(&appName), -1);
Tcl_SetStartupScript(path, encodingName);
}
-
- Tcl_SetVar2Ex(interp, "argc", NULL, Tcl_NewIntObj(argc-1),
- TCL_GLOBAL_ONLY);
- Tcl_SetVar(interp, "argv0", Tcl_DStringValue(&argString), TCL_GLOBAL_ONLY);
+ Tcl_SetVar(interp, "argv0", Tcl_DStringValue(&appName), TCL_GLOBAL_ONLY);
+ Tcl_DStringFree(&appName);
+ argc--;
+ argv++;
+
+ Tcl_SetVar2Ex(interp, "argc", NULL, Tcl_NewIntObj(argc), TCL_GLOBAL_ONLY);
+
+ argvPtr = Tcl_NewListObj(0, NULL);
+ while (argc--) {
+ Tcl_DString ds;
+ Tcl_ExternalToUtfDString(NULL, *argv++, -1, &ds);
+ Tcl_ListObjAppendElement(NULL, argvPtr, Tcl_NewStringObj(
+ Tcl_DStringValue(&ds), Tcl_DStringLength(&ds)));
+ Tcl_DStringFree(&ds);
+ }
+ Tcl_SetVar2Ex(interp, "argv", NULL, argvPtr, TCL_GLOBAL_ONLY);
/*
* Set the "tcl_interactive" variable.
@@ -466,7 +462,6 @@
}
goto done;
}
- Tcl_DStringFree(&argString);
/*
* We're running interactively. Source a user-specific startup file if the