summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2022-10-08 00:10:13 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2022-10-08 00:10:13 (GMT)
commit5e4013330a16bddc87cd9179fce996982e333f20 (patch)
tree693396587efa40ac068fd40c3b9923fdf829ab68
parent9f59ec07c0f380bd4766fd9f2c54afebfe44c1f9 (diff)
downloadtcl-5e4013330a16bddc87cd9179fce996982e333f20.zip
tcl-5e4013330a16bddc87cd9179fce996982e333f20.tar.gz
tcl-5e4013330a16bddc87cd9179fce996982e333f20.tar.bz2
-nocomplainencoding and -strictencoding are incompatible
-rw-r--r--generic/tclIO.c23
-rw-r--r--generic/tclIO.h2
2 files changed, 23 insertions, 2 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c
index 85067f2..ca12d63 100644
--- a/generic/tclIO.c
+++ b/generic/tclIO.c
@@ -8009,7 +8009,8 @@ Tcl_GetChannelOption(
if (len == 0) {
Tcl_DStringAppendElement(dsPtr, "-nocomplainencoding");
}
- Tcl_DStringAppendElement(dsPtr,"1");
+ Tcl_DStringAppendElement(dsPtr,
+ (flags & CHANNEL_ENCODING_STRICT) ? "0" : "1");
if (len > 0) {
return TCL_OK;
}
@@ -8283,7 +8284,17 @@ Tcl_SetChannelOption(
if (Tcl_GetBoolean(interp, newValue, &newMode) == TCL_ERROR) {
return TCL_ERROR;
}
- if (!newMode) {
+ if (newMode) {
+ if (statePtr->flags & CHANNEL_ENCODING_STRICT) {
+ if (interp) {
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(
+ "-nocomplainencoding cannot be used with -strictencoding",
+ -1));
+ }
+ return TCL_ERROR;
+ }
+ statePtr->flags |= CHANNEL_ENCODING_NOCOMPLAIN;
+ } else {
if (interp) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"bad value for -nocomplainencoding: only true allowed",
@@ -8299,6 +8310,14 @@ Tcl_SetChannelOption(
return TCL_ERROR;
}
if (newMode) {
+ if (statePtr->flags & CHANNEL_ENCODING_NOCOMPLAIN) {
+ if (interp) {
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(
+ "-strictencoding cannot be used with -nocomplainencoding",
+ -1));
+ }
+ return TCL_ERROR;
+ }
statePtr->flags |= CHANNEL_ENCODING_STRICT;
}
return TCL_OK;
diff --git a/generic/tclIO.h b/generic/tclIO.h
index b86dc1d..e8d2736 100644
--- a/generic/tclIO.h
+++ b/generic/tclIO.h
@@ -273,6 +273,8 @@ typedef struct ChannelState {
* changes. */
#define CHANNEL_RAW_MODE (1<<16) /* When set, notes that the Raw API is
* being used. */
+#define CHANNEL_ENCODING_NOCOMPLAIN (1<<17) /* set if option
+ * -nocomplaincoding is set to 1 */
#define CHANNEL_ENCODING_STRICT (1<<18) /* set if option
* -strictencoding is set to 1 */
#define CHANNEL_INCLOSE (1<<19) /* Channel is currently being closed.