int varchannelInputProc()

in src/generic/varchannel.c [43:97]


int varchannelInputProc(ClientData clientData,
			char *buf, int bufSize, int *errorCodePtr)
{

    char *str = NULL;
    int strLen = 0;
    int remains = 0;
    VarChannel *varChannel = NULL;
    int isNew = 0;
    Tcl_Obj *var = NULL;

    if ((clientData == NULL) || (buf == NULL))
	return -1;

    varChannel = (VarChannel *) clientData;
    if (varChannel->varName == NULL)
	return -1;

    /* --------------------------------------------------------------------------
     * get var
     * ----------------------------------------------------------------------- */
    var = Web_GetOrCreateGlobalVar(varChannel->interp,
				   varChannel->varName, &isNew);
    if (var == NULL)
	return -1;
    if (isNew)
	varChannel->readCursor = 0;

    /* str = Tcl_GetStringFromObj(var,&strLen); */
    str = (char *) Tcl_GetByteArrayFromObj(var, &strLen);

    if (varChannel->readCursor < strLen) {

	remains = strLen - varChannel->readCursor;

	if (bufSize < remains) {
	    strncpy(buf, &(str[varChannel->readCursor]), bufSize);
	    varChannel->readCursor += bufSize;
	    if (isNew)
	      Tcl_DecrRefCount(var);
	    return bufSize;
	}
	else {
	    strncpy(buf, &(str[varChannel->readCursor]), remains);
	    varChannel->readCursor += remains;
	    if (isNew)
	      Tcl_DecrRefCount(var);
	    return remains;
	}
    }

    if (isNew)
      Tcl_DecrRefCount(var);
    return 0;
}