diff options
Diffstat (limited to 'generic/tclMain.c')
-rw-r--r-- | generic/tclMain.c | 415 |
1 files changed, 214 insertions, 201 deletions
diff --git a/generic/tclMain.c b/generic/tclMain.c index 7a19a38..7caadd1 100644 --- a/generic/tclMain.c +++ b/generic/tclMain.c @@ -11,10 +11,22 @@ * this file, and for a DISCLAIMER OF ALL WARRANTIES. */ -#include "tclInt.h" +/** + * On Windows, this file needs to be compiled twice, once with + * TCL_ASCII_MAIN defined. This way both Tcl_Main and Tcl_MainExW + * can be implemented, sharing the same source code. + */ +#if defined(TCL_ASCII_MAIN) +# ifdef UNICODE +# undef UNICODE +# undef _UNICODE +# else +# define UNICODE +# define _UNICODE +# endif +#endif -#undef TCL_STORAGE_CLASS -#define TCL_STORAGE_CLASS DLLEXPORT +#include "tclInt.h" /* * The default prompt used when the user has not overridden it. @@ -23,6 +35,36 @@ #define DEFAULT_PRIMARY_PROMPT "% " /* + * This file can be compiled on Windows in UNICODE mode, as well as + * on all other platforms using the native encoding. This is done + * by using the normal Windows functions like _tcscmp, but on + * platforms which don't have <tchar.h> we have to translate that + * to strcmp here. + */ +#ifndef __WIN32__ +# define TCHAR char +# define TEXT(arg) arg +# define _tcscmp strcmp +# define _tcslen strlen +# define _tcsncmp strncmp +#endif + +/* + * Further on, in UNICODE mode, we need to use functions like + * Tcl_GetUnicodeFromObj, while otherwise Tcl_GetStringFromObj + * is needed. Those macro's assure that the right functions + * are used depending on the mode. + */ +#ifndef UNICODE +# undef Tcl_GetUnicodeFromObj +# define Tcl_GetUnicodeFromObj Tcl_GetStringFromObj +# undef Tcl_NewUnicodeObj +# define Tcl_NewUnicodeObj Tcl_NewStringObj +# undef Tcl_WinTCharToUtf +# define Tcl_WinTCharToUtf(a,b,c) Tcl_ExternalToUtfDString(NULL,a,b,c) +#endif /* !UNICODE */ + +/* * Declarations for various library functions and variables (don't want to * include tclPort.h here, because people might copy this file out of the Tcl * source directory to make their own modified versions). @@ -30,9 +72,20 @@ extern CRTIMPORT int isatty(int fd); -static Tcl_Obj *tclStartupScriptPath = NULL; -static Tcl_Obj *tclStartupScriptEncoding = NULL; -static Tcl_MainLoopProc *mainLoopProc = NULL; +/* + * The thread-local variables for this file's functions. + */ + +typedef struct { + Tcl_Obj *path; /* The filename of the script for *_Main() + * routines to [source] as a startup script, + * or NULL for none set, meaning enter + * interactive mode. */ + Tcl_Obj *encoding; /* The encoding of the startup script file. */ + Tcl_MainLoopProc *mainLoopProc; + /* Any installed main loop handler. The main + * extension that installs these is Tk. */ +} ThreadSpecificData; /* * Structure definition for information used to keep the state of an @@ -63,9 +116,12 @@ typedef struct InteractiveState { * Forward declarations for functions defined later in this file. */ +MODULE_SCOPE Tcl_MainLoopProc *TclGetMainLoop(void); static void Prompt(Tcl_Interp *interp, PromptType *promptPtr); static void StdinProc(ClientData clientData, int mask); +#ifndef TCL_ASCII_MAIN +static Tcl_ThreadDataKey dataKey; /* *---------------------------------------------------------------------- * @@ -85,27 +141,29 @@ static void StdinProc(ClientData clientData, int mask); void Tcl_SetStartupScript( Tcl_Obj *path, /* Filesystem path of startup script file */ - CONST char *encoding) /* Encoding of the data in that file */ + const char *encoding) /* Encoding of the data in that file */ { + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); Tcl_Obj *newEncoding = NULL; + if (encoding != NULL) { newEncoding = Tcl_NewStringObj(encoding, -1); } - if (tclStartupScriptPath != NULL) { - Tcl_DecrRefCount(tclStartupScriptPath); + if (tsdPtr->path != NULL) { + Tcl_DecrRefCount(tsdPtr->path); } - tclStartupScriptPath = path; - if (tclStartupScriptPath != NULL) { - Tcl_IncrRefCount(tclStartupScriptPath); + tsdPtr->path = path; + if (tsdPtr->path != NULL) { + Tcl_IncrRefCount(tsdPtr->path); } - if (tclStartupScriptEncoding != NULL) { - Tcl_DecrRefCount(tclStartupScriptEncoding); + if (tsdPtr->encoding != NULL) { + Tcl_DecrRefCount(tsdPtr->encoding); } - tclStartupScriptEncoding = newEncoding; - if (tclStartupScriptEncoding != NULL) { - Tcl_IncrRefCount(tclStartupScriptEncoding); + tsdPtr->encoding = newEncoding; + if (tsdPtr->encoding != NULL) { + Tcl_IncrRefCount(tsdPtr->encoding); } } @@ -121,131 +179,31 @@ Tcl_SetStartupScript( * The path of the startup script; NULL if none has been set. * * Side effects: - * If encodingPtr is not NULL, stores a (CONST char *) in it pointing to - * the encoding name registered for the startup script. Tcl retains - * ownership of the string, and may free it. Caller should make a copy - * for long-term use. + * If encodingPtr is not NULL, stores a (const char *) in it pointing to + * the encoding name registered for the startup script. Tcl retains + * ownership of the string, and may free it. Caller should make a copy + * for long-term use. * *---------------------------------------------------------------------- */ Tcl_Obj * Tcl_GetStartupScript( - CONST char **encodingPtr) /* When not NULL, points to storage for the - * (CONST char *) that points to the + const char **encodingPtr) /* When not NULL, points to storage for the + * (const char *) that points to the * registered encoding name for the startup - * script */ + * script. */ { + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + if (encodingPtr != NULL) { - if (tclStartupScriptEncoding == NULL) { + if (tsdPtr->encoding == NULL) { *encodingPtr = NULL; } else { - *encodingPtr = Tcl_GetString(tclStartupScriptEncoding); + *encodingPtr = Tcl_GetString(tsdPtr->encoding); } } - return tclStartupScriptPath; -} - -/* - *---------------------------------------------------------------------- - * - * TclSetStartupScriptPath -- - * - * Primes the startup script VFS path, used to override the command line - * processing. - * - * Results: - * None. - * - * Side effects: - * This function initializes the VFS path of the Tcl script to run at - * startup. - * - *---------------------------------------------------------------------- - */ - -void -TclSetStartupScriptPath( - Tcl_Obj *path) -{ - Tcl_SetStartupScript(path, NULL); -} - -/* - *---------------------------------------------------------------------- - * - * TclGetStartupScriptPath -- - * - * Gets the startup script VFS path, used to override the command line - * processing. - * - * Results: - * The startup script VFS path, NULL if none has been set. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -Tcl_Obj * -TclGetStartupScriptPath(void) -{ - return Tcl_GetStartupScript(NULL); -} - -/* - *---------------------------------------------------------------------- - * - * TclSetStartupScriptFileName -- - * - * Primes the startup script file name, used to override the command line - * processing. - * - * Results: - * None. - * - * Side effects: - * This function initializes the file name of the Tcl script to run at - * startup. - * - *---------------------------------------------------------------------- - */ - -void -TclSetStartupScriptFileName( - CONST char *fileName) -{ - Tcl_Obj *path = Tcl_NewStringObj(fileName,-1); - Tcl_SetStartupScript(path, NULL); -} - -/* - *---------------------------------------------------------------------- - * - * TclGetStartupScriptFileName -- - * - * Gets the startup script file name, used to override the command line - * processing. - * - * Results: - * The startup script file name, NULL if none has been set. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -CONST char * -TclGetStartupScriptFileName(void) -{ - Tcl_Obj *path = Tcl_GetStartupScript(NULL); - - if (path == NULL) { - return NULL; - } - return Tcl_GetString(path); + return tsdPtr->path; } /*---------------------------------------------------------------------- @@ -270,13 +228,13 @@ Tcl_SourceRCFile( Tcl_Interp *interp) /* Interpreter to source rc file into. */ { Tcl_DString temp; - CONST char *fileName; + const char *fileName; Tcl_Channel errChannel; fileName = Tcl_GetVar(interp, "tcl_rcFileName", TCL_GLOBAL_ONLY); if (fileName != NULL) { Tcl_Channel c; - CONST char *fullName; + const char *fullName; Tcl_DStringInit(&temp); fullName = Tcl_TranslateFileName(interp, fileName, &temp); @@ -292,24 +250,25 @@ Tcl_SourceRCFile( */ c = Tcl_OpenFileChannel(NULL, fullName, "r", 0); - if (c != (Tcl_Channel) NULL) { + if (c != 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); } } +#endif /* !TCL_ASCII_MAIN */ /*---------------------------------------------------------------------- * - * Tcl_Main -- + * Tcl_Main, Tcl_MainEx -- * * Main program for tclsh and most other Tcl-based applications. * @@ -326,25 +285,23 @@ Tcl_SourceRCFile( */ void -Tcl_Main( +Tcl_MainEx( int argc, /* Number of arguments. */ - char **argv, /* Array of argument strings. */ - Tcl_AppInitProc *appInitProc) + TCHAR **argv, /* Array of argument strings. */ + Tcl_AppInitProc *appInitProc, /* Application-specific initialization * function to call after most initialization * but before starting to execute commands. */ + Tcl_Interp *interp) { Tcl_Obj *path, *resultPtr, *argvPtr, *commandPtr = NULL; - CONST char *encodingName = NULL; + const char *encodingName = NULL; PromptType prompt = PROMPT_START; int code, length, tty, exitCode = 0; + Tcl_MainLoopProc *mainLoopProc; Tcl_Channel inChannel, outChannel, errChannel; - Tcl_Interp *interp; Tcl_DString appName; - Tcl_FindExecutable(argv[0]); - - interp = Tcl_CreateInterp(); Tcl_InitMemory(interp); /* @@ -354,21 +311,22 @@ Tcl_Main( */ if (NULL == Tcl_GetStartupScript(NULL)) { - /* * Check whether first 3 args (argv[1] - argv[3]) look like - * -encoding ENCODING FILENAME + * -encoding ENCODING FILENAME * or like - * FILENAME + * FILENAME */ - if ((argc > 3) && (0 == strcmp("-encoding", argv[1])) - && ('-' != argv[3][0])) { - Tcl_SetStartupScript(Tcl_NewStringObj(argv[3], -1), argv[2]); + if ((argc > 3) && (0 == _tcscmp(TEXT("-encoding"), argv[1])) + && (TEXT('-') != argv[3][0])) { + Tcl_Obj *value = Tcl_NewUnicodeObj(argv[2], -1); + Tcl_SetStartupScript(Tcl_NewUnicodeObj(argv[3], -1), Tcl_GetString(value)); + Tcl_DecrRefCount(value); argc -= 3; argv += 3; - } else if ((argc > 1) && ('-' != argv[1][0])) { - Tcl_SetStartupScript(Tcl_NewStringObj(argv[1], -1), NULL); + } else if ((argc > 1) && (TEXT('-') != argv[1][0])) { + Tcl_SetStartupScript(Tcl_NewUnicodeObj(argv[1], -1), NULL); argc--; argv++; } @@ -376,10 +334,11 @@ Tcl_Main( path = Tcl_GetStartupScript(&encodingName); if (path == NULL) { - Tcl_ExternalToUtfDString(NULL, argv[0], -1, &appName); + Tcl_WinTCharToUtf(argv[0], -1, &appName); } else { - CONST char *pathName = Tcl_GetStringFromObj(path, &length); - Tcl_ExternalToUtfDString(NULL, pathName, length, &appName); + const TCHAR *pathName = Tcl_GetUnicodeFromObj(path, &length); + + Tcl_WinTCharToUtf(pathName, length * sizeof(TCHAR), &appName); path = Tcl_NewStringObj(Tcl_DStringValue(&appName), -1); Tcl_SetStartupScript(path, encodingName); } @@ -393,7 +352,8 @@ Tcl_Main( argvPtr = Tcl_NewListObj(0, NULL); while (argc--) { Tcl_DString ds; - Tcl_ExternalToUtfDString(NULL, *argv++, -1, &ds); + + Tcl_WinTCharToUtf(*argv++, -1, &ds); Tcl_ListObjAppendElement(NULL, argvPtr, Tcl_NewStringObj( Tcl_DStringValue(&ds), Tcl_DStringLength(&ds))); Tcl_DStringFree(&ds); @@ -412,8 +372,8 @@ Tcl_Main( * Invoke application-specific initialization. */ - Tcl_Preserve((ClientData) interp); - if ((*appInitProc)(interp) != TCL_OK) { + Tcl_Preserve(interp); + if (appInitProc(interp) != TCL_OK) { errChannel = Tcl_GetStdChannel(TCL_STDERR); if (errChannel) { Tcl_WriteChars(errChannel, @@ -485,7 +445,8 @@ Tcl_Main( Tcl_LinkVar(interp, "tcl_interactive", (char *) &tty, TCL_LINK_BOOLEAN); inChannel = Tcl_GetStdChannel(TCL_STDIN); outChannel = Tcl_GetStdChannel(TCL_STDOUT); - while ((inChannel != (Tcl_Channel) NULL) && !Tcl_InterpDeleted(interp)) { + while ((inChannel != NULL) && !Tcl_InterpDeleted(interp)) { + mainLoopProc = TclGetMainLoop(); if (mainLoopProc == NULL) { if (tty) { Prompt(interp, &prompt); @@ -496,7 +457,7 @@ Tcl_Main( break; } inChannel = Tcl_GetStdChannel(TCL_STDIN); - if (inChannel == (Tcl_Channel) NULL) { + if (inChannel == NULL) { break; } } @@ -510,10 +471,10 @@ Tcl_Main( if (Tcl_InputBlocked(inChannel)) { /* * This can only happen if stdin has been set to - * non-blocking. In that case cycle back and try again. + * non-blocking. In that case cycle back and try again. * This sets up a tight polling loop (since we have no - * event loop running). If this causes bad CPU hogging, - * we might try toggling the blocking on stdin instead. + * event loop running). If this causes bad CPU hogging, we + * might try toggling the blocking on stdin instead. */ continue; @@ -527,9 +488,9 @@ Tcl_Main( } /* - * Add the newline removed by Tcl_GetsObj back to the string. - * Have to add it back before testing completeness, because - * it can make a difference. [Bug 1775878]. + * Add the newline removed by Tcl_GetsObj back to the string. Have + * to add it back before testing completeness, because it can make + * a difference. [Bug 1775878] */ if (Tcl_IsShared(commandPtr)) { @@ -544,10 +505,12 @@ Tcl_Main( } prompt = PROMPT_START; + /* - * The final newline is syntactically redundant, and causes - * some error messages troubles deeper in, so lop it back off. + * The final newline is syntactically redundant, and causes some + * error messages troubles deeper in, so lop it back off. */ + Tcl_GetStringFromObj(commandPtr, &length); Tcl_SetObjLength(commandPtr, --length); code = Tcl_RecordAndEvalObj(interp, commandPtr, TCL_EVAL_GLOBAL); @@ -562,7 +525,7 @@ Tcl_Main( Tcl_WriteObj(errChannel, Tcl_GetObjResult(interp)); Tcl_WriteChars(errChannel, "\n", 1); } - } else if (tty) { + } else if (tty) { resultPtr = Tcl_GetObjResult(interp); Tcl_IncrRefCount(resultPtr); Tcl_GetStringFromObj(resultPtr, &length); @@ -586,7 +549,7 @@ Tcl_Main( Prompt(interp, &prompt); } isPtr = (InteractiveState *) - ckalloc((int) sizeof(InteractiveState)); + ckalloc(sizeof(InteractiveState)); isPtr->input = inChannel; isPtr->tty = tty; isPtr->commandPtr = commandPtr; @@ -594,15 +557,15 @@ Tcl_Main( isPtr->interp = interp; Tcl_UnlinkVar(interp, "tcl_interactive"); - Tcl_LinkVar(interp, "tcl_interactive", (char *) &(isPtr->tty), + Tcl_LinkVar(interp, "tcl_interactive", (char *) &isPtr->tty, TCL_LINK_BOOLEAN); Tcl_CreateChannelHandler(inChannel, TCL_READABLE, StdinProc, - (ClientData) isPtr); + isPtr); } - (*mainLoopProc)(); - mainLoopProc = NULL; + mainLoopProc(); + Tcl_SetMainLoop(NULL); if (inChannel) { tty = isPtr->tty; @@ -611,11 +574,10 @@ Tcl_Main( TCL_LINK_BOOLEAN); prompt = isPtr->prompt; commandPtr = isPtr->commandPtr; - if (isPtr->input != (Tcl_Channel) NULL) { - Tcl_DeleteChannelHandler(isPtr->input, StdinProc, - (ClientData) isPtr); + if (isPtr->input != NULL) { + Tcl_DeleteChannelHandler(isPtr->input, StdinProc, isPtr); } - ckfree((char *)isPtr); + ckfree((char *) isPtr); } inChannel = Tcl_GetStdChannel(TCL_STDIN); outChannel = Tcl_GetStdChannel(TCL_STDOUT); @@ -629,13 +591,14 @@ Tcl_Main( */ if (tclMemDumpFileName != NULL) { - mainLoopProc = NULL; + Tcl_SetMainLoop(NULL); Tcl_DeleteInterp(interp); } #endif } done: + mainLoopProc = TclGetMainLoop(); if ((exitCode == 0) && (mainLoopProc != NULL) && !Tcl_LimitExceeded(interp)) { /* @@ -644,8 +607,8 @@ Tcl_Main( * this point. */ - (*mainLoopProc)(); - mainLoopProc = NULL; + mainLoopProc(); + Tcl_SetMainLoop(NULL); } if (commandPtr != NULL) { Tcl_DecrRefCount(commandPtr); @@ -660,6 +623,7 @@ Tcl_Main( if (!Tcl_InterpDeleted(interp)) { if (!Tcl_LimitExceeded(interp)) { Tcl_Obj *cmd = Tcl_ObjPrintf("exit %d", exitCode); + Tcl_IncrRefCount(cmd); Tcl_EvalObjEx(interp, cmd, TCL_EVAL_GLOBAL); Tcl_DecrRefCount(cmd); @@ -683,10 +647,27 @@ Tcl_Main( * destruction with the last matching Tcl_Release. */ - Tcl_Release((ClientData) interp); + Tcl_Release(interp); Tcl_Exit(exitCode); } + +#ifndef UNICODE +void +Tcl_Main( + int argc, /* Number of arguments. */ + TCHAR **argv, /* Array of argument strings. */ + Tcl_AppInitProc *appInitProc) + /* Application-specific initialization + * function to call after most initialization + * but before starting to execute commands. */ +{ + Tcl_FindExecutable(argv[0]); + Tcl_MainEx(argc, argv, appInitProc, Tcl_CreateInterp()); +} +#endif +#ifndef TCL_ASCII_MAIN + /* *--------------------------------------------------------------- * @@ -695,7 +676,7 @@ Tcl_Main( * Sets an alternative main loop function. * * Results: - * Returns the previously defined main loop function. + * None. * * Side effects: * This function will be called before Tcl exits, allowing for the @@ -708,10 +689,40 @@ void Tcl_SetMainLoop( Tcl_MainLoopProc *proc) { - mainLoopProc = proc; + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + + tsdPtr->mainLoopProc = proc; } /* + *--------------------------------------------------------------- + * + * TclGetMainLoop -- + * + * Returns the current alternative main loop function. + * + * Results: + * Returns the previously defined main loop function, or NULL to indicate + * that no such function has been installed and standard tclsh behaviour + * (i.e., exit once the script is evaluated if not interactive) is + * requested.. + * + * Side effects: + * None (other than possible creation of this file's TSD block). + * + *--------------------------------------------------------------- + */ + +Tcl_MainLoopProc * +TclGetMainLoop(void) +{ + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + + return tsdPtr->mainLoopProc; +} +#endif /* !TCL_ASCII_MAIN */ + +/* *---------------------------------------------------------------------- * * StdinProc -- @@ -736,7 +747,7 @@ StdinProc( ClientData clientData, /* The state of interactive cmd line */ int mask) /* Not used. */ { - InteractiveState *isPtr = (InteractiveState *) clientData; + InteractiveState *isPtr = clientData; Tcl_Channel chan = isPtr->input; Tcl_Obj *commandPtr = isPtr->commandPtr; Tcl_Interp *interp = isPtr->interp; @@ -761,7 +772,7 @@ StdinProc( Tcl_Exit(0); } - Tcl_DeleteChannelHandler(chan, StdinProc, (ClientData) isPtr); + Tcl_DeleteChannelHandler(chan, StdinProc, isPtr); return; } @@ -786,28 +797,29 @@ StdinProc( * things, this will trash the text of the command being evaluated. */ - Tcl_CreateChannelHandler(chan, 0, StdinProc, (ClientData) isPtr); + Tcl_CreateChannelHandler(chan, 0, StdinProc, isPtr); code = Tcl_RecordAndEvalObj(interp, commandPtr, TCL_EVAL_GLOBAL); isPtr->input = chan = Tcl_GetStdChannel(TCL_STDIN); Tcl_DecrRefCount(commandPtr); isPtr->commandPtr = commandPtr = Tcl_NewObj(); Tcl_IncrRefCount(commandPtr); - if (chan != (Tcl_Channel) NULL) { - Tcl_CreateChannelHandler(chan, TCL_READABLE, StdinProc, - (ClientData) isPtr); + if (chan != NULL) { + Tcl_CreateChannelHandler(chan, TCL_READABLE, StdinProc, isPtr); } if (code != TCL_OK) { Tcl_Channel errChannel = Tcl_GetStdChannel(TCL_STDERR); - if (errChannel != (Tcl_Channel) NULL) { + + if (errChannel != NULL) { Tcl_WriteObj(errChannel, Tcl_GetObjResult(interp)); Tcl_WriteChars(errChannel, "\n", 1); } } else if (isPtr->tty) { Tcl_Obj *resultPtr = Tcl_GetObjResult(interp); Tcl_Channel outChannel = Tcl_GetStdChannel(TCL_STDOUT); + Tcl_IncrRefCount(resultPtr); Tcl_GetStringFromObj(resultPtr, &length); - if ((length >0) && (outChannel != (Tcl_Channel) NULL)) { + if ((length >0) && (outChannel != NULL)) { Tcl_WriteObj(outChannel, resultPtr); Tcl_WriteChars(outChannel, "\n", 1); } @@ -819,8 +831,8 @@ StdinProc( */ prompt: - if (isPtr->tty && (isPtr->input != (Tcl_Channel) NULL)) { - Prompt(interp, &(isPtr->prompt)); + if (isPtr->tty && (isPtr->input != NULL)) { + Prompt(interp, &isPtr->prompt); isPtr->input = Tcl_GetStdChannel(TCL_STDIN); } } @@ -866,11 +878,12 @@ Prompt( } if (promptCmdPtr == NULL) { defaultPrompt: - outChannel = Tcl_GetStdChannel(TCL_STDOUT); - if ((*promptPtr == PROMPT_START) - && (outChannel != (Tcl_Channel) NULL)) { - Tcl_WriteChars(outChannel, DEFAULT_PRIMARY_PROMPT, - strlen(DEFAULT_PRIMARY_PROMPT)); + if (*promptPtr == PROMPT_START) { + outChannel = Tcl_GetStdChannel(TCL_STDOUT); + if (outChannel != NULL) { + Tcl_WriteChars(outChannel, DEFAULT_PRIMARY_PROMPT, + strlen(DEFAULT_PRIMARY_PROMPT)); + } } } else { code = Tcl_EvalObjEx(interp, promptCmdPtr, TCL_EVAL_GLOBAL); @@ -878,7 +891,7 @@ Prompt( Tcl_AddErrorInfo(interp, "\n (script that generates prompt)"); errChannel = Tcl_GetStdChannel(TCL_STDERR); - if (errChannel != (Tcl_Channel) NULL) { + if (errChannel != NULL) { Tcl_WriteObj(errChannel, Tcl_GetObjResult(interp)); Tcl_WriteChars(errChannel, "\n", 1); } @@ -887,7 +900,7 @@ Prompt( } outChannel = Tcl_GetStdChannel(TCL_STDOUT); - if (outChannel != (Tcl_Channel) NULL) { + if (outChannel != NULL) { Tcl_Flush(outChannel); } *promptPtr = PROMPT_NONE; |