summaryrefslogtreecommitdiffstats
path: root/unix/tclUnixChan.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2019-03-11 20:56:32 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2019-03-11 20:56:32 (GMT)
commitfd3fca18dbf1180ee000a49bcdc3abc98fb97920 (patch)
tree944f23c4fa8252fea85c5eda4a8f9781d86580ad /unix/tclUnixChan.c
parent0bd8e4a634e88f8415e8904c7e5ed4c87a0243af (diff)
parent8e7a963f7fb10cc556337a18a652fd0c78c51029 (diff)
downloadtcl-fd3fca18dbf1180ee000a49bcdc3abc98fb97920.zip
tcl-fd3fca18dbf1180ee000a49bcdc3abc98fb97920.tar.gz
tcl-fd3fca18dbf1180ee000a49bcdc3abc98fb97920.tar.bz2
Merge 8.7
Diffstat (limited to 'unix/tclUnixChan.c')
-rw-r--r--unix/tclUnixChan.c30
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);