diff options
Diffstat (limited to 'generic/tclIO.c')
-rw-r--r-- | generic/tclIO.c | 383 |
1 files changed, 191 insertions, 192 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c index c47eaea..c65a192 100644 --- a/generic/tclIO.c +++ b/generic/tclIO.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclIO.c,v 1.121.2.4 2007/11/12 19:18:17 dgp Exp $ + * RCS: @(#) $Id: tclIO.c,v 1.121.2.5 2007/11/21 06:30:51 dgp Exp $ */ #include "tclInt.h" @@ -179,6 +179,13 @@ static void CutChannel(Tcl_Channel chan); #define RemovePoint(bufPtr) ((bufPtr)->buf + (bufPtr)->nextRemoved) /* + * For working with channel state flag bits. + */ + +#define SetFlag(statePtr, flag) ((statePtr)->flags |= (flag)) +#define ResetFlag(statePtr, flag) ((statePtr)->flags &= ~(flag)) + +/* * Macro for testing whether a string (in optionName, length len) matches a * value (prefix matching rules). Arguments are the minimum length to match * and the value to match against. (Can't use Tcl_GetIndexFromObj as this is @@ -245,23 +252,21 @@ TclFinalizeIOSubsystem(void) int active = 1; /* Flag == 1 while there's still work to do */ /* - * Walk all channel state structures known to this thread and - * close corresponding channels. + * Walk all channel state structures known to this thread and close + * corresponding channels. */ while (active) { - /* - * Iterate through the open channel list, and find the first - * channel that isn't dead. We start from the head of the list - * each time, because the close action on one channel can close - * others. + * Iterate through the open channel list, and find the first channel + * that isn't dead. We start from the head of the list each time, + * because the close action on one channel can close others. */ active = 0; for (statePtr = tsdPtr->firstCSPtr; - statePtr != NULL; - statePtr = statePtr->nextCSPtr) { + statePtr != NULL; + statePtr = statePtr->nextCSPtr) { chanPtr = statePtr->topChanPtr; if (!(statePtr->flags & CHANNEL_DEAD)) { active = 1; @@ -270,67 +275,65 @@ TclFinalizeIOSubsystem(void) } /* - * We've found a live channel. Close it. + * We've found a live channel. Close it. */ if (active) { - /* - * Set the channel back into blocking mode to ensure that we - * wait for all data to flush out. + * Set the channel back into blocking mode to ensure that we wait + * for all data to flush out. */ - + (void) Tcl_SetChannelOption(NULL, (Tcl_Channel) chanPtr, - "-blocking", "on"); - + "-blocking", "on"); + if ((chanPtr == (Channel *) tsdPtr->stdinChannel) || - (chanPtr == (Channel *) tsdPtr->stdoutChannel) || - (chanPtr == (Channel *) tsdPtr->stderrChannel)) { + (chanPtr == (Channel *) tsdPtr->stdoutChannel) || + (chanPtr == (Channel *) tsdPtr->stderrChannel)) { /* - * Decrement the refcount which was earlier artificially + * Decrement the refcount which was earlier artificially * bumped up to keep the channel from being closed. */ - + statePtr->refCount--; } - + if (statePtr->refCount <= 0) { /* - * Close it only if the refcount indicates that the channel - * is not referenced from any interpreter. If it is, that + * Close it only if the refcount indicates that the channel is + * not referenced from any interpreter. If it is, that * interpreter will close the channel when it gets destroyed. */ - + (void) Tcl_Close(NULL, (Tcl_Channel) chanPtr); } else { /* * The refcount is greater than zero, so flush the channel. */ - + Tcl_Flush((Tcl_Channel) chanPtr); - + /* - * Call the device driver to actually close the underlying + * Call the device driver to actually close the underlying * device for this channel. */ - + if (chanPtr->typePtr->closeProc != TCL_CLOSE2PROC) { (chanPtr->typePtr->closeProc)(chanPtr->instanceData, NULL); } else { (chanPtr->typePtr->close2Proc)(chanPtr->instanceData, - NULL, 0); + NULL, 0); } - + /* - * Finally, we clean up the fields in the channel data - * structure since all of them have been deleted already. - * We mark the channel with CHANNEL_DEAD to prevent any - * further IO operations - * on it. + * Finally, we clean up the fields in the channel data + * structure since all of them have been deleted already. We + * mark the channel with CHANNEL_DEAD to prevent any further + * IO operations on it. */ - + chanPtr->instanceData = NULL; - statePtr->flags |= CHANNEL_DEAD; + SetFlag(statePtr, CHANNEL_DEAD); } } } @@ -632,10 +635,10 @@ DeleteChannelTable( * refcount reaches zero. */ - hTblPtr = (Tcl_HashTable *) clientData; + hTblPtr = clientData; for (hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch); hPtr != NULL; hPtr = Tcl_FirstHashEntry(hTblPtr, &hSearch)) { - chanPtr = (Channel *) Tcl_GetHashValue(hPtr); + chanPtr = Tcl_GetHashValue(hPtr); statePtr = chanPtr->state; /* @@ -793,7 +796,7 @@ Tcl_RegisterChannel( { Tcl_HashTable *hTblPtr; /* Hash table of channels. */ Tcl_HashEntry *hPtr; /* Search variable. */ - int new; /* Is the hash entry new or does it exist? */ + int isNew; /* Is the hash entry new or does it exist? */ Channel *chanPtr; /* The actual channel. */ ChannelState *statePtr; /* State of the actual channel. */ @@ -811,15 +814,15 @@ Tcl_RegisterChannel( } if (interp != NULL) { hTblPtr = GetChannelTable(interp); - hPtr = Tcl_CreateHashEntry(hTblPtr, statePtr->channelName, &new); - if (new == 0) { - if (chan == (Tcl_Channel) Tcl_GetHashValue(hPtr)) { + hPtr = Tcl_CreateHashEntry(hTblPtr, statePtr->channelName, &isNew); + if (!isNew) { + if (chan == Tcl_GetHashValue(hPtr)) { return; } Tcl_Panic("Tcl_RegisterChannel: duplicate channel names"); } - Tcl_SetHashValue(hPtr, (ClientData) chanPtr); + Tcl_SetHashValue(hPtr, chanPtr); } statePtr->refCount++; } @@ -895,7 +898,7 @@ Tcl_UnregisterChannel( if ((statePtr->curOutPtr != NULL) && IsBufferReady(statePtr->curOutPtr)) { - statePtr->flags |= BUFFER_READY; + SetFlag(statePtr, BUFFER_READY); } Tcl_Preserve((ClientData)statePtr); if (!(statePtr->flags & BG_FLUSH_SCHEDULED)) { @@ -905,13 +908,13 @@ Tcl_UnregisterChannel( if (!(statePtr->flags & CHANNEL_CLOSED)) { if (Tcl_Close(interp, chan) != TCL_OK) { - statePtr->flags |= CHANNEL_CLOSED; + SetFlag(statePtr, CHANNEL_CLOSED); Tcl_Release((ClientData)statePtr); return TCL_ERROR; } } } - statePtr->flags |= CHANNEL_CLOSED; + SetFlag(statePtr, CHANNEL_CLOSED); Tcl_Release((ClientData)statePtr); } return TCL_OK; @@ -1098,9 +1101,7 @@ Tcl_GetChannel( if (hPtr == NULL) { Tcl_AppendResult(interp, "can not find channel named \"", chanName, "\"", NULL); -#if 0 - Tcl_SetErrorCode(interp, "CORE", "LOOKUP", "CHANNEL", chanName, NULL); -#endif + Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "CHANNEL", chanName, NULL); return NULL; } @@ -1110,7 +1111,7 @@ Tcl_GetChannel( * compensate where necessary to retrieve the topmost channel again. */ - chanPtr = (Channel *) Tcl_GetHashValue(hPtr); + chanPtr = Tcl_GetHashValue(hPtr); chanPtr = chanPtr->state->bottomChanPtr; if (modePtr != NULL) { *modePtr = (chanPtr->state->flags & (TCL_READABLE|TCL_WRITABLE)); @@ -1213,8 +1214,8 @@ Tcl_CreateChannel( * Set the channel up initially in AUTO input translation mode to accept * "\n", "\r" and "\r\n". Output translation mode is set to a platform * specific default value. The eofChar is set to 0 for both input and - * output, so that Tcl does not look for an in-file EOF indicator - * (e.g. ^Z) and does not append an EOF indicator to files. + * output, so that Tcl does not look for an in-file EOF indicator (e.g. + * ^Z) and does not append an EOF indicator to files. */ statePtr->inputTranslation = TCL_TRANSLATE_AUTO; @@ -1321,10 +1322,10 @@ Tcl_CreateChannel( * information about prevChan. * * Side effects: - * A new channel structure is allocated and linked below the existing - * channel. The channel operations and client data of the existing channel - * are copied down to the newly created channel, and the current channel - * has its operations replaced by the new typePtr. + * A new channel structure is allocated and linked below the existing + * channel. The channel operations and client data of the existing + * channel are copied down to the newly created channel, and the current + * channel has its operations replaced by the new typePtr. * *---------------------------------------------------------------------- */ @@ -1332,7 +1333,7 @@ Tcl_CreateChannel( Tcl_Channel Tcl_StackChannel( Tcl_Interp *interp, /* The interpreter we are working in */ - Tcl_ChannelType *typePtr, /* The channel type record for the new + Tcl_ChannelType *typePtr, /* The channel type record for the new * channel. */ ClientData instanceData, /* Instance specific data for the new * channel. */ @@ -1364,7 +1365,7 @@ Tcl_StackChannel( Tcl_AppendResult(interp, "couldn't find state for channel \"", Tcl_GetChannelName(prevChan), "\"", NULL); } - return (Tcl_Channel) NULL; + return NULL; } /* @@ -1386,7 +1387,7 @@ Tcl_StackChannel( "reading and writing both disallowed for channel \"", Tcl_GetChannelName(prevChan), "\"", NULL); } - return (Tcl_Channel) NULL; + return NULL; } /* @@ -1408,7 +1409,7 @@ Tcl_StackChannel( Tcl_AppendResult(interp, "could not flush channel \"", Tcl_GetChannelName(prevChan), "\"", NULL); } - return (Tcl_Channel) NULL; + return NULL; } statePtr->csPtr = csPtr; @@ -1580,7 +1581,7 @@ Tcl_UnstackChannel( * 'DiscardInputQueued' on that. */ - if (((statePtr->flags & TCL_READABLE) != 0) && + if ((((statePtr->flags & TCL_READABLE) != 0)) && ((statePtr->inQueueHead != NULL) || (chanPtr->inQueueHead != NULL))) { @@ -1645,7 +1646,7 @@ Tcl_UnstackChannel( * AK: Tcl_NotifyChannel may hold a reference to this block of memory */ - Tcl_EventuallyFree((ClientData) chanPtr, TCL_DYNAMIC); + Tcl_EventuallyFree(chanPtr, TCL_DYNAMIC); UpdateInterest(downChanPtr); if (result != 0) { @@ -2172,7 +2173,7 @@ FlushChannel( IsBufferFull(statePtr->curOutPtr)) || ((statePtr->flags & BUFFER_READY) && (statePtr->outQueueHead == NULL))) { - statePtr->flags &= ~BUFFER_READY; + ResetFlag(statePtr, BUFFER_READY); statePtr->curOutPtr->nextPtr = NULL; if (statePtr->outQueueHead == NULL) { statePtr->outQueueHead = statePtr->curOutPtr; @@ -2240,7 +2241,7 @@ FlushChannel( */ if (!(statePtr->flags & BG_FLUSH_SCHEDULED)) { - statePtr->flags |= BG_FLUSH_SCHEDULED; + SetFlag(statePtr, BG_FLUSH_SCHEDULED); UpdateInterest(chanPtr); } errorCode = 0; @@ -2342,7 +2343,7 @@ FlushChannel( if (wroteSome) { return errorCode; } else if (statePtr->outQueueHead == NULL) { - statePtr->flags &= ~BG_FLUSH_SCHEDULED; + ResetFlag(statePtr, BG_FLUSH_SCHEDULED); (chanPtr->typePtr->watchProc)(chanPtr->instanceData, statePtr->interestMask); } @@ -2536,7 +2537,7 @@ CloseChannel( downChanPtr->upChanPtr = NULL; chanPtr->typePtr = NULL; - Tcl_EventuallyFree((ClientData) chanPtr, TCL_DYNAMIC); + Tcl_EventuallyFree(chanPtr, TCL_DYNAMIC); return Tcl_Close(interp, (Tcl_Channel) downChanPtr); } @@ -2549,8 +2550,8 @@ CloseChannel( chanPtr->typePtr = NULL; - Tcl_EventuallyFree((ClientData) statePtr, TCL_DYNAMIC); - Tcl_EventuallyFree((ClientData) chanPtr, TCL_DYNAMIC); + Tcl_EventuallyFree(statePtr, TCL_DYNAMIC); + Tcl_EventuallyFree(chanPtr, TCL_DYNAMIC); return errorCode; } @@ -2845,7 +2846,7 @@ Tcl_Close( } return TCL_ERROR; } - statePtr->flags |= CHANNEL_INCLOSE; + SetFlag(statePtr, CHANNEL_INCLOSE); /* * When the channel has an escape sequence driven encoding such as @@ -2885,14 +2886,14 @@ Tcl_Close( ckfree((char *) cbPtr); } - statePtr->flags &= ~CHANNEL_INCLOSE; + ResetFlag(statePtr, CHANNEL_INCLOSE); /* * Ensure that the last output buffer will be flushed. */ if ((statePtr->curOutPtr != NULL) && IsBufferReady(statePtr->curOutPtr)) { - statePtr->flags |= BUFFER_READY; + SetFlag(statePtr, BUFFER_READY); } /* @@ -2913,7 +2914,7 @@ Tcl_Close( * be flushed and closed asynchronously. */ - statePtr->flags |= CHANNEL_CLOSED; + SetFlag(statePtr, CHANNEL_CLOSED); flushcode = FlushChannel(interp, chanPtr, 0); @@ -3764,13 +3765,13 @@ CheckFlush( if ((statePtr->flags & BUFFER_READY) == 0) { if (IsBufferFull(bufPtr)) { - statePtr->flags |= BUFFER_READY; + SetFlag(statePtr, BUFFER_READY); } else if (statePtr->flags & CHANNEL_LINEBUFFERED) { if (newlineFlag != 0) { - statePtr->flags |= BUFFER_READY; + SetFlag(statePtr, BUFFER_READY); } } else if (statePtr->flags & CHANNEL_UNBUFFERED) { - statePtr->flags |= BUFFER_READY; + SetFlag(statePtr, BUFFER_READY); } } if (statePtr->flags & BUFFER_READY) { @@ -3873,9 +3874,9 @@ Tcl_GetsObj( } /* - * A binary version of Tcl_GetsObj. This could also handle encodings - * that are ascii-7 pure (iso8859, utf-8, ...) with a final encoding - * conversion done on objPtr. + * A binary version of Tcl_GetsObj. This could also handle encodings that + * are ascii-7 pure (iso8859, utf-8, ...) with a final encoding conversion + * done on objPtr. */ if ((statePtr->encoding == NULL) @@ -3907,6 +3908,7 @@ Tcl_GetsObj( if (encoding == NULL) { ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + if (tsdPtr->binaryEncoding == NULL) { tsdPtr->binaryEncoding = Tcl_GetEncoding(NULL, "iso8859-1"); Tcl_CreateThreadExitHandler(FreeBinaryEncoding, NULL); @@ -4002,7 +4004,7 @@ Tcl_GetsObj( offset = eol - objPtr->bytes; dst = dstEnd; if (FilterInputBytes(chanPtr, &gs) != 0) { - goto restore; + goto restore; } dstEnd = dst + gs.bytesWrote; eol = objPtr->bytes + offset; @@ -4024,7 +4026,7 @@ Tcl_GetsObj( eol = dst; skip = 1; if (statePtr->flags & INPUT_SAW_CR) { - statePtr->flags &= ~INPUT_SAW_CR; + ResetFlag(statePtr, INPUT_SAW_CR); if ((eol < dstEnd) && (*eol == '\n')) { /* * Skip the raw bytes that make up the '\n'. @@ -4066,7 +4068,7 @@ Tcl_GetsObj( if (eol >= dstEnd) { eol--; - statePtr->flags |= INPUT_SAW_CR; + SetFlag(statePtr, INPUT_SAW_CR); goto gotEOL; } } @@ -4088,7 +4090,7 @@ Tcl_GetsObj( */ dstEnd = eof; - statePtr->flags |= CHANNEL_EOF | CHANNEL_STICKY_EOF; + SetFlag(statePtr, CHANNEL_EOF | CHANNEL_STICKY_EOF); statePtr->inputEncodingFlags |= TCL_ENCODING_END; } if (statePtr->flags & CHANNEL_EOF) { @@ -4136,7 +4138,7 @@ Tcl_GetsObj( Tcl_SetObjLength(objPtr, eol - objPtr->bytes); CommonGetsCleanup(chanPtr); - statePtr->flags &= ~CHANNEL_BLOCKED; + ResetFlag(statePtr, CHANNEL_BLOCKED); copiedTotal = gs.totalChars + gs.charsWrote - skip; goto done; @@ -4173,7 +4175,7 @@ Tcl_GetsObj( * read would be able to consume the buffered data. */ - statePtr->flags |= CHANNEL_NEED_MORE_DATA; + SetFlag(statePtr, CHANNEL_NEED_MORE_DATA); copiedTotal = -1; /* @@ -4269,7 +4271,7 @@ TclGetsObjBinary( if (statePtr->flags & CHANNEL_NONBLOCKING) { goto restore; } - statePtr->flags &= ~CHANNEL_BLOCKED; + ResetFlag(statePtr, CHANNEL_BLOCKED); } if (GetInput(chanPtr) != 0) { goto restore; @@ -4277,7 +4279,7 @@ TclGetsObjBinary( bufPtr = statePtr->inQueueTail; } - dst = (unsigned char*) RemovePoint(bufPtr); + dst = (unsigned char *) RemovePoint(bufPtr); dstEnd = dst + BytesLeft(bufPtr); /* @@ -4314,7 +4316,7 @@ TclGetsObjBinary( * character in the output string. */ - statePtr->flags |= CHANNEL_EOF | CHANNEL_STICKY_EOF; + SetFlag(statePtr, CHANNEL_EOF | CHANNEL_STICKY_EOF); statePtr->inputEncodingFlags |= TCL_ENCODING_END; } if (statePtr->flags & CHANNEL_EOF) { @@ -4375,7 +4377,7 @@ TclGetsObjBinary( */ CommonGetsCleanup(chanPtr); - statePtr->flags &= ~CHANNEL_BLOCKED; + ResetFlag(statePtr, CHANNEL_BLOCKED); copiedTotal = byteLen; goto done; @@ -4411,7 +4413,7 @@ TclGetsObjBinary( * read would be able to consume the buffered data. */ - statePtr->flags |= CHANNEL_NEED_MORE_DATA; + SetFlag(statePtr, CHANNEL_NEED_MORE_DATA); copiedTotal = -1; /* @@ -4428,6 +4430,7 @@ TclGetsObjBinary( *--------------------------------------------------------------------------- * * FreeBinaryEncoding -- + * * Frees any "iso8859-1" Tcl_Encoding created by [gets] on a binary * channel in a thread as part of that thread's finalization. * @@ -4442,6 +4445,7 @@ FreeBinaryEncoding( ClientData dummy) /* Not used */ { ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + if (tsdPtr->binaryEncoding != NULL) { Tcl_FreeEncoding(tsdPtr->binaryEncoding); tsdPtr->binaryEncoding = NULL; @@ -4483,7 +4487,7 @@ FilterInputBytes( char *raw, *rawStart, *dst; int offset, toRead, dstNeeded, spaceLeft, result, rawLen, length; Tcl_Obj *objPtr; -#define ENCODING_LINESIZE 20 /* Lower bound on how many bytes to convert at +#define ENCODING_LINESIZE 20 /* Lower bound on how many bytes to convert at * a time. Since we don't know a priori how * many bytes of storage this many source * bytes will use, we actually need at least @@ -4520,7 +4524,7 @@ FilterInputBytes( gsPtr->rawRead = 0; return -1; } - statePtr->flags &= ~CHANNEL_BLOCKED; + ResetFlag(statePtr, CHANNEL_BLOCKED); } if (GetInput(chanPtr) != 0) { gsPtr->charsWrote = 0; @@ -4883,7 +4887,7 @@ Tcl_ReadRaw( if (statePtr->flags & CHANNEL_NONBLOCKING) { goto done; } - statePtr->flags &= ~CHANNEL_BLOCKED; + ResetFlag(statePtr, CHANNEL_BLOCKED); } #ifdef TCL_IO_TRACK_OS_FOR_DRIVER_WITH_BAD_BLOCKING @@ -4932,7 +4936,7 @@ Tcl_ReadRaw( */ if (nread < (bytesToRead - copied)) { - statePtr->flags |= CHANNEL_BLOCKED; + SetFlag(statePtr, CHANNEL_BLOCKED); } #ifdef TCL_IO_TRACK_OS_FOR_DRIVER_WITH_BAD_BLOCKING @@ -4942,12 +4946,12 @@ Tcl_ReadRaw( * flag. */ - statePtr->flags &= ~CHANNEL_HAS_MORE_DATA; + ResetFlag(statePtr, CHANNEL_HAS_MORE_DATA); } #endif /* TCL_IO_TRACK_OS_FOR_DRIVER_WITH_BAD_BLOCKING */ } else if (nread == 0) { - statePtr->flags |= CHANNEL_EOF; + SetFlag(statePtr, CHANNEL_EOF); statePtr->inputEncodingFlags |= TCL_ENCODING_END; } else if (nread < 0) { @@ -4961,7 +4965,7 @@ Tcl_ReadRaw( return copied; } - statePtr->flags |= CHANNEL_BLOCKED; + SetFlag(statePtr, CHANNEL_BLOCKED); result = EAGAIN; } @@ -5140,7 +5144,7 @@ DoReadChars( if (statePtr->flags & CHANNEL_NONBLOCKING) { break; } - statePtr->flags &= ~CHANNEL_BLOCKED; + ResetFlag(statePtr, CHANNEL_BLOCKED); } result = GetInput(chanPtr); if (result != 0) { @@ -5156,7 +5160,7 @@ DoReadChars( } } - statePtr->flags &= ~CHANNEL_BLOCKED; + ResetFlag(statePtr, CHANNEL_BLOCKED); if (encoding == NULL) { Tcl_SetByteArrayLength(objPtr, offset); } else { @@ -5250,7 +5254,7 @@ ReadBytes( dst += offset; if (statePtr->flags & INPUT_NEED_NL) { - statePtr->flags &= ~INPUT_NEED_NL; + ResetFlag(statePtr, INPUT_NEED_NL); if ((srcLen == 0) || (*src != '\n')) { *dst = '\r'; *offsetPtr += 1; @@ -5379,11 +5383,10 @@ ReadChars( dst = objPtr->bytes + offset; /* - * SF Tcl Bug 1462248 - * The cause of the crash reported in the referenced bug is this: + * [Bug 1462248]: The cause of the crash reported in this bug is this: * * - ReadChars, called with a single buffer, with a incomplete - * multi-byte character at the end (only the first byte of it). + * multi-byte character at the end (only the first byte of it). * - Encoding translation fails, asks for more data * - Data is read, and eof is reached, TCL_ENCODING_END (TEE) is set. * - ReadChar is called again, converts the first buffer, but due to TEE @@ -5415,13 +5418,13 @@ ReadChars( if ((statePtr->inputEncodingFlags & TCL_ENCODING_END) && (bufPtr->nextPtr != NULL)) { - /* + /* * TEE is set for a buffer which is not the last. Squash it for now, * and restore it later, before yielding control to our caller. */ - statePtr->inputEncodingFlags &= ~TCL_ENCODING_END; - encEndFlagSuppressed = 1; + statePtr->inputEncodingFlags &= ~TCL_ENCODING_END; + encEndFlagSuppressed = 1; } oldState = statePtr->inputEncodingState; @@ -5430,7 +5433,7 @@ ReadChars( * We want a '\n' because the last character we saw was '\r'. */ - statePtr->flags &= ~INPUT_NEED_NL; + ResetFlag(statePtr, INPUT_NEED_NL); Tcl_ExternalToUtf(NULL, statePtr->encoding, src, srcLen, statePtr->inputEncodingFlags, &statePtr->inputEncodingState, dst, TCL_UTF_MAX + 1, &srcRead, &dstWrote, &numChars); @@ -5461,7 +5464,7 @@ ReadChars( dstNeeded + TCL_UTF_MAX, &srcRead, &dstWrote, &numChars); if (encEndFlagSuppressed) { - statePtr->inputEncodingFlags |= TCL_ENCODING_END; + statePtr->inputEncodingFlags |= TCL_ENCODING_END; } if (srcRead == 0) { @@ -5487,7 +5490,7 @@ ReadChars( * conversion before the current one was complete. */ - statePtr->flags |= CHANNEL_NEED_MORE_DATA; + SetFlag(statePtr, CHANNEL_NEED_MORE_DATA); } return -1; } @@ -5668,7 +5671,7 @@ TranslateInputEOL( if (*src == '\r') { src++; if (src >= srcMax) { - statePtr->flags |= INPUT_NEED_NL; + SetFlag(statePtr, INPUT_NEED_NL); } else if (*src == '\n') { *dst++ = *src++; } else { @@ -5695,13 +5698,13 @@ TranslateInputEOL( if (*src == '\n') { src++; } - statePtr->flags &= ~INPUT_SAW_CR; + ResetFlag(statePtr, INPUT_SAW_CR); } for ( ; src < srcEnd; ) { if (*src == '\r') { src++; if (src >= srcMax) { - statePtr->flags |= INPUT_SAW_CR; + SetFlag(statePtr, INPUT_SAW_CR); } else if (*src == '\n') { if (srcEnd < srcMax) { srcEnd++; @@ -5729,9 +5732,9 @@ TranslateInputEOL( * character in the output string. */ - statePtr->flags |= CHANNEL_EOF | CHANNEL_STICKY_EOF; + SetFlag(statePtr, CHANNEL_EOF | CHANNEL_STICKY_EOF); statePtr->inputEncodingFlags |= TCL_ENCODING_END; - statePtr->flags &= ~(INPUT_SAW_CR | INPUT_NEED_NL); + ResetFlag(statePtr, INPUT_SAW_CR | INPUT_NEED_NL); return 1; } @@ -5799,7 +5802,7 @@ Tcl_Ungets( if (statePtr->flags & CHANNEL_STICKY_EOF) { goto done; } - statePtr->flags &= ~(CHANNEL_BLOCKED | CHANNEL_EOF); + ResetFlag(statePtr, CHANNEL_BLOCKED | CHANNEL_EOF); bufPtr = AllocChannelBuffer(len); memcpy(InsertPoint(bufPtr), str, (size_t) len); @@ -5869,7 +5872,7 @@ Tcl_Flush( */ if ((statePtr->curOutPtr != NULL) && IsBufferReady(statePtr->curOutPtr)) { - statePtr->flags |= BUFFER_READY; + SetFlag(statePtr, BUFFER_READY); } result = FlushChannel(NULL, chanPtr, 0); @@ -6095,7 +6098,7 @@ GetInput( */ if (nread < toRead) { - statePtr->flags |= CHANNEL_BLOCKED; + SetFlag(statePtr, CHANNEL_BLOCKED); } #ifdef TCL_IO_TRACK_OS_FOR_DRIVER_WITH_BAD_BLOCKING @@ -6105,16 +6108,16 @@ GetInput( * flag. */ - statePtr->flags &= ~CHANNEL_HAS_MORE_DATA; + ResetFlag(statePtr, CHANNEL_HAS_MORE_DATA); } #endif /* TCL_IO_TRACK_OS_FOR_DRIVER_WITH_BAD_BLOCKING */ } else if (nread == 0) { - statePtr->flags |= CHANNEL_EOF; + SetFlag(statePtr, CHANNEL_EOF); statePtr->inputEncodingFlags |= TCL_ENCODING_END; } else if (nread < 0) { if ((result == EWOULDBLOCK) || (result == EAGAIN)) { - statePtr->flags |= CHANNEL_BLOCKED; + SetFlag(statePtr, CHANNEL_BLOCKED); result = EAGAIN; } Tcl_SetErrno(result); @@ -6241,9 +6244,9 @@ Tcl_Seek( if (result != 0) { return Tcl_LongAsWide(-1); } - statePtr->flags &= ~CHANNEL_NONBLOCKING; + ResetFlag(statePtr, CHANNEL_NONBLOCKING); if (statePtr->flags & BG_FLUSH_SCHEDULED) { - statePtr->flags &= ~BG_FLUSH_SCHEDULED; + ResetFlag(statePtr, BG_FLUSH_SCHEDULED); } } @@ -6253,7 +6256,7 @@ Tcl_Seek( */ if ((statePtr->curOutPtr != NULL) && IsBufferReady(statePtr->curOutPtr)) { - statePtr->flags |= BUFFER_READY; + SetFlag(statePtr, BUFFER_READY); } /* @@ -6299,7 +6302,7 @@ Tcl_Seek( */ if (wasAsync) { - statePtr->flags |= CHANNEL_NONBLOCKING; + SetFlag(statePtr, CHANNEL_NONBLOCKING); result = StackSetBlockMode(chanPtr, TCL_MODE_NONBLOCKING); if (result != 0) { return Tcl_LongAsWide(-1); @@ -6612,9 +6615,9 @@ CheckChannelErrors( */ if ((statePtr->flags & CHANNEL_STICKY_EOF) == 0) { - statePtr->flags &= ~CHANNEL_EOF; + ResetFlag(statePtr, CHANNEL_EOF); } - statePtr->flags &= ~(CHANNEL_BLOCKED | CHANNEL_NEED_MORE_DATA); + ResetFlag(statePtr, CHANNEL_BLOCKED | CHANNEL_NEED_MORE_DATA); } return 0; @@ -7253,12 +7256,12 @@ Tcl_SetChannelOption( ~(CHANNEL_UNBUFFERED|CHANNEL_LINEBUFFERED); } else if ((newValue[0] == 'l') && (strncmp(newValue, "line", len) == 0)) { - statePtr->flags &= ~CHANNEL_UNBUFFERED; - statePtr->flags |= CHANNEL_LINEBUFFERED; + ResetFlag(statePtr, CHANNEL_UNBUFFERED); + SetFlag(statePtr, CHANNEL_LINEBUFFERED); } else if ((newValue[0] == 'n') && (strncmp(newValue, "none", len) == 0)) { - statePtr->flags &= ~CHANNEL_LINEBUFFERED; - statePtr->flags |= CHANNEL_UNBUFFERED; + ResetFlag(statePtr, CHANNEL_LINEBUFFERED); + SetFlag(statePtr, CHANNEL_UNBUFFERED); } else { if (interp) { Tcl_AppendResult(interp, "bad value for -buffering: " @@ -7302,7 +7305,7 @@ Tcl_SetChannelOption( statePtr->inputEncodingFlags = TCL_ENCODING_START; statePtr->outputEncodingState = NULL; statePtr->outputEncodingFlags = TCL_ENCODING_START; - statePtr->flags &= ~CHANNEL_NEED_MORE_DATA; + ResetFlag(statePtr, CHANNEL_NEED_MORE_DATA); UpdateInterest(chanPtr); } else if (HaveOpt(2, "-eofchar")) { if (Tcl_SplitList(interp, newValue, &argc, &argv) == TCL_ERROR) { @@ -7409,7 +7412,7 @@ Tcl_SetChannelOption( if (translation != statePtr->inputTranslation) { statePtr->inputTranslation = translation; - statePtr->flags &= ~(INPUT_SAW_CR | CHANNEL_NEED_MORE_DATA); + ResetFlag(statePtr, INPUT_SAW_CR | CHANNEL_NEED_MORE_DATA); UpdateInterest(chanPtr); } } @@ -7482,12 +7485,11 @@ Tcl_SetChannelOption( */ if (statePtr->outputStage != NULL) { - ckfree((char *) statePtr->outputStage); + ckfree(statePtr->outputStage); statePtr->outputStage = NULL; } if ((statePtr->encoding != NULL) && (statePtr->flags & TCL_WRITABLE)) { - statePtr->outputStage = (char *) - ckalloc((unsigned) (statePtr->bufSize + 2)); + statePtr->outputStage = ckalloc((unsigned) (statePtr->bufSize + 2)); } return TCL_OK; } @@ -7536,7 +7538,7 @@ CleanupChannelHandlers( } Tcl_DeleteChannelHandler((Tcl_Channel) chanPtr, - TclChannelEventScriptInvoker, (ClientData) sPtr); + TclChannelEventScriptInvoker, sPtr); TclDecrRefCount(sPtr->scriptPtr); ckfree((char *) sPtr); @@ -7591,7 +7593,7 @@ Tcl_NotifyChannel( (statePtr->flags & CHANNEL_NONBLOCKING) && (Tcl_ChannelBlockModeProc(chanPtr->typePtr) == NULL) && !(statePtr->flags & CHANNEL_TIMER_FEV)) { - statePtr->flags |= CHANNEL_HAS_MORE_DATA; + SetFlag(statePtr, CHANNEL_HAS_MORE_DATA); } #endif /* TCL_IO_TRACK_OS_FOR_DRIVER_WITH_BAD_BLOCKING */ @@ -7644,8 +7646,8 @@ Tcl_NotifyChannel( * Preserve the channel struct in case the script closes it. */ - Tcl_Preserve((ClientData) channel); - Tcl_Preserve((ClientData) statePtr); + Tcl_Preserve(channel); + Tcl_Preserve(statePtr); /* * If we are flushing in the background, be sure to call FlushChannel for @@ -7692,8 +7694,8 @@ Tcl_NotifyChannel( UpdateInterest(chanPtr); } - Tcl_Release((ClientData) statePtr); - Tcl_Release((ClientData) channel); + Tcl_Release(statePtr); + Tcl_Release(channel); tsdPtr->nestedHandlerPtr = nh.nestedHandlerPtr; } @@ -7787,7 +7789,7 @@ UpdateInterest( if (!statePtr->timer) { statePtr->timer = Tcl_CreateTimerHandler(0, ChannelTimerProc, - (ClientData) chanPtr); + chanPtr); } } } @@ -7815,7 +7817,7 @@ static void ChannelTimerProc( ClientData clientData) { - Channel *chanPtr = (Channel *) clientData; + Channel *chanPtr = clientData; ChannelState *statePtr = chanPtr->state; /* State info for channel */ @@ -7828,8 +7830,7 @@ ChannelTimerProc( * before UpdateInterest gets called by Tcl_NotifyChannel. */ - statePtr->timer = Tcl_CreateTimerHandler(0, ChannelTimerProc, - (ClientData) chanPtr); + statePtr->timer = Tcl_CreateTimerHandler(0, ChannelTimerProc,chanPtr); #ifdef TCL_IO_TRACK_OS_FOR_DRIVER_WITH_BAD_BLOCKING /* @@ -7842,18 +7843,18 @@ ChannelTimerProc( if ((statePtr->flags & CHANNEL_NONBLOCKING) && (Tcl_ChannelBlockModeProc(chanPtr->typePtr) == NULL)) { - statePtr->flags |= CHANNEL_TIMER_FEV; + SetFlag(statePtr, CHANNEL_TIMER_FEV); } #endif /* TCL_IO_TRACK_OS_FOR_DRIVER_WITH_BAD_BLOCKING */ - Tcl_Preserve((ClientData) statePtr); + Tcl_Preserve(statePtr); Tcl_NotifyChannel((Tcl_Channel)chanPtr, TCL_READABLE); #ifdef TCL_IO_TRACK_OS_FOR_DRIVER_WITH_BAD_BLOCKING - statePtr->flags &= ~CHANNEL_TIMER_FEV; + ResetFlag(statePtr, CHANNEL_TIMER_FEV); #endif /* TCL_IO_TRACK_OS_FOR_DRIVER_WITH_BAD_BLOCKING */ - Tcl_Release((ClientData) statePtr); + Tcl_Release(statePtr); } else { statePtr->timer = NULL; UpdateInterest(chanPtr); @@ -8070,7 +8071,7 @@ DeleteScriptRecord( } Tcl_DeleteChannelHandler((Tcl_Channel) chanPtr, - TclChannelEventScriptInvoker, (ClientData) esPtr); + TclChannelEventScriptInvoker, esPtr); TclDecrRefCount(esPtr->scriptPtr); ckfree((char *) esPtr); @@ -8120,7 +8121,7 @@ CreateScriptRecord( if (esPtr == NULL) { esPtr = (EventScriptRecord *) ckalloc(sizeof(EventScriptRecord)); Tcl_CreateChannelHandler((Tcl_Channel) chanPtr, mask, - TclChannelEventScriptInvoker, (ClientData) esPtr); + TclChannelEventScriptInvoker, esPtr); esPtr->nextPtr = statePtr->scriptRecordPtr; statePtr->scriptRecordPtr = esPtr; } @@ -8161,10 +8162,10 @@ TclChannelEventScriptInvoker( * in. */ int result; /* Result of call to eval script. */ - esPtr = (EventScriptRecord *) clientData; - chanPtr = esPtr->chanPtr; - mask = esPtr->mask; - interp = esPtr->interp; + esPtr = clientData; + chanPtr = esPtr->chanPtr; + mask = esPtr->mask; + interp = esPtr->interp; /* * We must preserve the interpreter so we can report errors on it later. @@ -8172,7 +8173,7 @@ TclChannelEventScriptInvoker( * by Tcl_NotifyChannel before calling channel handlers. */ - Tcl_Preserve((ClientData) interp); + Tcl_Preserve(interp); result = Tcl_EvalObjEx(interp, esPtr->scriptPtr, TCL_EVAL_GLOBAL); /* @@ -8189,7 +8190,7 @@ TclChannelEventScriptInvoker( } TclBackgroundException(interp, result); } - Tcl_Release((ClientData) interp); + Tcl_Release(interp); } /* @@ -8241,7 +8242,7 @@ Tcl_FileEventObjCmd( chanName = TclGetString(objv[1]); chan = Tcl_GetChannel(interp, chanName, NULL); - if (chan == (Tcl_Channel) NULL) { + if (chan == NULL) { return TCL_ERROR; } chanPtr = (Channel *) chan; @@ -8492,7 +8493,7 @@ CopyData( size = DoReadChars(inStatePtr->topChanPtr, bufObj, sizeb, 0 /* No append */); } - underflow = (size >= 0) && (size < sizeb); /* Input underflow */ + underflow = (size >= 0) && (size < sizeb); /* Input underflow */ if (size < 0) { readError: @@ -8523,11 +8524,10 @@ CopyData( } if (! Tcl_Eof(inChan) && !(mask & TCL_READABLE)) { if (mask & TCL_WRITABLE) { - Tcl_DeleteChannelHandler(outChan, CopyEventProc, - (ClientData) csPtr); + Tcl_DeleteChannelHandler(outChan, CopyEventProc, csPtr); } Tcl_CreateChannelHandler(inChan, TCL_READABLE, CopyEventProc, - (ClientData) csPtr); + csPtr); } if (size == 0) { if (bufObj != NULL) { @@ -8613,11 +8613,10 @@ CopyData( if (!underflow && (outStatePtr->flags & BG_FLUSH_SCHEDULED)) { if (!(mask & TCL_WRITABLE)) { if (mask & TCL_READABLE) { - Tcl_DeleteChannelHandler(inChan, CopyEventProc, - (ClientData) csPtr); + Tcl_DeleteChannelHandler(inChan, CopyEventProc, csPtr); } Tcl_CreateChannelHandler(outChan, TCL_WRITABLE, - CopyEventProc, (ClientData) csPtr); + CopyEventProc, csPtr); } if (bufObj != NULL) { TclDecrRefCount(bufObj); @@ -8639,7 +8638,7 @@ CopyData( if (mask == 0) { Tcl_CreateChannelHandler(outChan, TCL_WRITABLE, CopyEventProc, - (ClientData) csPtr); + csPtr); } if (bufObj != NULL) { TclDecrRefCount(bufObj); @@ -8671,7 +8670,7 @@ CopyData( cmdPtr = Tcl_DuplicateObj(cmdPtr); Tcl_IncrRefCount(cmdPtr); StopCopy(csPtr); - Tcl_Preserve((ClientData) interp); + Tcl_Preserve(interp); Tcl_ListObjAppendElement(interp, cmdPtr, Tcl_NewIntObj(total)); if (errObj) { @@ -8683,7 +8682,7 @@ CopyData( result = TCL_ERROR; } TclDecrRefCount(cmdPtr); - Tcl_Release((ClientData) interp); + Tcl_Release(interp); } else { StopCopy(csPtr); if (interp) { @@ -8739,9 +8738,9 @@ DoRead( */ if (!(statePtr->flags & CHANNEL_STICKY_EOF)) { - statePtr->flags &= ~CHANNEL_EOF; + ResetFlag(statePtr, CHANNEL_EOF); } - statePtr->flags &= ~(CHANNEL_BLOCKED | CHANNEL_NEED_MORE_DATA); + ResetFlag(statePtr, CHANNEL_BLOCKED | CHANNEL_NEED_MORE_DATA); for (copied = 0; copied < toRead; copied += copiedNow) { copiedNow = CopyAndTranslateBuffer(statePtr, bufPtr + copied, @@ -8754,7 +8753,7 @@ DoRead( if (statePtr->flags & CHANNEL_NONBLOCKING) { goto done; } - statePtr->flags &= ~CHANNEL_BLOCKED; + ResetFlag(statePtr, CHANNEL_BLOCKED); } result = GetInput(chanPtr); if (result != 0) { @@ -8766,7 +8765,7 @@ DoRead( } } - statePtr->flags &= ~CHANNEL_BLOCKED; + ResetFlag(statePtr, CHANNEL_BLOCKED); /* * Update the notifier state so we don't block while there is still data @@ -8881,7 +8880,7 @@ CopyAndTranslateBuffer( if ((statePtr->flags & (INPUT_SAW_CR | CHANNEL_EOF)) == (INPUT_SAW_CR | CHANNEL_EOF)) { result[0] = '\r'; - statePtr->flags &= ~INPUT_SAW_CR; + ResetFlag(statePtr, INPUT_SAW_CR); return 1; } return 0; @@ -8904,14 +8903,14 @@ CopyAndTranslateBuffer( for (src = result; src < end; src++) { curByte = *src; if (curByte == '\n') { - statePtr->flags &= ~INPUT_SAW_CR; + ResetFlag(statePtr, INPUT_SAW_CR); } else if (statePtr->flags & INPUT_SAW_CR) { - statePtr->flags &= ~INPUT_SAW_CR; + ResetFlag(statePtr, INPUT_SAW_CR); *dst = '\r'; dst++; } if (curByte == '\r') { - statePtr->flags |= INPUT_SAW_CR; + SetFlag(statePtr, INPUT_SAW_CR); } else { *dst = (char) curByte; dst++; @@ -8944,7 +8943,7 @@ CopyAndTranslateBuffer( for (src = result; src < end; src++) { curByte = *src; if (curByte == '\r') { - statePtr->flags |= INPUT_SAW_CR; + SetFlag(statePtr, INPUT_SAW_CR); *dst = '\n'; dst++; } else { @@ -8952,7 +8951,7 @@ CopyAndTranslateBuffer( *dst = (char) curByte; dst++; } - statePtr->flags &= ~INPUT_SAW_CR; + ResetFlag(statePtr, INPUT_SAW_CR); } } copied = dst - result; @@ -8976,7 +8975,7 @@ CopyAndTranslateBuffer( * caller. */ - statePtr->flags |= CHANNEL_EOF | CHANNEL_STICKY_EOF; + SetFlag(statePtr, CHANNEL_EOF | CHANNEL_STICKY_EOF); statePtr->inputEncodingFlags |= TCL_ENCODING_END; copied = i; break; @@ -9219,7 +9218,7 @@ DoWrite( outBufPtr->nextAdded += destCopied; if (!(statePtr->flags & BUFFER_READY)) { if (IsBufferFull(outBufPtr)) { - statePtr->flags |= BUFFER_READY; + SetFlag(statePtr, BUFFER_READY); } else if (statePtr->flags & CHANNEL_LINEBUFFERED) { for (sPtr = src, i = 0, foundNewline = 0; (i < srcCopied) && (!foundNewline); @@ -9230,10 +9229,10 @@ DoWrite( } } if (foundNewline) { - statePtr->flags |= BUFFER_READY; + SetFlag(statePtr, BUFFER_READY); } } else if (statePtr->flags & CHANNEL_UNBUFFERED) { - statePtr->flags |= BUFFER_READY; + SetFlag(statePtr, BUFFER_READY); } } @@ -9330,10 +9329,10 @@ StopCopy( if (csPtr->cmdPtr) { Tcl_DeleteChannelHandler((Tcl_Channel) csPtr->readPtr, CopyEventProc, - (ClientData) csPtr); + csPtr); if (csPtr->readPtr != csPtr->writePtr) { Tcl_DeleteChannelHandler((Tcl_Channel) csPtr->writePtr, - CopyEventProc, (ClientData) csPtr); + CopyEventProc, csPtr); } TclDecrRefCount(csPtr->cmdPtr); } @@ -9431,7 +9430,7 @@ SetBlockMode( * We still need the interp as the destination of the move. */ - if (!TclChanCaughtErrorBypass (interp, (Tcl_Channel) chanPtr)) { + if (!TclChanCaughtErrorBypass(interp, (Tcl_Channel) chanPtr)) { Tcl_AppendResult(interp, "error setting blocking mode: ", Tcl_PosixError(interp), NULL); } @@ -9448,9 +9447,9 @@ SetBlockMode( return TCL_ERROR; } if (mode == TCL_MODE_BLOCKING) { - statePtr->flags &= ~(CHANNEL_NONBLOCKING | BG_FLUSH_SCHEDULED); + ResetFlag(statePtr, CHANNEL_NONBLOCKING | BG_FLUSH_SCHEDULED); } else { - statePtr->flags |= CHANNEL_NONBLOCKING; + SetFlag(statePtr, CHANNEL_NONBLOCKING); } return TCL_OK; } @@ -10335,7 +10334,7 @@ FixLevelCode( } else if (0 == strcmp(TclGetString(lv[i]), "-code")) { if (newcode >= 0) { lvn[j++] = lv[i]; - lvn[j++] = Tcl_NewIntObj (newcode); + lvn[j++] = Tcl_NewIntObj(newcode); newcode = -1; cignore = 1; continue; @@ -10352,10 +10351,10 @@ FixLevelCode( lvn[j++] = lv[i+1]; } if (newlevel >= 0) { - Tcl_Panic ("Defined newlevel not used in rewrite"); + Tcl_Panic("Defined newlevel not used in rewrite"); } - if (newcode >= 0) { - Tcl_Panic ("Defined newcode not used in rewrite"); + if (newcode >= 0) { + Tcl_Panic("Defined newcode not used in rewrite"); } if (explicitResult) { |