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;
}