int filecounter()

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