summaryrefslogtreecommitdiffstats
path: root/generic/tclIO.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2022-09-20 12:09:12 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2022-09-20 12:09:12 (GMT)
commit0f9d17b141d401f2c77adfee86886098c5adb0ec (patch)
tree8c8483f9ff2690f34f7fe1973578b9d8fedacc04 /generic/tclIO.c
parent20ba5858ce237e28d9b49b07f094bf86c5f5b9c1 (diff)
parent9d536c3831e542752097c755a299643a06782298 (diff)
downloadtcl-0f9d17b141d401f2c77adfee86886098c5adb0ec.zip
tcl-0f9d17b141d401f2c77adfee86886098c5adb0ec.tar.gz
tcl-0f9d17b141d401f2c77adfee86886098c5adb0ec.tar.bz2
rebase to latest trunk
Diffstat (limited to 'generic/tclIO.c')
-rw-r--r--generic/tclIO.c65
1 files changed, 64 insertions, 1 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c
index aeed4cd..27b99b4 100644
--- a/generic/tclIO.c
+++ b/generic/tclIO.c
@@ -4308,6 +4308,16 @@ Write(
}
/*
+ * Transfer encoding strict option to the encoding flags
+ */
+
+ if (statePtr->flags & CHANNEL_ENCODING_NOCOMPLAIN) {
+ statePtr->outputEncodingFlags |= TCL_ENCODING_NOCOMPLAIN;
+ } else {
+ statePtr->outputEncodingFlags &= ~TCL_ENCODING_NOCOMPLAIN;
+ }
+
+ /*
* Write the terminated escape sequence even if srcLen is 0.
*/
@@ -4345,7 +4355,7 @@ Write(
}
dst = InsertPoint(bufPtr);
dstLen = SpaceLeft(bufPtr);
-
+
result = Tcl_UtfToExternal(NULL, encoding, src, srcLimit,
statePtr->outputEncodingFlags,
&statePtr->outputEncodingState, dst,
@@ -4625,6 +4635,16 @@ Tcl_GetsObj(
}
/*
+ * Transfer encoding strict option to the encoding flags
+ */
+
+ if (statePtr->flags & CHANNEL_ENCODING_NOCOMPLAIN) {
+ statePtr->inputEncodingFlags |= TCL_ENCODING_NOCOMPLAIN;
+ } else {
+ statePtr->inputEncodingFlags &= ~TCL_ENCODING_NOCOMPLAIN;
+ }
+
+ /*
* Object used by FilterInputBytes to keep track of how much data has been
* consumed from the channel buffers.
*/
@@ -5381,6 +5401,17 @@ FilterInputBytes(
*gsPtr->dstPtr = dst;
}
gsPtr->state = statePtr->inputEncodingState;
+
+ /*
+ * Transfer encoding strict option to the encoding flags
+ */
+
+ if (statePtr->flags & CHANNEL_ENCODING_NOCOMPLAIN) {
+ statePtr->inputEncodingFlags |= TCL_ENCODING_NOCOMPLAIN;
+ } else {
+ statePtr->inputEncodingFlags &= ~TCL_ENCODING_NOCOMPLAIN;
+ }
+
result = Tcl_ExternalToUtf(NULL, gsPtr->encoding, raw, rawLen,
statePtr->inputEncodingFlags | TCL_ENCODING_NO_TERMINATE,
&statePtr->inputEncodingState, dst, spaceLeft, &gsPtr->rawRead,
@@ -6155,6 +6186,16 @@ ReadChars(
}
/*
+ * Transfer encoding strict option to the encoding flags
+ */
+
+ if (statePtr->flags & CHANNEL_ENCODING_NOCOMPLAIN) {
+ statePtr->inputEncodingFlags |= TCL_ENCODING_NOCOMPLAIN;
+ } else {
+ statePtr->inputEncodingFlags &= ~TCL_ENCODING_NOCOMPLAIN;
+ }
+
+ /*
* This routine is burdened with satisfying several constraints. It cannot
* append more than 'charsToRead` chars onto objPtr. This is measured
* after encoding and translation transformations are completed. There is
@@ -7884,6 +7925,16 @@ Tcl_GetChannelOption(
return TCL_OK;
}
}
+ if (len == 0 || HaveOpt(1, "-nocomplainencoding")) {
+ if (len == 0) {
+ Tcl_DStringAppendElement(dsPtr, "-nocomplainencoding");
+ }
+ Tcl_DStringAppendElement(dsPtr,
+ (flags & CHANNEL_ENCODING_NOCOMPLAIN) ? "1" : "0");
+ if (len > 0) {
+ return TCL_OK;
+ }
+ }
if (len == 0 || HaveOpt(1, "-translation")) {
if (len == 0) {
Tcl_DStringAppendElement(dsPtr, "-translation");
@@ -8147,6 +8198,18 @@ Tcl_SetChannelOption(
ResetFlag(statePtr, CHANNEL_EOF|CHANNEL_STICKY_EOF|CHANNEL_BLOCKED);
statePtr->inputEncodingFlags &= ~TCL_ENCODING_END;
return TCL_OK;
+ } else if (HaveOpt(1, "-nocomplainencoding")) {
+ int newMode;
+
+ if (Tcl_GetBoolean(interp, newValue, &newMode) == TCL_ERROR) {
+ return TCL_ERROR;
+ }
+ if (newMode) {
+ statePtr->flags |= CHANNEL_ENCODING_NOCOMPLAIN;
+ } else {
+ statePtr->flags &= ~CHANNEL_ENCODING_NOCOMPLAIN;
+ }
+ return TCL_OK;
} else if (HaveOpt(1, "-translation")) {
const char *readMode, *writeMode;