Posted to tcl by patthoyts at Fri Apr 18 15:59:16 GMT 2008view raw

  1. static int OpenCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);
  2. static int ListCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);
  3. static int PurgeCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);
  4. static int ResetCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]);
  5.  
  6. typedef struct Ensemble {
  7. const char *name;
  8. Tcl_ObjCmdProc *command;
  9. struct Ensemble *ensemble;
  10. } Ensemble;
  11.  
  12. static Ensemble Ftd2xxEnsemble[] = {
  13. { "open", OpenCmd, NULL },
  14. { "list", ListCmd, NULL },
  15. { "purge", PurgeCmd, NULL },
  16. { "reset", ResetCmd, NULL },
  17. { NULL, NULL, NULL }
  18. };
  19.  
  20. static int
  21. EnsembleCmd(ClientData clientData, Tcl_Interp *interp,
  22. int objc, Tcl_Obj *const objv[])
  23. {
  24. Ensemble *ensemble = Ftd2xxEnsemble;
  25. int option = 1, index;
  26. while (option < objc) {
  27. if (Tcl_GetIndexFromObjStruct(interp, objv[option], ensemble,
  28. sizeof(ensemble[0]), "command", 0, &index) != TCL_OK)
  29. {
  30. return TCL_ERROR;
  31. }
  32. if (ensemble[index].command) {
  33. return ensemble[index].command(clientData, interp, objc, objv);
  34. }
  35. ensemble = ensemble[index].ensemble;
  36. ++option;
  37. }
  38. Tcl_WrongNumArgs(interp, option, objv, "option ?arg arg ...?");
  39. return TCL_ERROR;
  40. }
  41.  
  42. in the package init function:
  43.  
  44. Tcl_CreateObjCommand(interp, "ftd2xx", EnsembleCmd, pkgPtr, DeleteProc);
  45.  
  46. So now we have one package command with some sub-commands. eg:
  47. ftd2xx open ....
  48. ftd2xx list
  49. etc.