Skip to content

Commit 753a744

Browse files
committed
info: convert to use subcmd
This means we get -commands and usage via -help Signed-off-by: Steve Bennett <[email protected]>
1 parent 9609293 commit 753a744

File tree

1 file changed

+92
-97
lines changed

1 file changed

+92
-97
lines changed

jim.c

Lines changed: 92 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -15470,23 +15470,63 @@ static int JimIsGlobalNamespace(Jim_Obj *objPtr)
1547015470
/* [info] */
1547115471
static 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

Comments
 (0)