summaryrefslogtreecommitdiffstats
path: root/generic/tclIO.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2023-04-12 22:41:14 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2023-04-12 22:41:14 (GMT)
commitc43d7064ebd4bec57817b7f0945781bcea162192 (patch)
tree5cfe0ec1cddc12534799b5da89597a1c97b45531 /generic/tclIO.c
parent3e8b4007cfb537f4e5f2eba0be30ab926bf1c15f (diff)
parent54ad113891564730905042f5fa1aefa5d688a7d1 (diff)
downloadtcl-c43d7064ebd4bec57817b7f0945781bcea162192.zip
tcl-c43d7064ebd4bec57817b7f0945781bcea162192.tar.gz
tcl-c43d7064ebd4bec57817b7f0945781bcea162192.tar.bz2
Merge 9.0
Diffstat (limited to 'generic/tclIO.c')
-rw-r--r--generic/tclIO.c174
1 files changed, 80 insertions, 94 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c
index f2070b4..df27807 100644
--- a/generic/tclIO.c
+++ b/generic/tclIO.c
@@ -969,7 +969,7 @@ GetChannelTable(
*
* Side effects:
* Deletes the hash table of channels. May close channels. May flush
- * output on closed channels. Removes any channeEvent handlers that were
+ * output on closed channels. Removes any channelEvent handlers that were
* registered in this interpreter.
*
*----------------------------------------------------------------------
@@ -1002,7 +1002,7 @@ DeleteChannelTable(
statePtr = chanPtr->state;
/*
- * Remove any fileevents registered in this interpreter.
+ * Remove any file events registered in this interpreter.
*/
for (sPtr = statePtr->scriptRecordPtr, prevPtr = NULL;
@@ -1421,7 +1421,7 @@ Tcl_GetChannel(
* channel. */
const char *chanName, /* The name of the channel. */
int *modePtr) /* Where to store the mode in which the
- * channel was opened? Will contain an ORed
+ * channel was opened? Will contain an OR'ed
* combination of TCL_READABLE and
* TCL_WRITABLE, if non-NULL. */
{
@@ -1504,7 +1504,7 @@ TclGetChannelFromObj(
Tcl_Obj *objPtr,
Tcl_Channel *channelPtr,
int *modePtr, /* Where to store the mode in which the
- * channel was opened? Will contain an ORed
+ * channel was opened? Will contain an OR'ed
* combination of TCL_READABLE and
* TCL_WRITABLE, if non-NULL. */
TCL_UNUSED(int) /*flags*/)
@@ -1675,11 +1675,8 @@ Tcl_CreateChannel(
* interpretation that Tcl_Channels give to the "-encoding binary" option.
*/
- statePtr->encoding = NULL;
name = Tcl_GetEncodingName(NULL);
- if (strcmp(name, "binary") != 0) {
- statePtr->encoding = Tcl_GetEncoding(NULL, name);
- }
+ statePtr->encoding = Tcl_GetEncoding(NULL, name);
statePtr->inputEncodingState = NULL;
statePtr->inputEncodingFlags = TCL_ENCODING_START;
CHANNEL_PROFILE_SET(statePtr->inputEncodingFlags, 0);
@@ -1914,7 +1911,7 @@ Tcl_StackChannel(
* impossible) we move the buffers from the common state structure into
* the channel itself. We use the buffers in the channel below the new
* transformation to hold the data. In the future this allows us to write
- * transformations which pre-read data and push the unused part back when
+ * transformations which preread data and push the unused part back when
* they are going away.
*/
@@ -2023,7 +2020,7 @@ ChannelFree(
* A standard Tcl result.
*
* Side effects:
- * If TCL_ERROR is returned, the posix error code will be set with
+ * If TCL_ERROR is returned, the Posix error code will be set with
* Tcl_SetErrno. May leave a message in interp result as well.
*
*----------------------------------------------------------------------
@@ -2046,7 +2043,7 @@ Tcl_UnstackChannel(
if (chanPtr->downChanPtr != NULL) {
/*
- * Instead of manipulating the per-thread / per-interp list/hashtable
+ * Instead of manipulating the per-thread / per-interp list/hash table
* of registered channels we wind down the state of the
* transformation, and then restore the state of underlying channel
* into the old structure.
@@ -2590,8 +2587,8 @@ RecycleBuffer(
}
/*
- * Only save buffers which have the requested buffersize for the channel.
- * This is to honor dynamic changes of the buffersize made by the user.
+ * Only save buffers which have the requested buffer size for the channel.
+ * This is to honor dynamic changes of the buffe rsize made by the user.
*/
if ((bufPtr->bufLength) != statePtr->bufSize + BUFFER_PADDING) {
@@ -2751,7 +2748,7 @@ FlushChannel(
/*
* Prevent writing on a dead channel -- a channel that has been closed but
* not yet deallocated. This can occur if the exit handler for the channel
- * deallocation runs before all channels are deregistered in all
+ * deallocation runs before all channels are unregistered in all
* interpreters.
*/
@@ -2866,9 +2863,9 @@ FlushChannel(
if (calledFromAsyncFlush) {
/*
* TIP #219, Tcl Channel Reflection API.
- * When defering the error copy a message from the bypass into
+ * When deferring the error copy a message from the bypass into
* the unreported area. Or discard it if the new error is to
- * be ignored in favor of an earlier defered error.
+ * be ignored in favor of an earlier deferred error.
*/
Tcl_Obj *msg = statePtr->chanMsg;
@@ -3212,8 +3209,8 @@ CloseChannel(
* The channel to cut out of the list must not be referenced in any
* interpreter. This is something this procedure cannot check (despite
* the refcount) because the caller usually wants fiddle with the channel
- * (like transfering it to a different thread) and thus keeps the
- * refcount artifically high to prevent its destruction.
+ * (like transferring it to a different thread) and thus keeps the
+ * refcount artificially high to prevent its destruction.
*
*----------------------------------------------------------------------
*/
@@ -3327,9 +3324,9 @@ Tcl_CutChannel(
* NOTE:
* The channel to splice into the list must not be referenced in any
* interpreter. This is something this procedure cannot check (despite
- * the refcount) because the caller usually wants figgle with the channel
- * (like transfering it to a different thread) and thus keeps the
- * refcount artifically high to prevent its destruction.
+ * the refcount) because the caller usually wants fiddle with the channel
+ * (like transferring it to a different thread) and thus keeps the
+ * refcount artificially high to prevent its destruction.
*
*----------------------------------------------------------------------
*/
@@ -3478,7 +3475,8 @@ TclClose(
stickyError = 0;
- if (GotFlag(statePtr, TCL_WRITABLE) && (statePtr->encoding != NULL)
+ if (GotFlag(statePtr, TCL_WRITABLE)
+ && (statePtr->encoding != GetBinaryEncoding())
&& !(statePtr->outputEncodingFlags & TCL_ENCODING_START)) {
int code = CheckChannelErrors(statePtr, TCL_WRITABLE);
@@ -3740,7 +3738,7 @@ Tcl_CloseEx(
*
* NOTE:
* CloseWrite removes the channel as far as the user is concerned.
- * However, the ooutput data structures may continue to exist for a while
+ * However, the output data structures may continue to exist for a while
* longer if it has a background flush scheduled. The device itself is
* eventually closed and the channel structures modified, in
* CloseChannelPart, below.
@@ -4182,7 +4180,7 @@ Tcl_WriteChars(
/*
* Inefficient way to convert UTF-8 to byte-array, but the code
* parallels the way it is done for objects. Special case for 1-byte
- * (used by eg [puts] for the \n) could be extended to more efficient
+ * (used by e.g. [puts] for the \n) could be extended to more efficient
* translation of the src string.
*/
@@ -4267,11 +4265,7 @@ Tcl_WriteObj(
do {
int chunkSize = srcLen > INT_MAX ? INT_MAX : srcLen;
int written;
- if (statePtr->encoding == NULL) {
- written = WriteBytes(chanPtr, src, chunkSize);
- } else {
- written = WriteChars(chanPtr, src, chunkSize);
- }
+ written = WriteChars(chanPtr, src, chunkSize);
if (written < 0) {
return TCL_INDEX_NONE;
}
@@ -4509,7 +4503,7 @@ Write(
/*
* We just flushed. So if we have needNlFlush set to record that
- * we need to flush because theres a (translated) newline in the
+ * we need to flush because there is a (translated) newline in the
* buffer, that's likely not true any more. But there is a tricky
* exception. If we have saved bytes that did not really get
* flushed and those bytes came from a translation of a newline as
@@ -4649,7 +4643,7 @@ Tcl_GetsObj(
* done on objPtr.
*/
- if ((statePtr->encoding == NULL)
+ if (statePtr->encoding == GetBinaryEncoding()
&& ((statePtr->inputTranslation == TCL_TRANSLATE_LF)
|| (statePtr->inputTranslation == TCL_TRANSLATE_CR))
&& Tcl_GetByteArrayFromObj(objPtr, (size_t *)NULL) != NULL) {
@@ -4680,15 +4674,6 @@ Tcl_GetsObj(
}
/*
- * If there is no encoding, use "iso8859-1" -- Tcl_GetsObj() doesn't
- * produce ByteArray objects.
- */
-
- if (encoding == NULL) {
- encoding = GetBinaryEncoding();
- }
-
- /*
* Object used by FilterInputBytes to keep track of how much data has been
* consumed from the channel buffers.
*/
@@ -4763,7 +4748,7 @@ Tcl_GetsObj(
/*
* If a CR is at the end of the buffer, then check for a
- * LF at the begining of the next buffer, unless EOF char
+ * LF at the beginning of the next buffer, unless EOF char
* was found already.
*/
@@ -5236,7 +5221,7 @@ TclGetsObjBinary(
* XXX - unimplemented.
*/
- if (statePtr->encoding != NULL) {
+ if (statePtr->encoding != GetBinaryEncoding()) {
}
/*
@@ -5805,7 +5790,7 @@ Tcl_ReadRaw(
/*
* Go to the driver only if we got nothing from pushback. Have to do it
- * this way to avoid EOF mis-timings when we consider the ability that EOF
+ * this way to avoid EOF mistimings when we consider the ability that EOF
* may not be a permanent condition in the driver, and in that case we
* have to synchronize.
*/
@@ -5951,32 +5936,6 @@ DoReadChars(
#define UTF_EXPANSION_FACTOR 1024
int factor = UTF_EXPANSION_FACTOR;
- binaryMode = (encoding == NULL)
- && (statePtr->inputTranslation == TCL_TRANSLATE_LF)
- && (statePtr->inEofChar == '\0');
-
- if (appendFlag) {
- if (binaryMode && (NULL == Tcl_GetByteArrayFromObj(objPtr, (size_t *)NULL))) {
- binaryMode = 0;
- }
- } else {
- if (binaryMode) {
- Tcl_SetByteArrayLength(objPtr, 0);
- } else {
- Tcl_SetObjLength(objPtr, 0);
-
- /*
- * We're going to access objPtr->bytes directly, so we must ensure
- * that this is actually a string object (otherwise it might have
- * been pure Unicode).
- *
- * Probably not needed anymore.
- */
-
- TclGetString(objPtr);
- }
- }
-
if (GotFlag(statePtr, CHANNEL_ENCODING_ERROR)) {
/* TODO: We don't need this call? */
UpdateInterest(chanPtr);
@@ -6021,6 +5980,24 @@ DoReadChars(
chanPtr = statePtr->topChanPtr;
TclChannelPreserve((Tcl_Channel)chanPtr);
+
+ binaryMode = (encoding == GetBinaryEncoding())
+ && (statePtr->inputTranslation == TCL_TRANSLATE_LF)
+ && (statePtr->inEofChar == '\0');
+
+ if (appendFlag) {
+ if (binaryMode && (NULL == Tcl_GetByteArrayFromObj(objPtr, (size_t *)NULL))) {
+ binaryMode = 0;
+ }
+ } else {
+ if (binaryMode) {
+ Tcl_SetByteArrayLength(objPtr, 0);
+ } else {
+ Tcl_SetObjLength(objPtr, 0);
+ }
+ }
+
+
/*
* Must clear the BLOCKED|EOF flags here since we check before reading.
*/
@@ -6235,7 +6212,7 @@ ReadChars(
* is larger than the number of characters
* available in the first buffer, only the
* characters from the first buffer are
- * returned. The execption is when there is
+ * returned. The exception is when there is
* not any complete character in the first
* buffer. In that case, a recursive call
* effectively obtains chars from the
@@ -6246,8 +6223,7 @@ ReadChars(
* UTF-8. On output, contains another guess
* based on the data seen so far. */
{
- Tcl_Encoding encoding = statePtr->encoding? statePtr->encoding
- : GetBinaryEncoding();
+ Tcl_Encoding encoding = statePtr->encoding;
Tcl_EncodingState savedState = statePtr->inputEncodingState;
ChannelBuffer *bufPtr = statePtr->inQueueHead;
int savedIEFlags = statePtr->inputEncodingFlags;
@@ -7418,7 +7394,7 @@ Tcl_TruncateChannel(
/*
* Seek first to force a total flush of all pending buffers and ditch any
- * pre-read input data.
+ * preread input data.
*/
WillWrite(chanPtr);
@@ -7478,7 +7454,7 @@ CheckChannelErrors(
/*
* TIP #219, Tcl Channel Reflection API.
- * Move a defered error message back into the channel bypass.
+ * Move a deferred error message back into the channel bypass.
*/
if (statePtr->chanMsg != NULL) {
@@ -7832,7 +7808,7 @@ Tcl_GetChannelBufferSize(
* Side effects:
* An error message is generated in interp's result object to indicate
- * that a command was invoked with the a bad option. The message has the
+ * that a command was invoked with a bad option. The message has the
* form:
* bad option "blah": should be one of
* <...generic options...>+<...specific options...>
@@ -7999,12 +7975,8 @@ Tcl_GetChannelOption(
if (len == 0) {
Tcl_DStringAppendElement(dsPtr, "-encoding");
}
- if (statePtr->encoding == NULL) {
- Tcl_DStringAppendElement(dsPtr, "binary");
- } else {
- Tcl_DStringAppendElement(dsPtr,
- Tcl_GetEncodingName(statePtr->encoding));
- }
+ Tcl_DStringAppendElement(dsPtr,
+ Tcl_GetEncodingName(statePtr->encoding));
if (len > 0) {
return TCL_OK;
}
@@ -8224,7 +8196,13 @@ Tcl_SetChannelOption(
int profile;
if ((newValue[0] == '\0') || (strcmp(newValue, "binary") == 0)) {
- encoding = NULL;
+ encoding = Tcl_GetEncoding(NULL, "iso8859-1");
+ CHANNEL_PROFILE_SET(statePtr->inputEncodingFlags
+ ,CHANNEL_PROFILE_GET(statePtr->inputEncodingFlags)
+ |TCL_ENCODING_PROFILE_STRICT);
+ CHANNEL_PROFILE_SET(statePtr->outputEncodingFlags
+ ,CHANNEL_PROFILE_GET(statePtr->outputEncodingFlags)
+ |TCL_ENCODING_PROFILE_STRICT);
} else {
encoding = Tcl_GetEncoding(interp, newValue);
if (encoding == NULL) {
@@ -8237,7 +8215,7 @@ Tcl_SetChannelOption(
* iso2022, the terminated escape sequence must write to the buffer.
*/
- if ((statePtr->encoding != NULL)
+ if ((statePtr->encoding != GetBinaryEncoding())
&& !(statePtr->outputEncodingFlags & TCL_ENCODING_START)
&& (CheckChannelErrors(statePtr, TCL_WRITABLE) == 0)) {
statePtr->outputEncodingFlags |= TCL_ENCODING_END;
@@ -8332,7 +8310,13 @@ Tcl_SetChannelOption(
translation = TCL_TRANSLATE_LF;
statePtr->inEofChar = 0;
Tcl_FreeEncoding(statePtr->encoding);
- statePtr->encoding = NULL;
+ statePtr->encoding = Tcl_GetEncoding(NULL, "iso8859-1");
+ CHANNEL_PROFILE_SET(statePtr->inputEncodingFlags
+ ,CHANNEL_PROFILE_GET(statePtr->inputEncodingFlags)
+ |TCL_ENCODING_PROFILE_STRICT);
+ CHANNEL_PROFILE_SET(statePtr->outputEncodingFlags
+ ,CHANNEL_PROFILE_GET(statePtr->outputEncodingFlags)
+ |TCL_ENCODING_PROFILE_STRICT);
} else if (strcmp(readMode, "lf") == 0) {
translation = TCL_TRANSLATE_LF;
} else if (strcmp(readMode, "cr") == 0) {
@@ -8381,7 +8365,13 @@ Tcl_SetChannelOption(
} else if (strcmp(writeMode, "binary") == 0) {
statePtr->outputTranslation = TCL_TRANSLATE_LF;
Tcl_FreeEncoding(statePtr->encoding);
- statePtr->encoding = NULL;
+ statePtr->encoding = Tcl_GetEncoding(NULL, "iso8859-1");
+ CHANNEL_PROFILE_SET(statePtr->inputEncodingFlags
+ ,CHANNEL_PROFILE_GET(statePtr->inputEncodingFlags)
+ |TCL_ENCODING_PROFILE_STRICT);
+ CHANNEL_PROFILE_SET(statePtr->outputEncodingFlags
+ ,CHANNEL_PROFILE_GET(statePtr->outputEncodingFlags)
+ |TCL_ENCODING_PROFILE_STRICT);
} else if (strcmp(writeMode, "lf") == 0) {
statePtr->outputTranslation = TCL_TRANSLATE_LF;
} else if (strcmp(writeMode, "cr") == 0) {
@@ -10300,13 +10290,9 @@ Lossless(
&& outStatePtr->outputTranslation == TCL_TRANSLATE_LF
&& (
(
- (inStatePtr->encoding == NULL
- || inStatePtr->encoding == GetBinaryEncoding()
- )
+ inStatePtr->encoding == GetBinaryEncoding()
&&
- (outStatePtr->encoding == NULL
- || outStatePtr->encoding == GetBinaryEncoding()
- )
+ outStatePtr->encoding == GetBinaryEncoding()
)
||
(
@@ -11186,7 +11172,7 @@ FixLevelCode(
* Syntax = (option value)... ?message?
*
* Bad message syntax causes a panic, because the other side uses
- * Tcl_GetReturnOptions and list construction functions to marshall the
+ * Tcl_GetReturnOptions and list construction functions to marshal the
* information. Hence an error means that we've got serious breakage.
*/
@@ -11255,8 +11241,8 @@ FixLevelCode(
lvn = (Tcl_Obj **)Tcl_Alloc(lcn * sizeof(Tcl_Obj *));
/*
- * New level/code information is spliced into the first occurence of
- * -level, -code, further occurences are ignored. The options cannot be
+ * New level/code information is spliced into the first occurrence of
+ * -level, -code, further occurrences are ignored. The options cannot be
* not present, we would not come here. Options which are ok are simply
* copied over.
*/