in src/generic/filecounter.c [170:253]
int filecounter(ClientData clientData, Tcl_Interp * interp,
int objc, Tcl_Obj * CONST objv[])
{
RequestData * requestData = (RequestData *) clientData;
Tcl_Obj *hnameobj, *fnameobj, *seedobj, *maxobj,
*minobj, *incrobj, *maskobj, *wrapobj;
SeqNoGenerator *seqnogen = NULL;
Tcl_Obj *result = NULL;
Tcl_CmdInfo cmdInfo;
static TCLCONST char *params[] = { "-filename", "-seed", "-min", "-max",
"-incr", "-perms", "-wrap", NULL
};
enum params
{ FILENAME, SEED, MIN, MAX, INCR, MASK, WRAP };
int idx;
/* ----------------------------------------------------------------------
* check for unknown params
* ------------------------------------------------------------------- */
WebAssertArgs(interp, objc, objv, params, idx, -1);
/* ----------------------------------------------------------------------
* minimum requirement is: handle -filename <filename>
* ------------------------------------------------------------------- */
if (objc < 4 ||
argIndexOfFirstArg(objc, objv, NULL, NULL) != 1 ||
(fnameobj = argValueOfKey(objc, objv, (char *) params[FILENAME])) == NULL) {
Tcl_WrongNumArgs(interp, 1, objv,
"handle -filename filename ?options?");
return TCL_ERROR;
}
/* ----------------------------------------------------------------------
* ok - retrieve params
* ------------------------------------------------------------------- */
hnameobj = objv[1];
/* fnameobj already done */
seedobj = argValueOfKey(objc, objv, (char *)params[SEED]);
maxobj = argValueOfKey(objc, objv, (char *)params[MAX]);
minobj = argValueOfKey(objc, objv, (char *)params[MIN]);
incrobj = argValueOfKey(objc, objv, (char *)params[INCR]);
maskobj = argValueOfKey(objc, objv, (char *)params[MASK]);
wrapobj = argValueOfKey(objc, objv, (char *)params[WRAP]);
/* ----------------------------------------------------------------------
* check if handle already exists
* ------------------------------------------------------------------- */
if (Tcl_GetCommandInfo(interp, Tcl_GetString(hnameobj), &cmdInfo) != 0) {
Tcl_SetResult(interp, "web::filecounter: handle already exists",
NULL);
return TCL_ERROR;
}
/* ----------------------------------------------------------------------
* create SeqNoGenerator
* ------------------------------------------------------------------- */
seqnogen = createSeqNoGenerator(requestData,
hnameobj, fnameobj, seedobj, minobj,
maxobj, incrobj, maskobj, wrapobj);
if (seqnogen == NULL) {
Tcl_SetResult(interp,
"web::filecounter: invalid or inconsistent arguments",
NULL);
return TCL_ERROR;
}
result = Tcl_NewStringObj(seqnogen->handleName, -1);
Tcl_CreateObjCommand(interp, seqnogen->handleName,
(Tcl_ObjCmdProc *) Web_Filecounter,
(ClientData) seqnogen, (Tcl_CmdDeleteProc *) destroySeqNoGenerator);
/* ----------------------------------------------------------------------
* register private data with interp under the name of the handle
* ------------------------------------------------------------------- */
Tcl_SetAssocData(interp, seqnogen->handleName,
(Tcl_InterpDeleteProc *) NULL,
(ClientData) seqnogen);
Tcl_SetObjResult(interp, result);
return TCL_OK;
}