Compare commits

...
Author SHA1 Message Date
dgp 5893756a8c Revise writing to binary channels so that non-byte characters get replaced
with a replacement character ("?" for iso8859-1).
2020-03-30 20:59:03 +00:00
+23 -6
View File
@@ -4169,8 +4169,13 @@ Tcl_WriteChars(
}
objPtr = Tcl_NewStringObj(src, len);
src = (char *) Tcl_GetByteArrayFromObj(objPtr, &len);
result = WriteBytes(chanPtr, src, len);
src = (char *) TclGetBytesFromObj(NULL, objPtr, &len);
if (src) {
result = WriteBytes(chanPtr, src, len);
} else {
src = TclGetStringFromObj(objPtr, &len);
result = Write(chanPtr, src, len, GetBinaryEncoding());
}
TclDecrRefCount(objPtr);
return result;
}
@@ -4221,12 +4226,24 @@ Tcl_WriteObj(
return -1;
}
if (statePtr->encoding == NULL) {
src = (char *) Tcl_GetByteArrayFromObj(objPtr, &srcLen);
return WriteBytes(chanPtr, src, srcLen);
} else {
/* We have a binary channel... */
src = (const char *) TclGetBytesFromObj(NULL, objPtr, &srcLen);
if (src) {
/* ... and value to write that is properly expressed as bytes. */
return WriteBytes(chanPtr, src, srcLen);
}
/* We have some non-byte content to write, encode in iso8859-1 */
src = TclGetStringFromObj(objPtr, &srcLen);
return WriteChars(chanPtr, src, srcLen);
return Write(chanPtr, src, srcLen, GetBinaryEncoding());
}
/* If either one is false, need to process encodings for correctness */
src = TclGetStringFromObj(objPtr, &srcLen);
return WriteChars(chanPtr, src, srcLen);
}
static void