Posted to tcl by patthoyts at Mon May 12 08:44:08 GMT 2008view raw

  1. typedef struct Ensemble {
  2. const char *name;
  3. Tcl_ObjCmdProc *command;
  4. struct Ensemble *ensemble;
  5. } Ensemble;
  6.  
  7. static Ensemble Ftd2xxEnsemble[] = {
  8. { "open", OpenCmd, NULL },
  9. { "list", ListCmd, NULL },
  10. { "purge", PurgeCmd, NULL },
  11. { "reset", ResetCmd, NULL },
  12. { NULL, NULL, NULL }
  13. };
  14.  
  15. static int
  16. EnsembleCmd(ClientData clientData, Tcl_Interp *interp,
  17. int objc, Tcl_Obj *const objv[])
  18. {
  19. Ensemble *ensemble = Ftd2xxEnsemble;
  20. int option = 1, index;
  21. while (option < objc) {
  22. if (Tcl_GetIndexFromObjStruct(interp, objv[option], ensemble,
  23. sizeof(ensemble[0]), "command", 0, &index) != TCL_OK)
  24. {
  25. return TCL_ERROR;
  26. }
  27. if (ensemble[index].command) {
  28. return ensemble[index].command(clientData, interp, objc, objv);
  29. }
  30. ensemble = ensemble[index].ensemble;
  31. ++option;
  32. }
  33. Tcl_WrongNumArgs(interp, option, objv, "option ?arg arg ...?");
  34. return TCL_ERROR;
  35. }