Posted to tcl by patthoyts at Mon May 12 08:44:08 GMT 2008view pretty
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; }