summaryrefslogtreecommitdiffstats
path: root/generic/tclIOGT.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclIOGT.c')
-rw-r--r--generic/tclIOGT.c939
1 files changed, 456 insertions, 483 deletions
diff --git a/generic/tclIOGT.c b/generic/tclIOGT.c
index 48419da..29996ea 100644
--- a/generic/tclIOGT.c
+++ b/generic/tclIOGT.c
@@ -1,93 +1,83 @@
/*
* tclIOGT.c --
*
- * Implements a generic transformation exposing the underlying API
- * at the script level. Contributed by Andreas Kupries.
+ * Implements a generic transformation exposing the underlying API at the
+ * script level. Contributed by Andreas Kupries.
*
* Copyright (c) 2000 Ajuba Solutions
* Copyright (c) 1999-2000 Andreas Kupries (a.kupries@westend.com)
*
- * See the file "license.terms" for information on usage and redistribution
- * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- *
- * CVS: $Id: tclIOGT.c,v 1.13 2005/07/17 21:17:41 dkf Exp $
+ * See the file "license.terms" for information on usage and redistribution of
+ * this file, and for a DISCLAIMER OF ALL WARRANTIES.
*/
#include "tclInt.h"
#include "tclIO.h"
/*
- * Forward declarations of internal procedures. First the driver procedures
- * of the transformation.
+ * Forward declarations of internal procedures. First the driver procedures of
+ * the transformation.
*/
-static int TransformBlockModeProc _ANSI_ARGS_((
- ClientData instanceData, int mode));
-static int TransformCloseProc _ANSI_ARGS_((
- ClientData instanceData, Tcl_Interp* interp));
-static int TransformInputProc _ANSI_ARGS_((
- ClientData instanceData, char *buf, int toRead,
- int *errorCodePtr));
-static int TransformOutputProc _ANSI_ARGS_((
- ClientData instanceData, CONST char *buf,
- int toWrite, int *errorCodePtr));
-static int TransformSeekProc _ANSI_ARGS_((
- ClientData instanceData, long offset, int mode,
- int *errorCodePtr));
-static int TransformSetOptionProc _ANSI_ARGS_((
- ClientData instanceData, Tcl_Interp *interp,
- CONST char *optionName, CONST char *value));
-static int TransformGetOptionProc _ANSI_ARGS_((
- ClientData instanceData, Tcl_Interp *interp,
- CONST char *optionName, Tcl_DString *dsPtr));
-static void TransformWatchProc _ANSI_ARGS_((
- ClientData instanceData, int mask));
-static int TransformGetFileHandleProc _ANSI_ARGS_((
- ClientData instanceData, int direction,
- ClientData *handlePtr));
-static int TransformNotifyProc _ANSI_ARGS_((
- ClientData instanceData, int mask));
-static Tcl_WideInt TransformWideSeekProc _ANSI_ARGS_((
- ClientData instanceData, Tcl_WideInt offset,
- int mode, int *errorCodePtr));
+static int TransformBlockModeProc(ClientData instanceData,
+ int mode);
+static int TransformCloseProc(ClientData instanceData,
+ Tcl_Interp *interp);
+static int TransformInputProc(ClientData instanceData, char *buf,
+ int toRead, int *errorCodePtr);
+static int TransformOutputProc(ClientData instanceData,
+ const char *buf, int toWrite, int *errorCodePtr);
+static int TransformSeekProc(ClientData instanceData, long offset,
+ int mode, int *errorCodePtr);
+static int TransformSetOptionProc(ClientData instanceData,
+ Tcl_Interp *interp, const char *optionName,
+ const char *value);
+static int TransformGetOptionProc(ClientData instanceData,
+ Tcl_Interp *interp, const char *optionName,
+ Tcl_DString *dsPtr);
+static void TransformWatchProc(ClientData instanceData, int mask);
+static int TransformGetFileHandleProc(ClientData instanceData,
+ int direction, ClientData *handlePtr);
+static int TransformNotifyProc(ClientData instanceData, int mask);
+static Tcl_WideInt TransformWideSeekProc(ClientData instanceData,
+ Tcl_WideInt offset, int mode, int *errorCodePtr);
/*
- * Forward declarations of internal procedures. Secondly the procedures for
+ * Forward declarations of internal procedures. Secondly the procedures for
* handling and generating fileeevents.
*/
-static void TransformChannelHandlerTimer _ANSI_ARGS_((
- ClientData clientData));
+static void TransformChannelHandlerTimer(ClientData clientData);
/*
- * Forward declarations of internal procedures. Third, helper procedures
+ * Forward declarations of internal procedures. Third, helper procedures
* encapsulating essential tasks.
*/
typedef struct TransformChannelData TransformChannelData;
-static int ExecuteCallback _ANSI_ARGS_((
- TransformChannelData *ctrl, Tcl_Interp *interp,
- unsigned char *op, unsigned char *buf, int bufLen,
- int transmit, int preserve));
+static int ExecuteCallback(TransformChannelData *ctrl,
+ Tcl_Interp *interp, unsigned char *op,
+ unsigned char *buf, int bufLen, int transmit,
+ int preserve);
/*
- * Action codes to give to 'ExecuteCallback' (argument 'transmit') confering
- * to the procedure what to do with the result of the script it calls.
+ * Action codes to give to 'ExecuteCallback' (argument 'transmit'), telling
+ * the procedure what to do with the result of the script it calls.
*/
-#define TRANSMIT_DONT (0) /* No transfer to do */
-#define TRANSMIT_DOWN (1) /* Transfer to the underlying channel */
-#define TRANSMIT_SELF (2) /* Transfer into our channel. */
-#define TRANSMIT_IBUF (3) /* Transfer to internal input buffer */
-#define TRANSMIT_NUM (4) /* Transfer number to 'maxRead' */
+#define TRANSMIT_DONT 0 /* No transfer to do. */
+#define TRANSMIT_DOWN 1 /* Transfer to the underlying channel. */
+#define TRANSMIT_SELF 2 /* Transfer into our channel. */
+#define TRANSMIT_IBUF 3 /* Transfer to internal input buffer. */
+#define TRANSMIT_NUM 4 /* Transfer number to 'maxRead'. */
/*
- * Codes for 'preserve' of 'ExecuteCallback'
+ * Codes for 'preserve' of 'ExecuteCallback'.
*/
-#define P_PRESERVE (1)
-#define P_NO_PRESERVE (0)
+#define P_PRESERVE 1
+#define P_NO_PRESERVE 0
/*
* Strings for the action codes delivered to the script implementing a
@@ -113,74 +103,75 @@ static int ExecuteCallback _ANSI_ARGS_((
typedef struct ResultBuffer ResultBuffer;
-static void ResultClear _ANSI_ARGS_((ResultBuffer *r));
-static void ResultInit _ANSI_ARGS_((ResultBuffer *r));
-static int ResultLength _ANSI_ARGS_((ResultBuffer *r));
-static int ResultCopy _ANSI_ARGS_((ResultBuffer *r,
- unsigned char *buf, int toRead));
-static void ResultAdd _ANSI_ARGS_((ResultBuffer *r,
- unsigned char *buf, int toWrite));
+static inline void ResultClear(ResultBuffer *r);
+static inline void ResultInit(ResultBuffer *r);
+static inline int ResultEmpty(ResultBuffer *r);
+static inline int ResultCopy(ResultBuffer *r, unsigned char *buf,
+ size_t toRead);
+static inline void ResultAdd(ResultBuffer *r, unsigned char *buf,
+ size_t toWrite);
/*
- * This structure describes the channel type structure for Tcl based
+ * This structure describes the channel type structure for Tcl-based
* transformations.
*/
-static Tcl_ChannelType transformChannelType = {
- "transform", /* Type name. */
- TCL_CHANNEL_VERSION_3,
- TransformCloseProc, /* Close proc. */
- TransformInputProc, /* Input proc. */
- TransformOutputProc, /* Output proc. */
- TransformSeekProc, /* Seek proc. */
- TransformSetOptionProc, /* Set option proc. */
- TransformGetOptionProc, /* Get option proc. */
- TransformWatchProc, /* Initialize notifier. */
- TransformGetFileHandleProc, /* Get OS handles out of channel. */
- NULL, /* close2proc */
- TransformBlockModeProc, /* Set blocking/nonblocking mode.*/
- NULL, /* Flush proc. */
- TransformNotifyProc, /* Handling of events bubbling up */
- TransformWideSeekProc, /* Wide seek proc */
+static const Tcl_ChannelType transformChannelType = {
+ "transform", /* Type name. */
+ TCL_CHANNEL_VERSION_5, /* v5 channel */
+ TransformCloseProc, /* Close proc. */
+ TransformInputProc, /* Input proc. */
+ TransformOutputProc, /* Output proc. */
+ TransformSeekProc, /* Seek proc. */
+ TransformSetOptionProc, /* Set option proc. */
+ TransformGetOptionProc, /* Get option proc. */
+ TransformWatchProc, /* Initialize notifier. */
+ TransformGetFileHandleProc, /* Get OS handles out of channel. */
+ NULL, /* close2proc */
+ TransformBlockModeProc, /* Set blocking/nonblocking mode.*/
+ NULL, /* Flush proc. */
+ TransformNotifyProc, /* Handling of events bubbling up. */
+ TransformWideSeekProc, /* Wide seek proc. */
+ NULL, /* Thread action. */
+ NULL /* Truncate. */
};
/*
* Possible values for 'flags' field in control structure, see below.
*/
-#define CHANNEL_ASYNC (1<<0) /* non-blocking mode */
+#define CHANNEL_ASYNC (1<<0) /* Non-blocking mode. */
/*
- * Definition of the structure containing the information about the
- * internal input buffer.
+ * Definition of the structure containing the information about the internal
+ * input buffer.
*/
struct ResultBuffer {
unsigned char *buf; /* Reference to the buffer area. */
- int allocated; /* Allocated size of the buffer area. */
- int used; /* Number of bytes in the buffer, <=
- * allocated. */
+ size_t allocated; /* Allocated size of the buffer area. */
+ size_t used; /* Number of bytes in the buffer, no more than
+ * number allocated. */
};
/*
- * Additional bytes to allocate during buffer expansion
+ * Additional bytes to allocate during buffer expansion.
*/
-#define INCREMENT (512)
+#define INCREMENT 512
/*
* Number of milliseconds to wait before firing an event to flush out
* information waiting in buffers (fileevent support).
*/
-#define FLUSH_DELAY (5)
+#define FLUSH_DELAY 5
/*
* Convenience macro to make some casts easier to use.
*/
#define UCHARP(x) ((unsigned char *) (x))
-#define NO_INTERP ((Tcl_Interp *) NULL)
/*
* Definition of a structure used by all transformations generated here to
@@ -209,24 +200,44 @@ struct TransformChannelData {
*/
int maxRead; /* Maximum allowed number of bytes to read, as
- * given to us by the tcl script implementing
+ * given to us by the Tcl script implementing
* the transformation. */
Tcl_Interp *interp; /* Reference to the interpreter which created
* the transformation. Used to execute the
* code below. */
Tcl_Obj *command; /* Tcl code to execute for a buffer */
ResultBuffer result; /* Internal buffer used to store the result of
- * a transformation of incoming data.
- * Additionally serves as buffer of all data
- * not yet consumed by the reader. */
+ * a transformation of incoming data. Also
+ * serves as buffer of all data not yet
+ * consumed by the reader. */
+ int refCount;
};
+
+static void
+PreserveData(
+ TransformChannelData *dataPtr)
+{
+ dataPtr->refCount++;
+}
+
+static void
+ReleaseData(
+ TransformChannelData *dataPtr)
+{
+ if (--dataPtr->refCount) {
+ return;
+ }
+ ResultClear(&dataPtr->result);
+ Tcl_DecrRefCount(dataPtr->command);
+ ckfree(dataPtr);
+}
/*
*----------------------------------------------------------------------
*
* TclChannelTransform --
*
- * Implements the Tcl "testchannel transform" debugging command. This is
+ * Implements the Tcl "testchannel transform" debugging command. This is
* part of the testing environment. This sets up a tcl script (cmdObjPtr)
* to be used as a transform on the channel.
*
@@ -241,21 +252,28 @@ struct TransformChannelData {
/* ARGSUSED */
int
-TclChannelTransform(interp, chan, cmdObjPtr)
- Tcl_Interp *interp; /* Interpreter for result. */
- Tcl_Channel chan; /* Channel to transform. */
- Tcl_Obj *cmdObjPtr; /* Script to use for transform. */
+TclChannelTransform(
+ Tcl_Interp *interp, /* Interpreter for result. */
+ Tcl_Channel chan, /* Channel to transform. */
+ Tcl_Obj *cmdObjPtr) /* Script to use for transform. */
{
Channel *chanPtr; /* The actual channel. */
- ChannelState *statePtr; /* state info for channel */
- int mode; /* rw mode of the channel */
+ ChannelState *statePtr; /* State info for channel. */
+ int mode; /* Read/write mode of the channel. */
+ int objc;
TransformChannelData *dataPtr;
- int res;
Tcl_DString ds;
- if (chan == (Tcl_Channel) NULL) {
+ if (chan == NULL) {
return TCL_ERROR;
}
+
+ if (TCL_OK != Tcl_ListObjLength(interp, cmdObjPtr, &objc)) {
+ Tcl_SetObjResult(interp,
+ Tcl_NewStringObj("-command value is not a list", -1));
+ return TCL_ERROR;
+ }
+
chanPtr = (Channel *) chan;
statePtr = chanPtr->state;
chanPtr = statePtr->topChanPtr;
@@ -268,41 +286,35 @@ TclChannelTransform(interp, chan, cmdObjPtr)
* regime of the underlying channel and to use the same for us too.
*/
- dataPtr = (TransformChannelData *) ckalloc(sizeof(TransformChannelData));
+ dataPtr = ckalloc(sizeof(TransformChannelData));
- Tcl_DStringInit (&ds);
+ dataPtr->refCount = 1;
+ Tcl_DStringInit(&ds);
Tcl_GetChannelOption(interp, chan, "-blocking", &ds);
-
dataPtr->readIsFlushed = 0;
- dataPtr->flags = 0;
-
+ dataPtr->flags = 0;
if (ds.string[0] == '0') {
dataPtr->flags |= CHANNEL_ASYNC;
}
-
Tcl_DStringFree(&ds);
dataPtr->self = chan;
dataPtr->watchMask = 0;
dataPtr->mode = mode;
- dataPtr->timer = (Tcl_TimerToken) NULL;
- dataPtr->maxRead = 4096; /* Initial value not relevant */
+ dataPtr->timer = NULL;
+ dataPtr->maxRead = 4096; /* Initial value not relevant. */
dataPtr->interp = interp;
dataPtr->command = cmdObjPtr;
-
Tcl_IncrRefCount(dataPtr->command);
ResultInit(&dataPtr->result);
- dataPtr->self = Tcl_StackChannel(interp, &transformChannelType,
- (ClientData) dataPtr, mode, chan);
- if (dataPtr->self == (Tcl_Channel) NULL) {
- Tcl_AppendResult(interp, "\nfailed to stack channel \"",
- Tcl_GetChannelName(chan), "\"", (char *) NULL);
-
- Tcl_DecrRefCount(dataPtr->command);
- ResultClear(&dataPtr->result);
- ckfree((char *) dataPtr);
+ dataPtr->self = Tcl_StackChannel(interp, &transformChannelType, dataPtr,
+ mode, chan);
+ if (dataPtr->self == NULL) {
+ Tcl_AppendPrintfToObj(Tcl_GetObjResult(interp),
+ "\nfailed to stack channel \"%s\"", Tcl_GetChannelName(chan));
+ ReleaseData(dataPtr);
return TCL_ERROR;
}
@@ -310,29 +322,24 @@ TclChannelTransform(interp, chan, cmdObjPtr)
* At last initialize the transformation at the script level.
*/
- if (dataPtr->mode & TCL_WRITABLE) {
- res = ExecuteCallback(dataPtr, NO_INTERP, A_CREATE_WRITE, NULL, 0,
- TRANSMIT_DONT, P_NO_PRESERVE);
-
- if (res != TCL_OK) {
- Tcl_UnstackChannel(interp, chan);
- return TCL_ERROR;
- }
+ PreserveData(dataPtr);
+ if ((dataPtr->mode & TCL_WRITABLE) && ExecuteCallback(dataPtr, NULL,
+ A_CREATE_WRITE, NULL, 0, TRANSMIT_DONT, P_NO_PRESERVE) != TCL_OK){
+ Tcl_UnstackChannel(interp, chan);
+ ReleaseData(dataPtr);
+ return TCL_ERROR;
}
- if (dataPtr->mode & TCL_READABLE) {
- res = ExecuteCallback(dataPtr, NO_INTERP, A_CREATE_READ, NULL, 0,
- TRANSMIT_DONT, P_NO_PRESERVE);
-
- if (res != TCL_OK) {
- ExecuteCallback(dataPtr, NO_INTERP, A_DELETE_WRITE, NULL, 0,
- TRANSMIT_DONT, P_NO_PRESERVE);
-
- Tcl_UnstackChannel(interp, chan);
- return TCL_ERROR;
- }
+ if ((dataPtr->mode & TCL_READABLE) && ExecuteCallback(dataPtr, NULL,
+ A_CREATE_READ, NULL, 0, TRANSMIT_DONT, P_NO_PRESERVE) != TCL_OK) {
+ ExecuteCallback(dataPtr, NULL, A_DELETE_WRITE, NULL, 0, TRANSMIT_DONT,
+ P_NO_PRESERVE);
+ Tcl_UnstackChannel(interp, chan);
+ ReleaseData(dataPtr);
+ return TCL_ERROR;
}
+ ReleaseData(dataPtr);
return TCL_OK;
}
@@ -354,20 +361,30 @@ TclChannelTransform(interp, chan, cmdObjPtr)
*/
static int
-ExecuteCallback(dataPtr, interp, op, buf, bufLen, transmit, preserve)
- TransformChannelData *dataPtr; /* Transformation with the callback */
- Tcl_Interp *interp; /* Current interpreter, possibly
- * NULL. */
- unsigned char *op; /* Operation invoking the callback */
- unsigned char *buf; /* Buffer to give to the script. */
- int bufLen; /* And its length */
- int transmit; /* Flag, determines whether the result
- * of the callback is sent to the
- * underlying channel or not. */
- int preserve; /* Flag. If true the procedure will
- * preserver the result state of all
- * accessed interpreters. */
+ExecuteCallback(
+ TransformChannelData *dataPtr,
+ /* Transformation with the callback. */
+ Tcl_Interp *interp, /* Current interpreter, possibly NULL. */
+ unsigned char *op, /* Operation invoking the callback. */
+ unsigned char *buf, /* Buffer to give to the script. */
+ int bufLen, /* And its length. */
+ int transmit, /* Flag, determines whether the result of the
+ * callback is sent to the underlying channel
+ * or not. */
+ int preserve) /* Flag. If true the procedure will preserve
+ * the result state of all accessed
+ * interpreters. */
{
+ Tcl_Obj *resObj; /* See below, switch (transmit). */
+ int resLen;
+ unsigned char *resBuf;
+ Tcl_InterpState state = NULL;
+ int res = TCL_OK;
+ Tcl_Obj *command = TclListObjCopy(NULL, dataPtr->command);
+ Tcl_Interp *eval = dataPtr->interp;
+
+ Tcl_Preserve(eval);
+
/*
* Step 1, create the complete command to execute. Do this by appending
* operation and buffer to operate upon to a copy of the callback
@@ -376,56 +393,19 @@ ExecuteCallback(dataPtr, interp, op, buf, bufLen, transmit, preserve)
* arguments. Feather's curried commands would come in handy here.
*/
- Tcl_Obj *resObj; /* See below, switch (transmit) */
- int resLen;
- unsigned char *resBuf;
- Tcl_InterpState state = NULL;
- int res = TCL_OK;
- Tcl_Obj *command = Tcl_DuplicateObj(dataPtr->command);
- Tcl_Obj *temp;
-
- if (preserve) {
- state = Tcl_SaveInterpState(dataPtr->interp, res);
- }
-
- if (command == (Tcl_Obj*) NULL) {
- /* Memory allocation problem */
- res = TCL_ERROR;
- goto cleanup;
+ if (preserve == P_PRESERVE) {
+ state = Tcl_SaveInterpState(eval, res);
}
Tcl_IncrRefCount(command);
-
- temp = Tcl_NewStringObj((char*) op, -1);
-
- if (temp == (Tcl_Obj*) NULL) {
- /* Memory allocation problem */
- res = TCL_ERROR;
- goto cleanup;
- }
-
- res = Tcl_ListObjAppendElement(dataPtr->interp, command, temp);
- if (res != TCL_OK) {
- goto cleanup;
- }
+ Tcl_ListObjAppendElement(NULL, command, Tcl_NewStringObj((char *) op, -1));
/*
* Use a byte-array to prevent the misinterpretation of binary data coming
* through as UTF while at the tcl level.
*/
- temp = Tcl_NewByteArrayObj(buf, bufLen);
-
- if (temp == (Tcl_Obj*) NULL) {
- /* Memory allocation problem */
- res = TCL_ERROR;
- goto cleanup;
- }
-
- res = Tcl_ListObjAppendElement(dataPtr->interp, command, temp);
- if (res != TCL_OK) {
- goto cleanup;
- }
+ Tcl_ListObjAppendElement(NULL, command, Tcl_NewByteArrayObj(buf, bufLen));
/*
* Step 2, execute the command at the global level of the interpreter used
@@ -435,13 +415,14 @@ ExecuteCallback(dataPtr, interp, op, buf, bufLen, transmit, preserve)
* current interpreter. Don't copy if in preservation mode.
*/
- res = Tcl_GlobalEvalObj(dataPtr->interp, command);
+ res = Tcl_EvalObjEx(eval, command, TCL_EVAL_GLOBAL);
Tcl_DecrRefCount(command);
- command = (Tcl_Obj*) NULL;
+ command = NULL;
- if ((res != TCL_OK) && (interp != NO_INTERP) &&
- (dataPtr->interp != interp) && !preserve) {
- Tcl_SetObjResult(interp, Tcl_GetObjResult(dataPtr->interp));
+ if ((res != TCL_OK) && (interp != NULL) && (eval != interp)
+ && (preserve == P_NO_PRESERVE)) {
+ Tcl_SetObjResult(interp, Tcl_GetObjResult(eval));
+ Tcl_Release(eval);
return res;
}
@@ -456,48 +437,39 @@ ExecuteCallback(dataPtr, interp, op, buf, bufLen, transmit, preserve)
break;
case TRANSMIT_DOWN:
- resObj = Tcl_GetObjResult(dataPtr->interp);
- resBuf = (unsigned char *) Tcl_GetByteArrayFromObj(resObj, &resLen);
+ resObj = Tcl_GetObjResult(eval);
+ resBuf = Tcl_GetByteArrayFromObj(resObj, &resLen);
Tcl_WriteRaw(Tcl_GetStackedChannel(dataPtr->self), (char *) resBuf,
resLen);
break;
case TRANSMIT_SELF:
- resObj = Tcl_GetObjResult(dataPtr->interp);
- resBuf = (unsigned char *) Tcl_GetByteArrayFromObj(resObj, &resLen);
+ resObj = Tcl_GetObjResult(eval);
+ resBuf = Tcl_GetByteArrayFromObj(resObj, &resLen);
Tcl_WriteRaw(dataPtr->self, (char *) resBuf, resLen);
break;
case TRANSMIT_IBUF:
- resObj = Tcl_GetObjResult(dataPtr->interp);
- resBuf = (unsigned char *) Tcl_GetByteArrayFromObj(resObj, &resLen);
+ resObj = Tcl_GetObjResult(eval);
+ resBuf = Tcl_GetByteArrayFromObj(resObj, &resLen);
ResultAdd(&dataPtr->result, resBuf, resLen);
break;
case TRANSMIT_NUM:
- /* Interpret result as integer number */
- resObj = Tcl_GetObjResult(dataPtr->interp);
- Tcl_GetIntFromObj(dataPtr->interp, resObj, &dataPtr->maxRead);
- break;
- }
-
- Tcl_ResetResult(dataPtr->interp);
-
- if (preserve) {
- (void) Tcl_RestoreInterpState(dataPtr->interp, state);
- }
-
- return res;
+ /*
+ * Interpret result as integer number.
+ */
- cleanup:
- if (preserve) {
- (void) Tcl_RestoreInterpState(dataPtr->interp, state);
+ resObj = Tcl_GetObjResult(eval);
+ TclGetIntFromObj(eval, resObj, &dataPtr->maxRead);
+ break;
}
- if (command != (Tcl_Obj*) NULL) {
- Tcl_DecrRefCount(command);
+ Tcl_ResetResult(eval);
+ if (preserve == P_PRESERVE) {
+ (void) Tcl_RestoreInterpState(eval, state);
}
-
+ Tcl_Release(eval);
return res;
}
@@ -519,16 +491,16 @@ ExecuteCallback(dataPtr, interp, op, buf, bufLen, transmit, preserve)
*/
static int
-TransformBlockModeProc(instanceData, mode)
- ClientData instanceData; /* State of transformation */
- int mode; /* New blocking mode */
+TransformBlockModeProc(
+ ClientData instanceData, /* State of transformation. */
+ int mode) /* New blocking mode. */
{
- TransformChannelData *dataPtr = (TransformChannelData *) instanceData;
+ TransformChannelData *dataPtr = instanceData;
if (mode == TCL_MODE_NONBLOCKING) {
- dataPtr->flags |= CHANNEL_ASYNC;
+ dataPtr->flags |= CHANNEL_ASYNC;
} else {
- dataPtr->flags &= ~(CHANNEL_ASYNC);
+ dataPtr->flags &= ~CHANNEL_ASYNC;
}
return 0;
}
@@ -551,18 +523,16 @@ TransformBlockModeProc(instanceData, mode)
*/
static int
-TransformCloseProc(instanceData, interp)
- ClientData instanceData;
- Tcl_Interp *interp;
+TransformCloseProc(
+ ClientData instanceData,
+ Tcl_Interp *interp)
{
- TransformChannelData *dataPtr = (TransformChannelData *) instanceData;
+ TransformChannelData *dataPtr = instanceData;
/*
* Important: In this procedure 'dataPtr->self' already points to the
* underlying channel.
- */
-
- /*
+ *
* There is no need to cancel an existing channel handler, this is already
* done. Either by 'Tcl_UnstackChannel' or by the general cleanup in
* 'Tcl_Close'.
@@ -571,9 +541,9 @@ TransformCloseProc(instanceData, interp)
* removed channel.
*/
- if (dataPtr->timer != (Tcl_TimerToken) NULL) {
- Tcl_DeleteTimerHandler(dataPtr->timer);
- dataPtr->timer = (Tcl_TimerToken) NULL;
+ if (dataPtr->timer != NULL) {
+ Tcl_DeleteTimerHandler(dataPtr->timer);
+ dataPtr->timer = NULL;
}
/*
@@ -583,35 +553,33 @@ TransformCloseProc(instanceData, interp)
* system rely on (f.e. signaling the close to interested parties).
*/
+ PreserveData(dataPtr);
if (dataPtr->mode & TCL_WRITABLE) {
- ExecuteCallback(dataPtr, interp, A_FLUSH_WRITE, NULL, 0,
- TRANSMIT_DOWN, 1);
+ ExecuteCallback(dataPtr, interp, A_FLUSH_WRITE, NULL, 0,
+ TRANSMIT_DOWN, P_PRESERVE);
}
if ((dataPtr->mode & TCL_READABLE) && !dataPtr->readIsFlushed) {
dataPtr->readIsFlushed = 1;
- ExecuteCallback(dataPtr, interp, A_FLUSH_READ, NULL, 0,
- TRANSMIT_IBUF, 1);
+ ExecuteCallback(dataPtr, interp, A_FLUSH_READ, NULL, 0, TRANSMIT_IBUF,
+ P_PRESERVE);
}
if (dataPtr->mode & TCL_WRITABLE) {
- ExecuteCallback(dataPtr, interp, A_DELETE_WRITE, NULL, 0,
- TRANSMIT_DONT, 1);
+ ExecuteCallback(dataPtr, interp, A_DELETE_WRITE, NULL, 0,
+ TRANSMIT_DONT, P_PRESERVE);
}
-
if (dataPtr->mode & TCL_READABLE) {
- ExecuteCallback(dataPtr, interp, A_DELETE_READ, NULL, 0,
- TRANSMIT_DONT, 1);
+ ExecuteCallback(dataPtr, interp, A_DELETE_READ, NULL, 0,
+ TRANSMIT_DONT, P_PRESERVE);
}
+ ReleaseData(dataPtr);
/*
- * General cleanup
+ * General cleanup.
*/
- ResultClear(&dataPtr->result);
- Tcl_DecrRefCount(dataPtr->command);
- ckfree((char *) dataPtr);
-
+ ReleaseData(dataPtr);
return TCL_OK;
}
@@ -632,17 +600,19 @@ TransformCloseProc(instanceData, interp)
*/
static int
-TransformInputProc(instanceData, buf, toRead, errorCodePtr)
- ClientData instanceData;
- char *buf;
- int toRead;
- int *errorCodePtr;
+TransformInputProc(
+ ClientData instanceData,
+ char *buf,
+ int toRead,
+ int *errorCodePtr)
{
- TransformChannelData* dataPtr = (TransformChannelData *) instanceData;
- int gotBytes, read, res, copied;
+ TransformChannelData *dataPtr = instanceData;
+ int gotBytes, read, copied;
Tcl_Channel downChan;
- /* should assert (dataPtr->mode & TCL_READABLE) */
+ /*
+ * Should assert(dataPtr->mode & TCL_READABLE);
+ */
if (toRead == 0) {
/*
@@ -654,24 +624,25 @@ TransformInputProc(instanceData, buf, toRead, errorCodePtr)
gotBytes = 0;
downChan = Tcl_GetStackedChannel(dataPtr->self);
+ PreserveData(dataPtr);
while (toRead > 0) {
- /*
+ /*
* Loop until the request is satisfied (or no data is available from
* below, possibly EOF).
*/
- copied = ResultCopy(&dataPtr->result, UCHARP(buf), toRead);
-
+ copied = ResultCopy(&dataPtr->result, UCHARP(buf), toRead);
toRead -= copied;
buf += copied;
gotBytes += copied;
if (toRead == 0) {
/*
- * The request was completely satisfied from our buffers. We can
+ * The request was completely satisfied from our buffers. We can
* break out of the loop and return to the caller.
*/
- return gotBytes;
+
+ break;
}
/*
@@ -686,37 +657,39 @@ TransformInputProc(instanceData, buf, toRead, errorCodePtr)
* matching.
*/
- ExecuteCallback(dataPtr, NO_INTERP, A_QUERY_MAXREAD, NULL, 0,
- TRANSMIT_NUM /* -> maxRead */, 1);
+ ExecuteCallback(dataPtr, NULL, A_QUERY_MAXREAD, NULL, 0,
+ TRANSMIT_NUM /* -> maxRead */, P_PRESERVE);
if (dataPtr->maxRead >= 0) {
if (dataPtr->maxRead < toRead) {
- toRead = dataPtr->maxRead;
+ toRead = dataPtr->maxRead;
}
- } /* else: 'maxRead < 0' == Accept the current value of toRead */
-
+ } /* else: 'maxRead < 0' == Accept the current value of toRead. */
if (toRead <= 0) {
- return gotBytes;
+ break;
}
- read = Tcl_ReadRaw(downChan, buf, toRead);
+ /*
+ * Get bytes from the underlying channel.
+ */
+ read = Tcl_ReadRaw(downChan, buf, toRead);
if (read < 0) {
/*
- * Report errors to caller. EAGAIN is a special situation. If we
+ * Report errors to caller. EAGAIN is a special situation. If we
* had some data before we report that instead of the request to
* re-try.
*/
+ int error = Tcl_GetErrno();
- if ((Tcl_GetErrno() == EAGAIN) && (gotBytes > 0)) {
- return gotBytes;
+ if ((error == EAGAIN) && (gotBytes > 0)) {
+ break;
}
- *errorCodePtr = Tcl_GetErrno();
- return -1;
- }
-
- if (read == 0) {
+ *errorCodePtr = error;
+ gotBytes = -1;
+ break;
+ } else if (read == 0) {
/*
* Check wether we hit on EOF in the underlying channel or not. If
* not differentiate between blocking and non-blocking modes. In
@@ -727,48 +700,50 @@ TransformInputProc(instanceData, buf, toRead, errorCodePtr)
* convert and flush all waiting partial data.
*/
- if (! Tcl_Eof(downChan)) {
- if ((gotBytes == 0) && (dataPtr->flags & CHANNEL_ASYNC)) {
+ if (!Tcl_Eof(downChan)) {
+ if ((gotBytes == 0) && (dataPtr->flags & CHANNEL_ASYNC)) {
*errorCodePtr = EWOULDBLOCK;
- return -1;
- } else {
- return gotBytes;
- }
- } else {
- if (dataPtr->readIsFlushed) {
- /*
- * Already flushed, nothing to do anymore.
- */
- return gotBytes;
+ gotBytes = -1;
}
+ break;
+ }
+
+ if (dataPtr->readIsFlushed) {
+ /*
+ * Already flushed, nothing to do anymore.
+ */
- dataPtr->readIsFlushed = 1;
+ break;
+ }
- ExecuteCallback(dataPtr, NO_INTERP, A_FLUSH_READ, NULL, 0,
- TRANSMIT_IBUF, P_PRESERVE);
+ dataPtr->readIsFlushed = 1;
+ ExecuteCallback(dataPtr, NULL, A_FLUSH_READ, NULL, 0,
+ TRANSMIT_IBUF, P_PRESERVE);
- if (ResultLength(&dataPtr->result) == 0) {
- /* we had nothing to flush */
- return gotBytes;
- }
+ if (ResultEmpty(&dataPtr->result)) {
+ /*
+ * We had nothing to flush.
+ */
- continue; /* at: while (toRead > 0) */
+ break;
}
+
+ continue; /* at: while (toRead > 0) */
} /* read == 0 */
/*
* Transform the read chunk and add the result to our read buffer
- * (dataPtr->result)
+ * (dataPtr->result).
*/
- res = ExecuteCallback(dataPtr, NO_INTERP, A_READ, UCHARP(buf), read,
- TRANSMIT_IBUF, P_PRESERVE);
-
- if (res != TCL_OK) {
+ if (ExecuteCallback(dataPtr, NULL, A_READ, UCHARP(buf), read,
+ TRANSMIT_IBUF, P_PRESERVE) != TCL_OK) {
*errorCodePtr = EINVAL;
- return -1;
+ gotBytes = -1;
+ break;
}
} /* while toRead > 0 */
+ ReleaseData(dataPtr);
return gotBytes;
}
@@ -790,31 +765,33 @@ TransformInputProc(instanceData, buf, toRead, errorCodePtr)
*/
static int
-TransformOutputProc(instanceData, buf, toWrite, errorCodePtr)
- ClientData instanceData;
- CONST char *buf;
- int toWrite;
- int *errorCodePtr;
+TransformOutputProc(
+ ClientData instanceData,
+ const char *buf,
+ int toWrite,
+ int *errorCodePtr)
{
- TransformChannelData* dataPtr = (TransformChannelData*) instanceData;
- int res;
+ TransformChannelData *dataPtr = instanceData;
- /* should assert (dataPtr->mode & TCL_WRITABLE) */
+ /*
+ * Should assert(dataPtr->mode & TCL_WRITABLE);
+ */
if (toWrite == 0) {
/*
* Catch a no-op.
*/
+
return 0;
}
- res = ExecuteCallback(dataPtr, NO_INTERP, A_WRITE, UCHARP(buf), toWrite,
- TRANSMIT_DOWN, P_NO_PRESERVE);
-
- if (res != TCL_OK) {
- *errorCodePtr = EINVAL;
- return -1;
+ PreserveData(dataPtr);
+ if (ExecuteCallback(dataPtr, NULL, A_WRITE, UCHARP(buf), toWrite,
+ TRANSMIT_DOWN, P_NO_PRESERVE) != TCL_OK) {
+ *errorCodePtr = EINVAL;
+ toWrite = -1;
}
+ ReleaseData(dataPtr);
return toWrite;
}
@@ -829,7 +806,7 @@ TransformOutputProc(instanceData, buf, toWrite, errorCodePtr)
*
* Side effects:
* Moves the location at which the channel will be accessed in future
- * operations. Flushes all transformation buffers, then forwards it to
+ * operations. Flushes all transformation buffers, then forwards it to
* the underlying channel.
*
* Result:
@@ -840,25 +817,25 @@ TransformOutputProc(instanceData, buf, toWrite, errorCodePtr)
*/
static int
-TransformSeekProc(instanceData, offset, mode, errorCodePtr)
- ClientData instanceData; /* The channel to manipulate */
- long offset; /* Size of movement. */
- int mode; /* How to move */
- int *errorCodePtr; /* Location of error flag. */
+TransformSeekProc(
+ ClientData instanceData, /* The channel to manipulate. */
+ long offset, /* Size of movement. */
+ int mode, /* How to move. */
+ int *errorCodePtr) /* Location of error flag. */
{
- TransformChannelData *dataPtr = (TransformChannelData *) instanceData;
+ TransformChannelData *dataPtr = instanceData;
Tcl_Channel parent = Tcl_GetStackedChannel(dataPtr->self);
- Tcl_ChannelType *parentType = Tcl_GetChannelType(parent);
+ const Tcl_ChannelType *parentType = Tcl_GetChannelType(parent);
Tcl_DriverSeekProc *parentSeekProc = Tcl_ChannelSeekProc(parentType);
if ((offset == 0) && (mode == SEEK_CUR)) {
- /*
+ /*
* This is no seek but a request to tell the caller the current
* location. Simply pass the request down.
*/
- return (*parentSeekProc) (Tcl_GetChannelInstanceData(parent),
- offset, mode, errorCodePtr);
+ return parentSeekProc(Tcl_GetChannelInstanceData(parent), offset,
+ mode, errorCodePtr);
}
/*
@@ -867,20 +844,22 @@ TransformSeekProc(instanceData, offset, mode, errorCodePtr)
* request down, unchanged.
*/
+ PreserveData(dataPtr);
if (dataPtr->mode & TCL_WRITABLE) {
- ExecuteCallback(dataPtr, NO_INTERP, A_FLUSH_WRITE, NULL, 0,
- TRANSMIT_DOWN, P_NO_PRESERVE);
+ ExecuteCallback(dataPtr, NULL, A_FLUSH_WRITE, NULL, 0, TRANSMIT_DOWN,
+ P_NO_PRESERVE);
}
if (dataPtr->mode & TCL_READABLE) {
- ExecuteCallback(dataPtr, NO_INTERP, A_CLEAR_READ, NULL, 0,
- TRANSMIT_DONT, P_NO_PRESERVE);
+ ExecuteCallback(dataPtr, NULL, A_CLEAR_READ, NULL, 0, TRANSMIT_DONT,
+ P_NO_PRESERVE);
ResultClear(&dataPtr->result);
dataPtr->readIsFlushed = 0;
}
+ ReleaseData(dataPtr);
- return (*parentSeekProc) (Tcl_GetChannelInstanceData(parent),
- offset, mode, errorCodePtr);
+ return parentSeekProc(Tcl_GetChannelInstanceData(parent), offset, mode,
+ errorCodePtr);
}
/*
@@ -893,7 +872,7 @@ TransformSeekProc(instanceData, offset, mode, errorCodePtr)
*
* Side effects:
* Moves the location at which the channel will be accessed in future
- * operations. Flushes all transformation buffers, then forwards it to
+ * operations. Flushes all transformation buffers, then forwards it to
* the underlying channel.
*
* Result:
@@ -904,32 +883,31 @@ TransformSeekProc(instanceData, offset, mode, errorCodePtr)
*/
static Tcl_WideInt
-TransformWideSeekProc(instanceData, offset, mode, errorCodePtr)
- ClientData instanceData; /* The channel to manipulate */
- Tcl_WideInt offset; /* Size of movement. */
- int mode; /* How to move */
- int *errorCodePtr; /* Location of error flag. */
+TransformWideSeekProc(
+ ClientData instanceData, /* The channel to manipulate. */
+ Tcl_WideInt offset, /* Size of movement. */
+ int mode, /* How to move. */
+ int *errorCodePtr) /* Location of error flag. */
{
- TransformChannelData * dataPtr = (TransformChannelData *) instanceData;
+ TransformChannelData *dataPtr = instanceData;
Tcl_Channel parent = Tcl_GetStackedChannel(dataPtr->self);
- Tcl_ChannelType* parentType = Tcl_GetChannelType(parent);
- Tcl_DriverSeekProc* parentSeekProc = Tcl_ChannelSeekProc(parentType);
- Tcl_DriverWideSeekProc* parentWideSeekProc =
+ const Tcl_ChannelType *parentType = Tcl_GetChannelType(parent);
+ Tcl_DriverSeekProc *parentSeekProc = Tcl_ChannelSeekProc(parentType);
+ Tcl_DriverWideSeekProc *parentWideSeekProc =
Tcl_ChannelWideSeekProc(parentType);
ClientData parentData = Tcl_GetChannelInstanceData(parent);
if ((offset == Tcl_LongAsWide(0)) && (mode == SEEK_CUR)) {
- /*
+ /*
* This is no seek but a request to tell the caller the current
* location. Simply pass the request down.
*/
if (parentWideSeekProc != NULL) {
- return (*parentWideSeekProc) (parentData, offset, mode,
- errorCodePtr);
+ return parentWideSeekProc(parentData, offset, mode, errorCodePtr);
}
- return Tcl_LongAsWide((*parentSeekProc) (parentData, 0, mode,
+ return Tcl_LongAsWide(parentSeekProc(parentData, 0, mode,
errorCodePtr));
}
@@ -939,31 +917,33 @@ TransformWideSeekProc(instanceData, offset, mode, errorCodePtr)
* request down, unchanged.
*/
+ PreserveData(dataPtr);
if (dataPtr->mode & TCL_WRITABLE) {
- ExecuteCallback(dataPtr, NO_INTERP, A_FLUSH_WRITE, NULL, 0,
- TRANSMIT_DOWN, P_NO_PRESERVE);
+ ExecuteCallback(dataPtr, NULL, A_FLUSH_WRITE, NULL, 0, TRANSMIT_DOWN,
+ P_NO_PRESERVE);
}
if (dataPtr->mode & TCL_READABLE) {
- ExecuteCallback(dataPtr, NO_INTERP, A_CLEAR_READ, NULL, 0,
- TRANSMIT_DONT, P_NO_PRESERVE);
+ ExecuteCallback(dataPtr, NULL, A_CLEAR_READ, NULL, 0, TRANSMIT_DONT,
+ P_NO_PRESERVE);
ResultClear(&dataPtr->result);
dataPtr->readIsFlushed = 0;
}
+ ReleaseData(dataPtr);
/*
* If we have a wide seek capability, we should stick with that.
*/
if (parentWideSeekProc != NULL) {
- return (*parentWideSeekProc) (parentData, offset, mode, errorCodePtr);
+ return parentWideSeekProc(parentData, offset, mode, errorCodePtr);
}
/*
* We're transferring to narrow seeks at this point; this is a bit complex
* because we have to check whether the seek is possible first (i.e.
* whether we are losing information in truncating the bits of the
- * offset.) Luckily, there's a defined error for what happens when trying
+ * offset). Luckily, there's a defined error for what happens when trying
* to go out of the representable range.
*/
@@ -972,8 +952,8 @@ TransformWideSeekProc(instanceData, offset, mode, errorCodePtr)
return Tcl_LongAsWide(-1);
}
- return Tcl_LongAsWide((*parentSeekProc) (parentData,
- Tcl_WideAsLong(offset), mode, errorCodePtr));
+ return Tcl_LongAsWide(parentSeekProc(parentData, Tcl_WideAsLong(offset),
+ mode, errorCodePtr));
}
/*
@@ -995,22 +975,23 @@ TransformWideSeekProc(instanceData, offset, mode, errorCodePtr)
*/
static int
-TransformSetOptionProc(instanceData, interp, optionName, value)
- ClientData instanceData;
- Tcl_Interp *interp;
- CONST char *optionName;
- CONST char *value;
+TransformSetOptionProc(
+ ClientData instanceData,
+ Tcl_Interp *interp,
+ const char *optionName,
+ const char *value)
{
- TransformChannelData* dataPtr = (TransformChannelData*) instanceData;
+ TransformChannelData *dataPtr = instanceData;
Tcl_Channel downChan = Tcl_GetStackedChannel(dataPtr->self);
Tcl_DriverSetOptionProc *setOptionProc;
setOptionProc = Tcl_ChannelSetOptionProc(Tcl_GetChannelType(downChan));
- if (setOptionProc != NULL) {
- return (*setOptionProc)(Tcl_GetChannelInstanceData(downChan),
- interp, optionName, value);
+ if (setOptionProc == NULL) {
+ return TCL_ERROR;
}
- return TCL_ERROR;
+
+ return setOptionProc(Tcl_GetChannelInstanceData(downChan), interp,
+ optionName, value);
}
/*
@@ -1032,21 +1013,21 @@ TransformSetOptionProc(instanceData, interp, optionName, value)
*/
static int
-TransformGetOptionProc(instanceData, interp, optionName, dsPtr)
- ClientData instanceData;
- Tcl_Interp *interp;
- CONST char *optionName;
- Tcl_DString *dsPtr;
+TransformGetOptionProc(
+ ClientData instanceData,
+ Tcl_Interp *interp,
+ const char *optionName,
+ Tcl_DString *dsPtr)
{
- TransformChannelData* dataPtr = (TransformChannelData*) instanceData;
+ TransformChannelData *dataPtr = instanceData;
Tcl_Channel downChan = Tcl_GetStackedChannel(dataPtr->self);
Tcl_DriverGetOptionProc *getOptionProc;
getOptionProc = Tcl_ChannelGetOptionProc(Tcl_GetChannelType(downChan));
if (getOptionProc != NULL) {
- return (*getOptionProc)(Tcl_GetChannelInstanceData(downChan),
- interp, optionName, dsPtr);
- } else if (optionName == (CONST char*) NULL) {
+ return getOptionProc(Tcl_GetChannelInstanceData(downChan), interp,
+ optionName, dsPtr);
+ } else if (optionName == NULL) {
/*
* Request is query for all options, this is ok.
*/
@@ -1055,7 +1036,7 @@ TransformGetOptionProc(instanceData, interp, optionName, dsPtr)
}
/*
- * Request for a specific option has to fail, we don't have any.
+ * Request for a specific option has to fail, since we don't have any.
*/
return TCL_ERROR;
@@ -1080,24 +1061,24 @@ TransformGetOptionProc(instanceData, interp, optionName, dsPtr)
/* ARGSUSED */
static void
-TransformWatchProc(instanceData, mask)
- ClientData instanceData; /* Channel to watch */
- int mask; /* Events of interest */
+TransformWatchProc(
+ ClientData instanceData, /* Channel to watch. */
+ int mask) /* Events of interest. */
{
+ TransformChannelData *dataPtr = instanceData;
+ Tcl_Channel downChan;
+
/*
* The caller expressed interest in events occuring for this channel. We
* are forwarding the call to the underlying channel now.
*/
- TransformChannelData *dataPtr = (TransformChannelData *) instanceData;
- Tcl_Channel downChan;
-
dataPtr->watchMask = mask;
/*
* No channel handlers any more. We will be notified automatically about
* events on the channel below via a call to our 'TransformNotifyProc'.
- * But we have to pass the interest down now. We are allowed to add
+ * But we have to pass the interest down now. We are allowed to add
* additional 'interest' to the mask if we want to. But this
* transformation has no such interest. It just passes the request down,
* unchanged.
@@ -1112,28 +1093,28 @@ TransformWatchProc(instanceData, mask)
* Management of the internal timer.
*/
- if ((dataPtr->timer != (Tcl_TimerToken) NULL) &&
- (!(mask & TCL_READABLE) || ResultLength(&dataPtr->result)==0)) {
- /*
+ if ((dataPtr->timer != NULL) &&
+ (!(mask & TCL_READABLE) || ResultEmpty(&dataPtr->result))) {
+ /*
* A pending timer exists, but either is there no (more) interest in
- * the events it generates or nothing is availablee for reading, so
+ * the events it generates or nothing is available for reading, so
* remove it.
*/
- Tcl_DeleteTimerHandler(dataPtr->timer);
- dataPtr->timer = (Tcl_TimerToken) NULL;
+ Tcl_DeleteTimerHandler(dataPtr->timer);
+ dataPtr->timer = NULL;
}
- if ((dataPtr->timer == (Tcl_TimerToken) NULL) &&
- (mask & TCL_READABLE) && (ResultLength(&dataPtr->result) > 0)) {
- /*
+ if ((dataPtr->timer == NULL) && (mask & TCL_READABLE)
+ && !ResultEmpty(&dataPtr->result)) {
+ /*
* There is no pending timer, but there is interest in readable events
* and we actually have data waiting, so generate a timer to flush
* that.
*/
dataPtr->timer = Tcl_CreateTimerHandler(FLUSH_DELAY,
- TransformChannelHandlerTimer, (ClientData) dataPtr);
+ TransformChannelHandlerTimer, dataPtr);
}
}
@@ -1149,24 +1130,24 @@ TransformWatchProc(instanceData, mask)
* None.
*
* Result:
- * The appropriate Tcl_File or NULL if not present.
+ * The appropriate Tcl_File or NULL if not present.
*
*----------------------------------------------------------------------
*/
static int
-TransformGetFileHandleProc(instanceData, direction, handlePtr)
- ClientData instanceData; /* Channel to query */
- int direction; /* Direction of interest */
- ClientData *handlePtr; /* Place to store the handle into */
+TransformGetFileHandleProc(
+ ClientData instanceData, /* Channel to query. */
+ int direction, /* Direction of interest. */
+ ClientData *handlePtr) /* Place to store the handle into. */
{
+ TransformChannelData *dataPtr = instanceData;
+
/*
- * Return the handle belonging to parent channel. IOW, pass the request
+ * Return the handle belonging to parent channel. IOW, pass the request
* down and the result up.
*/
- TransformChannelData *dataPtr = (TransformChannelData *) instanceData;
-
return Tcl_GetChannelHandle(Tcl_GetStackedChannel(dataPtr->self),
direction, handlePtr);
}
@@ -1189,18 +1170,19 @@ TransformGetFileHandleProc(instanceData, direction, handlePtr)
*/
static int
-TransformNotifyProc(clientData, mask)
- ClientData clientData; /* The state of the notified transformation */
- int mask; /* The mask of occuring events */
+TransformNotifyProc(
+ ClientData clientData, /* The state of the notified
+ * transformation. */
+ int mask) /* The mask of occuring events. */
{
- TransformChannelData *dataPtr = (TransformChannelData *) clientData;
+ TransformChannelData *dataPtr = clientData;
/*
- * An event occured in the underlying channel. This transformation
- * doesn't process such events thus returns the incoming mask unchanged.
+ * An event occured in the underlying channel. This transformation doesn't
+ * process such events thus returns the incoming mask unchanged.
*/
- if (dataPtr->timer != (Tcl_TimerToken) NULL) {
+ if (dataPtr->timer != NULL) {
/*
* Delete an existing timer. It was not fired, yet we are here, so the
* channel below generated such an event and we don't have to. The
@@ -1210,9 +1192,8 @@ TransformNotifyProc(clientData, mask)
*/
Tcl_DeleteTimerHandler(dataPtr->timer);
- dataPtr->timer = (Tcl_TimerToken) NULL;
+ dataPtr->timer = NULL;
}
-
return mask;
}
@@ -1234,15 +1215,13 @@ TransformNotifyProc(clientData, mask)
*/
static void
-TransformChannelHandlerTimer(clientData)
- ClientData clientData; /* Transformation to query */
+TransformChannelHandlerTimer(
+ ClientData clientData) /* Transformation to query. */
{
- TransformChannelData *dataPtr = (TransformChannelData *) clientData;
-
- dataPtr->timer = (Tcl_TimerToken) NULL;
+ TransformChannelData *dataPtr = clientData;
- if (!(dataPtr->watchMask & TCL_READABLE) ||
- (ResultLength(&dataPtr->result) == 0)) {
+ dataPtr->timer = NULL;
+ if (!(dataPtr->watchMask&TCL_READABLE) || ResultEmpty(&dataPtr->result)) {
/*
* The timer fired, but either is there no (more) interest in the
* events it generates or nothing is available for reading, so ignore
@@ -1251,7 +1230,6 @@ TransformChannelHandlerTimer(clientData)
return;
}
-
Tcl_NotifyChannel(dataPtr->self, TCL_READABLE);
}
@@ -1271,15 +1249,15 @@ TransformChannelHandlerTimer(clientData)
*----------------------------------------------------------------------
*/
-static void
-ResultClear(r)
- ResultBuffer *r; /* Reference to the buffer to clear out. */
+static inline void
+ResultClear(
+ ResultBuffer *r) /* Reference to the buffer to clear out. */
{
r->used = 0;
if (r->allocated) {
- ckfree((char *) r->buf);
- r->buf = UCHARP(NULL);
+ ckfree(r->buf);
+ r->buf = NULL;
r->allocated = 0;
}
}
@@ -1301,36 +1279,37 @@ ResultClear(r)
*----------------------------------------------------------------------
*/
-static void
-ResultInit(r)
- ResultBuffer *r; /* Reference to the structure to initialize */
+static inline void
+ResultInit(
+ ResultBuffer *r) /* Reference to the structure to
+ * initialize. */
{
r->used = 0;
r->allocated = 0;
- r->buf = UCHARP(NULL);
+ r->buf = NULL;
}
/*
*----------------------------------------------------------------------
*
- * ResultLength --
+ * ResultEmpty --
*
- * Returns the number of bytes stored in the buffer.
+ * Returns whether the number of bytes stored in the buffer is zero.
*
* Side effects:
* None.
*
* Result:
- * An integer, see above too.
+ * A boolean.
*
*----------------------------------------------------------------------
*/
-static int
-ResultLength(r)
- ResultBuffer *r; /* The structure to query */
+static inline int
+ResultEmpty(
+ ResultBuffer *r) /* The structure to query. */
{
- return r->used;
+ return r->used == 0;
}
/*
@@ -1351,52 +1330,44 @@ ResultLength(r)
*----------------------------------------------------------------------
*/
-static int
-ResultCopy(r, buf, toRead)
- ResultBuffer *r; /* The buffer to read from. */
- unsigned char *buf; /* The buffer to copy into. */
- int toRead; /* Number of requested bytes. */
+static inline int
+ResultCopy(
+ ResultBuffer *r, /* The buffer to read from. */
+ unsigned char *buf, /* The buffer to copy into. */
+ size_t toRead) /* Number of requested bytes. */
{
if (r->used == 0) {
- /*
+ /*
* Nothing to copy in the case of an empty buffer.
*/
- return 0;
- }
-
- if (r->used == toRead) {
- /*
+ return 0;
+ } else if (r->used == toRead) {
+ /*
* We have just enough. Copy everything to the caller.
*/
- memcpy((VOID *) buf, (VOID *) r->buf, (size_t) toRead);
+ memcpy(buf, r->buf, toRead);
r->used = 0;
- return toRead;
- }
-
- if (r->used > toRead) {
- /*
- * The internal buffer contains more than requested. Copy the
+ } else if (r->used > toRead) {
+ /*
+ * The internal buffer contains more than requested. Copy the
* requested subset to the caller, and shift the remaining bytes down.
*/
- memcpy((VOID *) buf, (VOID *) r->buf, (size_t) toRead);
- memmove((VOID *) r->buf, (VOID *) (r->buf + toRead),
- (size_t) r->used - toRead);
-
+ memcpy(buf, r->buf, toRead);
+ memmove(r->buf, r->buf + toRead, r->used - toRead);
r->used -= toRead;
- return toRead;
- }
-
- /*
- * There is not enough in the buffer to satisfy the caller, so take
- * everything.
- */
+ } else {
+ /*
+ * There is not enough in the buffer to satisfy the caller, so take
+ * everything.
+ */
- memcpy((VOID *) buf, (VOID *) r->buf, (size_t) r->used);
- toRead = r->used;
- r->used = 0;
+ memcpy(buf, r->buf, r->used);
+ toRead = r->used;
+ r->used = 0;
+ }
return toRead;
}
@@ -1416,29 +1387,31 @@ ResultCopy(r, buf, toRead)
*----------------------------------------------------------------------
*/
-static void
-ResultAdd(r, buf, toWrite)
- ResultBuffer *r; /* The buffer to extend */
- unsigned char *buf; /* The buffer to read from */
- int toWrite; /* The number of bytes in 'buf' */
+static inline void
+ResultAdd(
+ ResultBuffer *r, /* The buffer to extend. */
+ unsigned char *buf, /* The buffer to read from. */
+ size_t toWrite) /* The number of bytes in 'buf'. */
{
- if ((r->used + toWrite) > r->allocated) {
- /*
+ if (r->used + toWrite > r->allocated) {
+ /*
* Extension of the internal buffer is required.
*/
- if (r->allocated == 0) {
+ if (r->allocated == 0) {
r->allocated = toWrite + INCREMENT;
- r->buf = UCHARP(ckalloc((unsigned) r->allocated));
+ r->buf = ckalloc(r->allocated);
} else {
r->allocated += toWrite + INCREMENT;
- r->buf = UCHARP(ckrealloc((char *) r->buf,
- (unsigned) r->allocated));
+ r->buf = ckrealloc(r->buf, r->allocated);
}
}
- /* now copy data */
- memcpy(r->buf + r->used, buf, (size_t) toWrite);
+ /*
+ * Now we may copy the data.
+ */
+
+ memcpy(r->buf + r->used, buf, toWrite);
r->used += toWrite;
}