| top | |
| ^ |
| |
| |
| section top | |
| ^ |
| |
| |
| section top | |
typedef struct {
Obj buffer;
Obj closeScript;
} WriteDataContext,*pWriteDataContext;
static int writeDataClose(ptr c,Intr intr) {
pWriteDataContext C = c;
Obj script = C->closeScript;
int rc;
if (!intr) return 0;
if (Tcl_IsShared(script)) {
decr(script); script = incr(Tcl_DuplicateObj(C->closeScript));
}
rc = Tcl_ListObjAppendElement(intr,script,C->buffer);
if (rc==TCL_OK) rc = Tcl_GlobalEvalObj(intr,script);
else Tcl_AppendResult(intr,"\nwhile appending the closed buffer to data script.");
decr(script); decr(C->buffer); dispose(C);
return rc==TCL_OK ? 0 : 5;
}
static int writeDataReadInvalid(ptr c,chars buf,int size,int *err) {
*err = 22; return -1;
}
static int writeDataWrite(ptr c,chars buf,int size,int *err) {
pWriteDataContext C = c;
if (size>=0) Tcl_AppendToObj(C->buffer,buf,size);
return size;
}
static Tcl_ChannelType writeDataChannel = {
"WyrmWriteData",
TCL_CHANNEL_VERSION_2,
writeDataClose,
writeDataReadInvalid,
(Tcl_DriverOutputProc*)writeDataWrite,
0,
0,
0,
dataWatcher,
dataHandle,
0,
0,
0,
0,
0,
};
Tcl_Channel wyrm_dataWrite(Obj closeScript) {
pWriteDataContext C = heap(WriteDataContext); char name[40];
TCL_DECLARE_MUTEX(Klock);
static int K; int k;
Tcl_MutexLock(Klock);
k = ++K;
Tcl_MutexUnlock(Klock);
C->buffer = incr(Tcl_NewObj()); C->closeScript = incr(closeScript);
sprintf(name,"wyrmWriteData%d",k);
return Tcl_CreateChannel(&writeDataChannel,name,C,TCL_WRITABLE);
}
| ^ |
| |
| |
| section top | |
Tcl_Channel wyrm_dataWrite(Obj closeScript);
| ^ |
Definition continued at: 15. | |
| |
| section top | |
int wyrm_dataWriteArgument(Intr intr,chars channelName,Obj argument) {
int mode; Tcl_Channel channel = Tcl_GetChannel(intr, channelName,&mode);
pWriteDataContext C = channel ? Tcl_GetChannelInstanceData(channel) : 0;
if (channel && strbegins("wyrmWriteData",channelName) && (mode&TCL_WRITABLE)) {
if (Tcl_IsShared(C->closeScript)) {
Obj t = incr(Tcl_DuplicateObj(C->closeScript));
decr(C->closeScript); C->closeScript = t;
}
return Tcl_ListObjAppendElement(intr,C->closeScript,argument);
}else
return rprintf(intr,"%!not a data-write channel",TCL_ERROR);
}
| ^ |
| |
| |
| section top | |
int wyrm_dataWriteArgument(Intr intr,chars channelName,Obj argument);
| ^ |
| |
| |
| section top | |
| ^ |
| |
| |
| section top | |
| ^ |
| |