Tcl Source Code

Artifact [71abf4a36a]
Login

Artifact 71abf4a36a366b1da285a6f696e698d7ec2f6c61:

Attachment "main.patch" to ticket [1306162fff] added by dgp 2005-09-29 22:09:08.
Index: generic/tclMain.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclMain.c,v
retrieving revision 1.20
diff -u -r1.20 tclMain.c
--- generic/tclMain.c	29 May 2002 22:59:33 -0000	1.20
+++ generic/tclMain.c	29 Sep 2005 15:02:57 -0000
@@ -204,15 +204,12 @@
 				 * initialization but before starting to
 				 * execute commands. */
 {
-    Tcl_Obj *resultPtr;
-    Tcl_Obj *commandPtr = NULL;
-    char buffer[TCL_INTEGER_SPACE + 5], *args;
+    Tcl_Obj *resultPtr, *argvPtr, *commandPtr = NULL;
     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]);
 
@@ -233,28 +230,28 @@
 	}
     }
 
-    /*
-     * 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);
-
     if (TclGetStartupScriptPath() == NULL) {
-	Tcl_ExternalToUtfDString(NULL, argv[0], -1, &argString);
+	Tcl_ExternalToUtfDString(NULL, argv[0], -1, &appName);
     } else {
 	TclSetStartupScriptFileName(Tcl_ExternalToUtfDString(NULL,
-		TclGetStartupScriptFileName(), -1, &argString));
+		TclGetStartupScriptFileName(), -1, &appName));
     }
-
-    TclFormatInt(buffer, (long) argc-1);
-    Tcl_SetVar(interp, "argc", buffer, 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.
@@ -308,7 +305,6 @@
 	}
 	goto done;
     }
-    Tcl_DStringFree(&argString);
 
     /*
      * We're running interactively.  Source a user-specific startup
@@ -496,6 +492,7 @@
      */
 
     if (!Tcl_InterpDeleted(interp)) {
+	char buffer[TCL_INTEGER_SPACE + 5];
         sprintf(buffer, "exit %d", exitCode);
         Tcl_Eval(interp, buffer);