From a17cc6e7864857dc63ad66ea35f82244d1addeef Mon Sep 17 00:00:00 2001 From: dgp Date: Mon, 6 Jun 2011 21:56:23 +0000 Subject: Restore proper NUL output to the [console]. [Bug 2546087] --- ChangeLog | 5 +++++ generic/tkConsole.c | 20 +++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index cb637a9..6584204 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2011-06-06 Don Porter + + * generic/tkConsole.c: Restore proper NUL output to the [console]. + [Bug 2546087] + 2011-04-22 Peter Spjuth * generic/tkCanvPoly.c: [Bug 3291543] There was a crash if dchars diff --git a/generic/tkConsole.c b/generic/tkConsole.c index 13e755e..b7314b0 100644 --- a/generic/tkConsole.c +++ b/generic/tkConsole.c @@ -534,7 +534,22 @@ ConsoleOutput(instanceData, buf, toWrite, errorCode) Tcl_Interp *consoleInterp = info->consoleInterp; if (consoleInterp && !Tcl_InterpDeleted(consoleInterp)) { + Tcl_DString ds; + Tcl_Encoding utf8 = Tcl_GetEncoding(NULL, "utf-8"); + + /* + * Not checking for utf8 == NULL. Did not check for TCL_ERROR + * from Tcl_SetChannelOption() in Tk_InitConsoleChannels() either. + * Assumption is utf-8 Tcl_Encoding is reliably present. + */ + + CONST char *bytes + = Tcl_ExternalToUtfDString(utf8, buf, toWrite, &ds); + int numBytes = Tcl_DStringLength(&ds); Tcl_Obj *cmd = Tcl_NewStringObj("tk::ConsoleOutput", -1); + + Tcl_FreeEncoding(utf8); + if (data->type == TCL_STDERR) { Tcl_ListObjAppendElement(NULL, cmd, Tcl_NewStringObj("stderr", -1)); @@ -542,7 +557,10 @@ ConsoleOutput(instanceData, buf, toWrite, errorCode) Tcl_ListObjAppendElement(NULL, cmd, Tcl_NewStringObj("stdout", -1)); } - Tcl_ListObjAppendElement(NULL, cmd, Tcl_NewStringObj(buf, toWrite)); + Tcl_ListObjAppendElement(NULL, cmd, + Tcl_NewStringObj(bytes, numBytes)); + + Tcl_DStringFree(&ds); Tcl_IncrRefCount(cmd); Tcl_GlobalEvalObj(consoleInterp, cmd); Tcl_DecrRefCount(cmd); -- cgit v0.12