summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authorandreas_kupries <akupries@shaw.ca>2008-04-07 19:42:59 (GMT)
committerandreas_kupries <akupries@shaw.ca>2008-04-07 19:42:59 (GMT)
commitfa20138d013c65c2cfe37314fd60f27952d673ab (patch)
tree6fe8274a6543c946fbdfcc8712d0bc9f24827534 /generic
parenta76dcd048a06f29c220a90dfb622e30f546b7f21 (diff)
downloadtcl-fa20138d013c65c2cfe37314fd60f27952d673ab.zip
tcl-fa20138d013c65c2cfe37314fd60f27952d673ab.tar.gz
tcl-fa20138d013c65c2cfe37314fd60f27952d673ab.tar.bz2
* generic/tclIO.c (BUSY_STATE, CheckChannelErrors,
TclCopyChannel): New macro, and the places using it. This change allows for bi-directional fcopy on channels. Thanks to Alexandre Ferrieux <ferrieux@users.sourceforge.net> for the patch.
Diffstat (limited to 'generic')
-rw-r--r--generic/tclIO.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c
index b44c1e6..60d60ea 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.139 2008/04/03 18:06:01 andreas_kupries Exp $
+ * RCS: @(#) $Id: tclIO.c,v 1.140 2008/04/07 19:42:59 andreas_kupries Exp $
*/
#include "tclInt.h"
@@ -221,6 +221,10 @@ static Tcl_ObjType tclChannelType = {
#define SET_CHANNELSTATE(objPtr, storePtr) \
((objPtr)->internalRep.otherValuePtr = (void *) (storePtr))
+#define BUSY_STATE(st,fl) \
+ ((st)->csPtr && \
+ ( (((fl)&TCL_READABLE)&&((st)->csPtr->readPtr ==(st)->topChanPtr)) || \
+ (((fl)&TCL_WRITABLE)&&((st)->csPtr->writePtr==(st)->topChanPtr))))
/*
*---------------------------------------------------------------------------
@@ -6698,7 +6702,7 @@ CheckChannelErrors(
* retrieving and transforming the data to copy.
*/
- if ((statePtr->csPtr != NULL) && ((flags & CHANNEL_RAW_MODE) == 0)) {
+ if (BUSY_STATE(statePtr,flags) && ((flags & CHANNEL_RAW_MODE) == 0)) {
Tcl_SetErrno(EBUSY);
return -1;
}
@@ -8429,14 +8433,14 @@ TclCopyChannel(
inStatePtr = inPtr->state;
outStatePtr = outPtr->state;
- if (inStatePtr->csPtr) {
+ if (BUSY_STATE(inStatePtr,TCL_READABLE)) {
if (interp) {
Tcl_AppendResult(interp, "channel \"",
Tcl_GetChannelName(inChan), "\" is busy", NULL);
}
return TCL_ERROR;
}
- if (outStatePtr->csPtr) {
+ if (BUSY_STATE(outStatePtr,TCL_WRITABLE)) {
if (interp) {
Tcl_AppendResult(interp, "channel \"",
Tcl_GetChannelName(outChan), "\" is busy", NULL);