int Web_Filecounter()

in src/generic/filecounter.c [53:164]


int Web_Filecounter(ClientData clientData,
		    Tcl_Interp * interp, int objc, Tcl_Obj * objv[])
{

    SeqNoGenerator *seqnogen = (SeqNoGenerator *) clientData;
    static TCLCONST char *subCommands[] = { "curval", "nextval", "getval", "config", NULL };
    enum subCommands
    { CURVAL, NEXTVAL, GETVAL, CONFIG };

    int idx = 0;
    int seqno;
    Tcl_Obj *result = NULL;

    /* ----------------------------------------------------------------------
     * deal with an existing filecounter
     * ------------------------------------------------------------------- */

    if (objc != 2) {
	Tcl_WrongNumArgs(interp, 1, objv, "curval|nextval|getval|config");
	return TCL_ERROR;
    }

    if (seqnogen == NULL)
	return TCL_ERROR;

    /* ------------------------------------------------------------------------
     * scan for options
     * --------------------------------------------------------------------- */
    if (Tcl_GetIndexFromObj(interp, objv[1], subCommands, "option", 0, &idx)
	!= TCL_OK) {
	return TCL_ERROR;
    }

    switch ((enum subCommands) idx) {
    case NEXTVAL:{
	    if (nextSeqNo(interp, seqnogen, &seqno, 1) != TCL_OK) {
		/* error reporting done in subfunction */
		return TCL_ERROR;
	    }
	    result = Tcl_NewIntObj(seqno);
	    Tcl_SetObjResult(interp, result);
	    return TCL_OK;
	    break;
	}
    case GETVAL:{
	    if (nextSeqNo(interp, seqnogen, &seqno, 0) != TCL_OK) {
		/* error reporting done in subfunction */
		return TCL_ERROR;
	    }
	    result = Tcl_NewIntObj(seqno);
	    Tcl_SetObjResult(interp, result);
	    return TCL_OK;
	    break;
	}
    case CURVAL:{
	    if (seqnogen->hasCurrent) {
		result = Tcl_NewIntObj(seqnogen->currValue);
		Tcl_SetObjResult(interp, result);
		return TCL_OK;
		break;
	    }
	    else {
		Tcl_SetResult(interp,
			      "web::filecounter: no current value available",
			      TCL_STATIC);
		return TCL_ERROR;
	    }
	}
    case CONFIG:{

	    Tcl_Obj *kv[18];
	    int i;
	    char buf[10];

	    for (i = 0; i < 18; i++)
		kv[i] = Tcl_NewObj();

	    Tcl_SetStringObj(kv[0], "file", -1);
	    Tcl_SetStringObj(kv[1], seqnogen->fileName, -1);
	    Tcl_SetStringObj(kv[2], "handle", -1);
	    Tcl_SetStringObj(kv[3], seqnogen->handleName, -1);
	    Tcl_SetStringObj(kv[4], "seed", -1);
	    Tcl_SetIntObj(kv[5], seqnogen->seed);
	    Tcl_SetStringObj(kv[6], "min", -1);
	    Tcl_SetIntObj(kv[7], seqnogen->minValue);
	    Tcl_SetStringObj(kv[8], "max", -1);
	    Tcl_SetIntObj(kv[9], seqnogen->maxValue);
	    Tcl_SetStringObj(kv[10], "incr", -1);
	    Tcl_SetIntObj(kv[11], seqnogen->incrValue);
	    Tcl_SetStringObj(kv[12], "perms", -1);
	    sprintf(buf, "%04o", seqnogen->mask);
	    Tcl_SetStringObj(kv[13], buf, -1);
	    Tcl_SetStringObj(kv[14], "wrap", -1);
	    if (seqnogen->doWrap)
		Tcl_SetStringObj(kv[15], "true", -1);
	    else
		Tcl_SetStringObj(kv[15], "false", -1);
	    Tcl_SetStringObj(kv[16], "curr", -1);
	    if (seqnogen->hasCurrent)
		Tcl_SetIntObj(kv[17], seqnogen->currValue);
	    else
		Tcl_SetStringObj(kv[17], "not valid", -1);

	    result = Tcl_NewListObj(18, kv);
	    Tcl_SetObjResult(interp, result);
	    return TCL_OK;
	    break;
	}
    }
    Tcl_SetResult(interp, "error during web::filecounter", NULL);
    return TCL_ERROR;
}