diff options
author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2022-02-10 14:58:27 (GMT) |
---|---|---|
committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2022-02-10 14:58:27 (GMT) |
commit | e40d8561508888effddfb4b25aed422cdab93d96 (patch) | |
tree | df02daf08734ecfc356d82840d14dc26f96d388c /generic/tkMain.c | |
parent | 5edb33dcaefb44f22c9f2e693d0994ce4b362e03 (diff) | |
download | tk-e40d8561508888effddfb4b25aed422cdab93d96.zip tk-e40d8561508888effddfb4b25aed422cdab93d96.tar.gz tk-e40d8561508888effddfb4b25aed422cdab93d96.tar.bz2 |
Is it dangerous to assume utf-8 for the console?
Diffstat (limited to 'generic/tkMain.c')
-rw-r--r-- | generic/tkMain.c | 56 |
1 files changed, 31 insertions, 25 deletions
diff --git a/generic/tkMain.c b/generic/tkMain.c index 44f0087..6c8b5e2 100644 --- a/generic/tkMain.c +++ b/generic/tkMain.c @@ -420,21 +420,20 @@ StdinProc( InteractiveState *isPtr = (InteractiveState *)clientData; Tcl_Channel chan = isPtr->input; Tcl_Interp *interp = isPtr->interp; - Tcl_DString savedEncoding; - Tcl_DStringInit(&savedEncoding); - Tcl_GetChannelOption(NULL, chan, "-encoding", &savedEncoding); - Tcl_SetChannelOption(NULL, chan, "-encoding", "utf-8"); length = Tcl_Gets(chan, &isPtr->line); - Tcl_SetChannelOption(NULL, chan, "-encoding", Tcl_DStringValue(&savedEncoding)); - Tcl_DStringFree(&savedEncoding); if ((length < 0) && !isPtr->gotPartial) { if (isPtr->tty) { + /* + * Would be better to find a way to exit the mainLoop? Or perhaps + * evaluate [exit]? Leaving as is for now due to compatibility + * concerns. + */ + Tcl_Exit(0); - } else { - Tcl_DeleteChannelHandler(chan, StdinProc, isPtr); } + Tcl_DeleteChannelHandler(chan, StdinProc, isPtr); return; } @@ -456,20 +455,29 @@ StdinProc( Tcl_CreateChannelHandler(chan, 0, StdinProc, isPtr); code = Tcl_RecordAndEval(interp, cmd, TCL_EVAL_GLOBAL); - - isPtr->input = Tcl_GetStdChannel(TCL_STDIN); - if (isPtr->input) { - Tcl_CreateChannelHandler(isPtr->input, TCL_READABLE, StdinProc, isPtr); + isPtr->input = chan = Tcl_GetStdChannel(TCL_STDIN); + if (chan != NULL) { + Tcl_CreateChannelHandler(chan, TCL_READABLE, StdinProc, isPtr); } Tcl_DStringFree(&isPtr->command); - if (Tcl_GetString(Tcl_GetObjResult(interp))[0] != '\0') { - if ((code != TCL_OK) || (isPtr->tty)) { - chan = Tcl_GetStdChannel((code != TCL_OK) ? TCL_STDERR : TCL_STDOUT); - if (chan) { - Tcl_WriteObj(chan, Tcl_GetObjResult(interp)); - Tcl_WriteChars(chan, "\n", 1); - } + if (code != TCL_OK) { + chan = Tcl_GetStdChannel(TCL_STDERR); + + if (chan != NULL) { + Tcl_WriteObj(chan, Tcl_GetObjResult(interp)); + Tcl_WriteChars(chan, "\n", 1); } + } else if (isPtr->tty) { + Tcl_Obj *resultPtr = Tcl_GetObjResult(interp); + chan = Tcl_GetStdChannel(TCL_STDOUT); + + Tcl_IncrRefCount(resultPtr); + (void)Tcl_GetStringFromObj(resultPtr, &length); + if ((length > 0) && (chan != NULL)) { + Tcl_WriteObj(chan, resultPtr); + Tcl_WriteChars(chan, "\n", 1); + } + Tcl_DecrRefCount(resultPtr); } /* @@ -525,12 +533,10 @@ Prompt( if (code != TCL_OK) { Tcl_AddErrorInfo(interp, "\n (script that generates prompt)"); - if (Tcl_GetString(Tcl_GetObjResult(interp))[0] != '\0') { - chan = Tcl_GetStdChannel(TCL_STDERR); - if (chan != NULL) { - Tcl_WriteObj(chan, Tcl_GetObjResult(interp)); - Tcl_WriteChars(chan, "\n", 1); - } + chan = Tcl_GetStdChannel(TCL_STDERR); + if (chan != NULL) { + Tcl_WriteObj(chan, Tcl_GetObjResult(interp)); + Tcl_WriteChars(chan, "\n", 1); } goto defaultPrompt; } |