diff options
| author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2019-03-11 20:56:32 (GMT) |
|---|---|---|
| committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2019-03-11 20:56:32 (GMT) |
| commit | fd3fca18dbf1180ee000a49bcdc3abc98fb97920 (patch) | |
| tree | 944f23c4fa8252fea85c5eda4a8f9781d86580ad /unix/tclUnixChan.c | |
| parent | 0bd8e4a634e88f8415e8904c7e5ed4c87a0243af (diff) | |
| parent | 8e7a963f7fb10cc556337a18a652fd0c78c51029 (diff) | |
| download | tcl-fd3fca18dbf1180ee000a49bcdc3abc98fb97920.zip tcl-fd3fca18dbf1180ee000a49bcdc3abc98fb97920.tar.gz tcl-fd3fca18dbf1180ee000a49bcdc3abc98fb97920.tar.bz2 | |
Merge 8.7
Diffstat (limited to 'unix/tclUnixChan.c')
| -rw-r--r-- | unix/tclUnixChan.c | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/unix/tclUnixChan.c b/unix/tclUnixChan.c index 29fc03e..d76be4e 100644 --- a/unix/tclUnixChan.c +++ b/unix/tclUnixChan.c @@ -654,17 +654,15 @@ TtySetOptionProc( */ if ((len > 1) && (strncmp(optionName, "-xchar", len) == 0)) { - Tcl_DString ds; - if (Tcl_SplitList(interp, value, &argc, &argv) == TCL_ERROR) { return TCL_ERROR; } else if (argc != 2) { + badXchar: if (interp) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "bad value for -xchar: should be a list of" - " two elements", -1)); - Tcl_SetErrorCode(interp, "TCL", "OPERATION", "FCONFIGURE", - "VALUE", NULL); + " two elements with each a single 8-bit character", -1)); + Tcl_SetErrorCode(interp, "TCL", "VALUE", "XCHAR", NULL); } Tcl_Free(argv); return TCL_ERROR; @@ -672,13 +670,23 @@ TtySetOptionProc( tcgetattr(fsPtr->fd, &iostate); - Tcl_UtfToExternalDString(NULL, argv[0], -1, &ds); - iostate.c_cc[VSTART] = *(const cc_t *) Tcl_DStringValue(&ds); - TclDStringClear(&ds); + iostate.c_cc[VSTART] = argv[0][0]; + iostate.c_cc[VSTOP] = argv[1][0]; + if (argv[0][0] & 0x80 || argv[1][0] & 0x80) { + Tcl_UniChar character = 0; + int charLen; - Tcl_UtfToExternalDString(NULL, argv[1], -1, &ds); - iostate.c_cc[VSTOP] = *(const cc_t *) Tcl_DStringValue(&ds); - Tcl_DStringFree(&ds); + charLen = Tcl_UtfToUniChar(argv[0], &character); + if ((character > 0xFF) || argv[0][charLen]) { + goto badXchar; + } + iostate.c_cc[VSTART] = character; + charLen = Tcl_UtfToUniChar(argv[1], &character); + if ((character > 0xFF) || argv[1][charLen]) { + goto badXchar; + } + iostate.c_cc[VSTOP] = character; + } Tcl_Free(argv); tcsetattr(fsPtr->fd, TCSADRAIN, &iostate); |
