Index: src/main.c ================================================================== --- src/main.c +++ src/main.c @@ -411,16 +411,10 @@ const char *zCmdName = "unknown"; int idx; int rc; int i; -#ifdef FOSSIL_ENABLE_TCL - g.tcl.argc = argc; - g.tcl.argv = argv; - g.tcl.interp = 0; -#endif - sqlite3_config(SQLITE_CONFIG_LOG, fossil_sqlite_log, 0); memset(&g, 0, sizeof(g)); g.now = time(0); g.argc = argc; g.argv = argv; @@ -436,22 +430,25 @@ g.json.outOpt = cson_output_opt_empty; g.json.outOpt.addNewline = 1; g.json.outOpt.indentation = 1 /* in CGI/server mode this can be configured */; #endif /* FOSSIL_ENABLE_JSON */ expand_args_option(); - argc = g.argc; - argv = g.argv; - for(i=0; i<argc; i++) g.argv[i] = fossil_mbcs_to_utf8(argv[i]); + for(i=0; i<g.argc; i++) g.argv[i] = fossil_mbcs_to_utf8(g.argv[i]); +#ifdef FOSSIL_ENABLE_TCL + g.tcl.argc = g.argc; + g.tcl.argv = g.argv; + g.tcl.interp = 0; +#endif if( fossil_getenv("GATEWAY_INTERFACE")!=0 && !find_option("nocgi", 0, 0)){ zCmdName = "cgi"; g.isHTTP = 1; - }else if( argc<2 ){ + }else if( g.argc<2 ){ fossil_print( "Usage: %s COMMAND ...\n" " or: %s help -- for a list of common commands\n" " or: %s help COMMMAND -- for help with the named command\n", - argv[0], argv[0], argv[0]); + g.argv[0], g.argv[0], g.argv[0]); fossil_exit(1); }else{ const char *zChdir = find_option("chdir",0,1); g.isHTTP = 0; g.fQuiet = find_option("quiet", 0, 0)!=0; @@ -469,13 +466,13 @@ if( find_option("help",0,0)!=0 ){ /* --help anywhere on the command line is translated into ** "fossil help argv[1] argv[2]..." */ int i; char **zNewArgv = fossil_malloc( sizeof(char*)*(g.argc+2) ); - for(i=1; i<g.argc; i++) zNewArgv[i+1] = argv[i]; + for(i=1; i<g.argc; i++) zNewArgv[i+1] = g.argv[i]; zNewArgv[i+1] = 0; - zNewArgv[0] = argv[0]; + zNewArgv[0] = g.argv[0]; zNewArgv[1] = "help"; g.argc++; g.argv = zNewArgv; } zCmdName = g.argv[1]; @@ -482,11 +479,11 @@ } rc = name_search(zCmdName, aCommand, count(aCommand), &idx); if( rc==1 ){ fossil_fatal("%s: unknown command: %s\n" "%s: use \"help\" for more information\n", - argv[0], zCmdName, argv[0]); + g.argv[0], zCmdName, g.argv[0]); }else if( rc==2 ){ int i, n; Blob couldbe; blob_zero(&couldbe); n = strlen(zCmdName); @@ -496,11 +493,11 @@ } } fossil_print("%s: ambiguous command prefix: %s\n" "%s: could be any of:%s\n" "%s: use \"help\" for more information\n", - argv[0], zCmdName, argv[0], blob_str(&couldbe), argv[0]); + g.argv[0], zCmdName, g.argv[0], blob_str(&couldbe), g.argv[0]); fossil_exit(1); } atexit( fossil_atexit ); aCommand[idx].xFunc(); fossil_exit(0); Index: src/th_tcl.c ================================================================== --- src/th_tcl.c +++ src/th_tcl.c @@ -389,13 +389,11 @@ return TH_ERROR; } if ( tclContext->interp ){ return TH_OK; } - if ( tclContext->argc>0 && tclContext->argv ) { - Tcl_FindExecutable(tclContext->argv[0]); - } + Tcl_FindExecutable(tclContext->argv[0]); tclInterp = tclContext->interp = Tcl_CreateInterp(); if( !tclInterp || Tcl_InterpDeleted(tclInterp) ){ Th_ErrorMessage(interp, "Could not create Tcl interpreter", (const char *)"", 0); return TH_ERROR; @@ -405,10 +403,20 @@ "Tcl initialization error:", Tcl_GetStringResult(tclInterp), -1); Tcl_DeleteInterp(tclInterp); tclContext->interp = tclInterp = 0; return TH_ERROR; } + if (tclContext->argc > 0) { + int argc = tclContext->argc - 1; + char **argv = tclContext->argv + 1; + Tcl_Obj *argvPtr = Tcl_NewListObj(0, NULL); + while (argc--) { + Tcl_ListObjAppendElement(NULL, argvPtr, Tcl_NewStringObj(*argv++, -1)); + } + Tcl_SetVar2Ex(tclContext->interp, "argv", NULL, argvPtr, TCL_GLOBAL_ONLY); + } + /* Add the TH1 integration commands to Tcl. */ Tcl_CallWhenDeleted(tclInterp, Th1DeleteProc, interp); Tcl_CreateObjCommand(tclInterp, "th1Eval", Th1EvalObjCmd, interp, NULL); Tcl_CreateObjCommand(tclInterp, "th1Expr", Th1ExprObjCmd, interp, NULL); return TH_OK;