@@ -15470,23 +15470,63 @@ static int JimIsGlobalNamespace(Jim_Obj *objPtr)
1547015470/* [info] */
1547115471static int Jim_InfoCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
1547215472{
15473- int cmd;
1547415473 Jim_Obj *objPtr;
1547515474 int mode = 0;
1547615475
15477- static const char * const commands[] = {
15478- "body", "statics", "commands", "procs", "channels", "exists", "globals", "level", "frame", "locals",
15479- "vars", "version", "patchlevel", "complete", "args", "hostname",
15480- "script", "source", "stacktrace", "nameofexecutable", "returncodes",
15481- "references", "alias", NULL
15476+ /* Must be kept in order with the array below */
15477+ enum {
15478+ INFO_ALIAS,
15479+ INFO_ARGS,
15480+ INFO_BODY,
15481+ INFO_CHANNELS,
15482+ INFO_COMMANDS,
15483+ INFO_COMPLETE,
15484+ INFO_EXISTS,
15485+ INFO_FRAME,
15486+ INFO_GLOBALS,
15487+ INFO_HOSTNAME,
15488+ INFO_LEVEL,
15489+ INFO_LOCALS,
15490+ INFO_NAMEOFEXECUTABLE,
15491+ INFO_PATCHLEVEL,
15492+ INFO_PROCS,
15493+ INFO_REFERENCES,
15494+ INFO_RETURNCODES,
15495+ INFO_SCRIPT,
15496+ INFO_SOURCE,
15497+ INFO_STACKTRACE,
15498+ INFO_STATICS,
15499+ INFO_VARS,
15500+ INFO_VERSION,
15501+ INFO_COUNT
1548215502 };
15483- enum
15484- { INFO_BODY, INFO_STATICS, INFO_COMMANDS, INFO_PROCS, INFO_CHANNELS, INFO_EXISTS, INFO_GLOBALS, INFO_LEVEL,
15485- INFO_FRAME, INFO_LOCALS, INFO_VARS, INFO_VERSION, INFO_PATCHLEVEL, INFO_COMPLETE, INFO_ARGS,
15486- INFO_HOSTNAME, INFO_SCRIPT, INFO_SOURCE, INFO_STACKTRACE, INFO_NAMEOFEXECUTABLE,
15487- INFO_RETURNCODES, INFO_REFERENCES, INFO_ALIAS,
15503+ static const jim_subcmd_type cmds[INFO_COUNT + 1] = {
15504+ JIM_DEF_SUBCMD("alias", "command", 1, 1),
15505+ JIM_DEF_SUBCMD("args", "procname", 1, 1),
15506+ JIM_DEF_SUBCMD("body", "procname", 1, 1),
15507+ JIM_DEF_SUBCMD("channels", "?pattern?", 0, 1),
15508+ JIM_DEF_SUBCMD("commands", "?pattern?", 0, 1),
15509+ JIM_DEF_SUBCMD("complete", "script ?missing?", 1, 2),
15510+ JIM_DEF_SUBCMD("exists", "varName", 1, 1),
15511+ JIM_DEF_SUBCMD("frame", "?levelNum?", 0, 1),
15512+ JIM_DEF_SUBCMD("globals", "?pattern?", 0, 1),
15513+ JIM_DEF_SUBCMD("hostname", NULL, 0, 0),
15514+ JIM_DEF_SUBCMD("level", "?levelNum?", 0, 1),
15515+ JIM_DEF_SUBCMD("locals", "?pattern?", 0, 1),
15516+ JIM_DEF_SUBCMD("nameofexecutable", NULL, 0, 0),
15517+ JIM_DEF_SUBCMD("patchlevel", NULL, 0, 0),
15518+ JIM_DEF_SUBCMD("procs", "?pattern?", 0, 1),
15519+ JIM_DEF_SUBCMD("references", NULL, 0, 0),
15520+ JIM_DEF_SUBCMD("returncodes", "?code?", 0, 1),
15521+ JIM_DEF_SUBCMD("script", NULL, 0, 0),
15522+ JIM_DEF_SUBCMD("source", "source ?filename line?", 1, 3),
15523+ JIM_DEF_SUBCMD("stacktrace", NULL, 0, 0),
15524+ JIM_DEF_SUBCMD("statics", "procname", 1, 1),
15525+ JIM_DEF_SUBCMD("vars", "?pattern?", 0, 1),
15526+ JIM_DEF_SUBCMD("version", NULL, 0, 0),
15527+ { /* null terminator */ }
1548815528 };
15489-
15529+ const jim_subcmd_type *ct;
1549015530#ifdef jim_ext_namespace
1549115531 int nons = 0;
1549215532
@@ -15497,32 +15537,25 @@ static int Jim_InfoCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg
1549715537 nons = 1;
1549815538 }
1549915539#endif
15500-
15501- if (argc < 2) {
15502- Jim_WrongNumArgs(interp, 1, argv, "subcommand ?args ...?");
15540+ ct = Jim_ParseSubCmd(interp, cmds, argc, argv);
15541+ if (!ct) {
1550315542 return JIM_ERR;
1550415543 }
15505- if (Jim_GetEnum(interp, argv[1], commands, &cmd, "subcommand", JIM_ERRMSG | JIM_ENUM_ABBREV) != JIM_OK) {
15506- return Jim_CheckShowCommands(interp, argv[1], commands);
15544+ if (ct->function) {
15545+ /* This is -help or -commands */
15546+ return ct->function(interp, argc, argv);
1550715547 }
15548+ /* (ct - cmds) is the index into the table */
15549+ int option = ct - cmds;
1550815550
15509- /* Test for the most common commands first, just in case it makes a difference */
15510- switch (cmd) {
15551+ switch (option) {
1551115552 case INFO_EXISTS:
15512- if (argc != 3) {
15513- Jim_WrongNumArgs(interp, 2, argv, "varName");
15514- return JIM_ERR;
15515- }
1551615553 Jim_SetResultBool(interp, Jim_GetVariable(interp, argv[2], 0) != NULL);
15517- break ;
15554+ return JIM_OK ;
1551815555
1551915556 case INFO_ALIAS:{
1552015557 Jim_Cmd *cmdPtr;
1552115558
15522- if (argc != 3) {
15523- Jim_WrongNumArgs(interp, 2, argv, "command");
15524- return JIM_ERR;
15525- }
1552615559 if ((cmdPtr = Jim_GetCommand(interp, argv[2], JIM_ERRMSG)) == NULL) {
1552715560 return JIM_ERR;
1552815561 }
@@ -15546,10 +15579,6 @@ static int Jim_InfoCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg
1554615579 /* fall through */
1554715580 case INFO_COMMANDS:
1554815581 /* mode 0 => JIM_CMDLIST_COMMANDS */
15549- if (argc != 2 && argc != 3) {
15550- Jim_WrongNumArgs(interp, 2, argv, "?pattern?");
15551- return JIM_ERR;
15552- }
1555315582#ifdef jim_ext_namespace
1555415583 if (!nons) {
1555515584 if (Jim_Length(interp->framePtr->nsObj) || (argc == 3 && JimIsGlobalNamespace(argv[2]))) {
@@ -15558,7 +15587,7 @@ static int Jim_InfoCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg
1555815587 }
1555915588#endif
1556015589 Jim_SetResult(interp, JimCommandsList(interp, (argc == 3) ? argv[2] : NULL, mode));
15561- break ;
15590+ return JIM_OK ;
1556215591
1556315592 case INFO_VARS:
1556415593 mode++; /* JIM_VARLIST_VARS */
@@ -15568,10 +15597,6 @@ static int Jim_InfoCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg
1556815597 /* fall through */
1556915598 case INFO_GLOBALS:
1557015599 /* mode 0 => JIM_VARLIST_GLOBALS */
15571- if (argc != 2 && argc != 3) {
15572- Jim_WrongNumArgs(interp, 2, argv, "?pattern?");
15573- return JIM_ERR;
15574- }
1557515600#ifdef jim_ext_namespace
1557615601 if (!nons) {
1557715602 if (Jim_Length(interp->framePtr->nsObj) || (argc == 3 && JimIsGlobalNamespace(argv[2]))) {
@@ -15580,23 +15605,19 @@ static int Jim_InfoCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg
1558015605 }
1558115606#endif
1558215607 Jim_SetResult(interp, JimVariablesList(interp, argc == 3 ? argv[2] : NULL, mode));
15583- break ;
15608+ return JIM_OK ;
1558415609
1558515610 case INFO_SCRIPT:
15586- if (argc != 2) {
15587- Jim_WrongNumArgs(interp, 2, argv, "");
15588- return JIM_ERR;
15589- }
1559015611 Jim_SetResult(interp, JimGetScript(interp, interp->evalFrame->scriptObj)->fileNameObj);
15591- break ;
15612+ return JIM_OK ;
1559215613
1559315614 case INFO_SOURCE:{
1559415615 jim_wide line;
1559515616 Jim_Obj *resObjPtr;
1559615617 Jim_Obj *fileNameObj;
1559715618
15598- if (argc != 3 && argc != 5 ) {
15599- Jim_WrongNumArgs (interp, 2 , argv, "source ?filename line?" );
15619+ if (argc == 4 ) {
15620+ Jim_SubCmdArgError (interp, ct , argv[0] );
1560015621 return JIM_ERR;
1560115622 }
1560215623 if (argc == 5) {
@@ -15625,68 +15646,50 @@ static int Jim_InfoCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg
1562515646 Jim_ListAppendElement(interp, resObjPtr, Jim_NewIntObj(interp, line));
1562615647 }
1562715648 Jim_SetResult(interp, resObjPtr);
15628- break ;
15649+ return JIM_OK ;
1562915650 }
1563015651
1563115652 case INFO_STACKTRACE:
1563215653 Jim_SetResult(interp, interp->stackTrace);
15633- break ;
15654+ return JIM_OK ;
1563415655
1563515656 case INFO_LEVEL:
15636- switch (argc) {
15637- case 2:
15638- Jim_SetResultInt(interp, interp->framePtr->level);
15639- break;
15640-
15641- case 3:
15642- if (JimInfoLevel(interp, argv[2], &objPtr) != JIM_OK) {
15643- return JIM_ERR;
15644- }
15645- Jim_SetResult(interp, objPtr);
15646- break;
15647-
15648- default:
15649- Jim_WrongNumArgs(interp, 2, argv, "?levelNum?");
15657+ if (argc == 2) {
15658+ Jim_SetResultInt(interp, interp->framePtr->level);
15659+ }
15660+ else {
15661+ if (JimInfoLevel(interp, argv[2], &objPtr) != JIM_OK) {
1565015662 return JIM_ERR;
15663+ }
15664+ Jim_SetResult(interp, objPtr);
1565115665 }
15652- break ;
15666+ return JIM_OK ;
1565315667
1565415668 case INFO_FRAME:
15655- switch (argc) {
15656- case 2:
15657- Jim_SetResultInt(interp, interp->procLevel + 1);
15658- break;
15659-
15660- case 3:
15661- if (JimInfoFrame(interp, argv[2], &objPtr) != JIM_OK) {
15662- return JIM_ERR;
15663- }
15664- Jim_SetResult(interp, objPtr);
15665- break;
15666-
15667- default:
15668- Jim_WrongNumArgs(interp, 2, argv, "?levelNum?");
15669+ if (argc == 2) {
15670+ Jim_SetResultInt(interp, interp->procLevel + 1);
15671+ }
15672+ else {
15673+ if (JimInfoFrame(interp, argv[2], &objPtr) != JIM_OK) {
1566915674 return JIM_ERR;
15675+ }
15676+ Jim_SetResult(interp, objPtr);
1567015677 }
15671- break ;
15678+ return JIM_OK ;
1567215679
1567315680 case INFO_BODY:
1567415681 case INFO_STATICS:
1567515682 case INFO_ARGS:{
1567615683 Jim_Cmd *cmdPtr;
1567715684
15678- if (argc != 3) {
15679- Jim_WrongNumArgs(interp, 2, argv, "procname");
15680- return JIM_ERR;
15681- }
1568215685 if ((cmdPtr = Jim_GetCommand(interp, argv[2], JIM_ERRMSG)) == NULL) {
1568315686 return JIM_ERR;
1568415687 }
1568515688 if (!cmdPtr->isproc) {
1568615689 Jim_SetResultFormatted(interp, "command \"%#s\" is not a procedure", argv[2]);
1568715690 return JIM_ERR;
1568815691 }
15689- switch (cmd ) {
15692+ switch (option ) {
1569015693#ifdef JIM_NO_INTROSPECTION
1569115694 default:
1569215695 Jim_SetResultString(interp, "unsupported", -1);
@@ -15706,7 +15709,7 @@ static int Jim_InfoCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg
1570615709 }
1570715710 break;
1570815711 }
15709- break ;
15712+ return JIM_OK ;
1571015713 }
1571115714
1571215715 case INFO_VERSION:
@@ -15715,23 +15718,18 @@ static int Jim_InfoCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg
1571515718
1571615719 sprintf(buf, "%d.%d", JIM_VERSION / 100, JIM_VERSION % 100);
1571715720 Jim_SetResultString(interp, buf, -1);
15718- break ;
15721+ return JIM_OK ;
1571915722 }
1572015723
15721- case INFO_COMPLETE:
15722- if (argc != 3 && argc != 4) {
15723- Jim_WrongNumArgs(interp, 2, argv, "script ?missing?");
15724- return JIM_ERR;
15725- }
15726- else {
15724+ case INFO_COMPLETE: {
1572715725 char missing;
1572815726
1572915727 Jim_SetResultBool(interp, Jim_ScriptIsComplete(interp, argv[2], &missing));
1573015728 if (missing != ' ' && argc == 4) {
1573115729 Jim_SetVariable(interp, argv[3], Jim_NewStringObj(interp, &missing, 1));
1573215730 }
15731+ return JIM_OK;
1573315732 }
15734- break;
1573515733
1573615734 case INFO_HOSTNAME:
1573715735 /* Redirect to os.gethostname if it exists */
@@ -15769,20 +15767,17 @@ static int Jim_InfoCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg
1576915767 Jim_SetResultString(interp, name, -1);
1577015768 }
1577115769 }
15772- else {
15773- Jim_WrongNumArgs(interp, 2, argv, "?code?");
15774- return JIM_ERR;
15775- }
15776- break;
15770+ return JIM_OK;
1577715771 case INFO_REFERENCES:
1577815772#ifdef JIM_REFERENCES
1577915773 return JimInfoReferences(interp, argc, argv);
1578015774#else
1578115775 Jim_SetResultString(interp, "not supported", -1);
1578215776 return JIM_ERR;
1578315777#endif
15778+ default:
15779+ abort();
1578415780 }
15785- return JIM_OK;
1578615781}
1578715782
1578815783/* [exists] */
0 commit comments