Posted to tcl by patthoyts at Fri Apr 18 15:59:16 GMT 2008view pretty
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.