Posted to tcl by patthoyts at Fri Apr 18 15:59:16 GMT 2008view raw
- static int OpenCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);
- static int ListCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);
- static int PurgeCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);
- static int ResetCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);
- typedef struct Ensemble {
- const char *name;
- Tcl_ObjCmdProc *command;
- struct Ensemble *ensemble;
- } Ensemble;
- static Ensemble Ftd2xxEnsemble[] = {
- { "open", OpenCmd, NULL },
- { "list", ListCmd, NULL },
- { "purge", PurgeCmd, NULL },
- { "reset", ResetCmd, NULL },
- { NULL, NULL, NULL }
- };
- static int
- EnsembleCmd(ClientData clientData, Tcl_Interp *interp,
- int objc, Tcl_Obj *const objv[])
- {
- Ensemble *ensemble = Ftd2xxEnsemble;
- int option = 1, index;
- while (option < objc) {
- if (Tcl_GetIndexFromObjStruct(interp, objv[option], ensemble,
- sizeof(ensemble[0]), "command", 0, &index) != TCL_OK)
- {
- return TCL_ERROR;
- }
- if (ensemble[index].command) {
- return ensemble[index].command(clientData, interp, objc, objv);
- }
- ensemble = ensemble[index].ensemble;
- ++option;
- }
- Tcl_WrongNumArgs(interp, option, objv, "option ?arg arg ...?");
- return TCL_ERROR;
- }
- in the package init function:
- Tcl_CreateObjCommand(interp, "ftd2xx", EnsembleCmd, pkgPtr, DeleteProc);
- So now we have one package command with some sub-commands. eg:
- ftd2xx open ....
- ftd2xx list
- etc.