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