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.