Skip to content

Commit f8df8ac

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

File tree

2 files changed

+126
-142
lines changed

2 files changed

+126
-142
lines changed

jim.c

Lines changed: 124 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -13483,168 +13483,152 @@ static Jim_Obj *JimGetExprAsList(Jim_Interp *interp, struct JimExprNode *node)
1348313483
#if defined(JIM_DEBUG_COMMAND) && !defined(JIM_BOOTSTRAP)
1348413484
static int Jim_DebugCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
1348513485
{
13486-
static const char * const options[] = {
13487-
"refcount", "objcount", "objects", "invstr", "scriptlen", "exprlen",
13488-
"exprbc", "show",
13489-
NULL
13486+
/* Must be kept in order with the array below */
13487+
enum {
13488+
OPT_EXPRBC,
13489+
OPT_EXPRLEN,
13490+
OPT_INVSTR,
13491+
OPT_OBJCOUNT,
13492+
OPT_OBJECTS,
13493+
OPT_REFCOUNT,
13494+
OPT_SCRIPTLEN,
13495+
OPT_SHOW,
13496+
OPT_COUNT
1349013497
};
13491-
enum
13492-
{
13493-
OPT_REFCOUNT, OPT_OBJCOUNT, OPT_OBJECTS, OPT_INVSTR, OPT_SCRIPTLEN,
13494-
OPT_EXPRLEN, OPT_EXPRBC, OPT_SHOW,
13498+
static const jim_subcmd_type cmds[OPT_COUNT + 1] = {
13499+
JIM_DEF_SUBCMD("exprbc", "expression", 1, 1),
13500+
JIM_DEF_SUBCMD("exprlen", "expression", 1, 1),
13501+
JIM_DEF_SUBCMD("invstr", "object", 1, 1),
13502+
JIM_DEF_SUBCMD("objcount", NULL, 0, 0),
13503+
JIM_DEF_SUBCMD("objects", NULL, 0, 0),
13504+
JIM_DEF_SUBCMD("refcount", "object", 1, 1),
13505+
JIM_DEF_SUBCMD("scriptlen", "script", 1, 1),
13506+
JIM_DEF_SUBCMD("show", "object", 1, 1),
13507+
{ /* null terminator */ }
1349513508
};
13496-
int option;
1349713509

13498-
if (argc < 2) {
13499-
Jim_WrongNumArgs(interp, 1, argv, "subcommand ?...?");
13510+
const jim_subcmd_type *ct = Jim_ParseSubCmd(interp, cmds, argc, argv);
13511+
if (!ct) {
1350013512
return JIM_ERR;
1350113513
}
13502-
if (Jim_GetEnum(interp, argv[1], options, &option, "subcommand", JIM_ERRMSG) != JIM_OK)
13503-
return Jim_CheckShowCommands(interp, argv[1], options);
13504-
if (option == OPT_REFCOUNT) {
13505-
if (argc != 3) {
13506-
Jim_WrongNumArgs(interp, 2, argv, "object");
13507-
return JIM_ERR;
13508-
}
13509-
Jim_SetResultInt(interp, argv[2]->refCount);
13510-
return JIM_OK;
13514+
if (ct->function) {
13515+
/* This is -help or -commands */
13516+
return ct->function(interp, argc, argv);
1351113517
}
13512-
else if (option == OPT_OBJCOUNT) {
13513-
int freeobj = 0, liveobj = 0;
13514-
char buf[256];
13515-
Jim_Obj *objPtr;
13518+
/* (ct - cmds) is the index into the table */
13519+
switch (ct - cmds) {
13520+
case OPT_REFCOUNT:
13521+
Jim_SetResultInt(interp, argv[2]->refCount);
13522+
return JIM_OK;
1351613523

13517-
if (argc != 2) {
13518-
Jim_WrongNumArgs(interp, 2, argv, "");
13519-
return JIM_ERR;
13520-
}
13521-
/* Count the number of free objects. */
13522-
objPtr = interp->freeList;
13523-
while (objPtr) {
13524-
freeobj++;
13525-
objPtr = objPtr->nextObjPtr;
13526-
}
13527-
/* Count the number of live objects. */
13528-
objPtr = interp->liveList;
13529-
while (objPtr) {
13530-
liveobj++;
13531-
objPtr = objPtr->nextObjPtr;
13532-
}
13533-
/* Set the result string and return. */
13534-
sprintf(buf, "free %d used %d", freeobj, liveobj);
13535-
Jim_SetResultString(interp, buf, -1);
13536-
return JIM_OK;
13537-
}
13538-
else if (option == OPT_OBJECTS) {
13539-
Jim_Obj *objPtr, *listObjPtr, *subListObjPtr;
13524+
case OPT_OBJCOUNT:{
13525+
int freeobj = 0, liveobj = 0;
13526+
char buf[256];
13527+
Jim_Obj *objPtr;
1354013528

13541-
if (argc != 2) {
13542-
Jim_WrongNumArgs(interp, 2, argv, "");
13543-
return JIM_ERR;
13529+
/* Count the number of free objects. */
13530+
objPtr = interp->freeList;
13531+
while (objPtr) {
13532+
freeobj++;
13533+
objPtr = objPtr->nextObjPtr;
13534+
}
13535+
/* Count the number of live objects. */
13536+
objPtr = interp->liveList;
13537+
while (objPtr) {
13538+
liveobj++;
13539+
objPtr = objPtr->nextObjPtr;
13540+
}
13541+
/* Set the result string and return. */
13542+
sprintf(buf, "free %d used %d", freeobj, liveobj);
13543+
Jim_SetResultString(interp, buf, -1);
13544+
return JIM_OK;
1354413545
}
1354513546

13546-
/* Count the number of live objects. */
13547-
objPtr = interp->liveList;
13548-
listObjPtr = Jim_NewListObj(interp, NULL, 0);
13549-
while (objPtr) {
13550-
char buf[128];
13551-
const char *type = objPtr->typePtr ? objPtr->typePtr->name : "";
13552-
13553-
subListObjPtr = Jim_NewListObj(interp, NULL, 0);
13554-
sprintf(buf, "%p", objPtr);
13555-
Jim_ListAppendElement(interp, subListObjPtr, Jim_NewStringObj(interp, buf, -1));
13556-
Jim_ListAppendElement(interp, subListObjPtr, Jim_NewStringObj(interp, type, -1));
13557-
Jim_ListAppendElement(interp, subListObjPtr, Jim_NewIntObj(interp, objPtr->refCount));
13558-
Jim_ListAppendElement(interp, subListObjPtr, objPtr);
13559-
Jim_ListAppendElement(interp, listObjPtr, subListObjPtr);
13560-
objPtr = objPtr->nextObjPtr;
13561-
}
13562-
Jim_SetResult(interp, listObjPtr);
13563-
return JIM_OK;
13564-
}
13565-
else if (option == OPT_INVSTR) {
13566-
Jim_Obj *objPtr;
13547+
case OPT_OBJECTS:{
13548+
Jim_Obj *objPtr, *listObjPtr, *subListObjPtr;
1356713549

13568-
if (argc != 3) {
13569-
Jim_WrongNumArgs(interp, 2, argv, "object");
13570-
return JIM_ERR;
13550+
/* Count the number of live objects. */
13551+
objPtr = interp->liveList;
13552+
listObjPtr = Jim_NewListObj(interp, NULL, 0);
13553+
while (objPtr) {
13554+
char buf[128];
13555+
const char *type = objPtr->typePtr ? objPtr->typePtr->name : "";
13556+
13557+
subListObjPtr = Jim_NewListObj(interp, NULL, 0);
13558+
sprintf(buf, "%p", objPtr);
13559+
Jim_ListAppendElement(interp, subListObjPtr, Jim_NewStringObj(interp, buf, -1));
13560+
Jim_ListAppendElement(interp, subListObjPtr, Jim_NewStringObj(interp, type, -1));
13561+
Jim_ListAppendElement(interp, subListObjPtr, Jim_NewIntObj(interp, objPtr->refCount));
13562+
Jim_ListAppendElement(interp, subListObjPtr, objPtr);
13563+
Jim_ListAppendElement(interp, listObjPtr, subListObjPtr);
13564+
objPtr = objPtr->nextObjPtr;
13565+
}
13566+
Jim_SetResult(interp, listObjPtr);
13567+
return JIM_OK;
1357113568
}
13572-
objPtr = argv[2];
13573-
if (objPtr->typePtr != NULL)
13574-
Jim_InvalidateStringRep(objPtr);
13575-
Jim_SetEmptyResult(interp);
13576-
return JIM_OK;
13577-
}
13578-
else if (option == OPT_SHOW) {
13579-
const char *s;
13580-
int len, charlen;
1358113569

13582-
if (argc != 3) {
13583-
Jim_WrongNumArgs(interp, 2, argv, "object");
13584-
return JIM_ERR;
13570+
case OPT_INVSTR:{
13571+
Jim_Obj *objPtr = argv[2];
13572+
if (objPtr->typePtr != NULL)
13573+
Jim_InvalidateStringRep(objPtr);
13574+
Jim_SetEmptyResult(interp);
13575+
return JIM_OK;
1358513576
}
13586-
s = Jim_GetString(argv[2], &len);
13587-
#ifdef JIM_UTF8
13588-
charlen = utf8_strlen(s, len);
13589-
#else
13590-
charlen = len;
13591-
#endif
13592-
char buf[256];
13593-
snprintf(buf, sizeof(buf), "refcount: %d, type: %s\n"
13594-
"chars (%d):",
13595-
argv[2]->refCount, JimObjTypeName(argv[2]), charlen);
13596-
Jim_SetResultFormatted(interp, "%s <<%s>>\n", buf, s);
13597-
snprintf(buf, sizeof(buf), "bytes (%d):", len);
13598-
Jim_AppendString(interp, Jim_GetResult(interp), buf, -1);
13599-
while (len--) {
13600-
snprintf(buf, sizeof(buf), " %02x", (unsigned char)*s++);
13577+
13578+
case OPT_SHOW:{
13579+
const char *s;
13580+
int len, charlen;
13581+
13582+
if (argc != 3) {
13583+
Jim_WrongNumArgs(interp, 2, argv, "object");
13584+
return JIM_ERR;
13585+
}
13586+
s = Jim_GetString(argv[2], &len);
13587+
#ifdef JIM_UTF8
13588+
charlen = utf8_strlen(s, len);
13589+
#else
13590+
charlen = len;
13591+
#endif
13592+
char buf[256];
13593+
snprintf(buf, sizeof(buf), "refcount: %d, type: %s\n"
13594+
"chars (%d):",
13595+
argv[2]->refCount, JimObjTypeName(argv[2]), charlen);
13596+
Jim_SetResultFormatted(interp, "%s <<%s>>\n", buf, s);
13597+
snprintf(buf, sizeof(buf), "bytes (%d):", len);
1360113598
Jim_AppendString(interp, Jim_GetResult(interp), buf, -1);
13599+
while (len--) {
13600+
snprintf(buf, sizeof(buf), " %02x", (unsigned char)*s++);
13601+
Jim_AppendString(interp, Jim_GetResult(interp), buf, -1);
13602+
}
13603+
return JIM_OK;
1360213604
}
13603-
return JIM_OK;
13604-
}
13605-
else if (option == OPT_SCRIPTLEN) {
13606-
ScriptObj *script;
1360713605

13608-
if (argc != 3) {
13609-
Jim_WrongNumArgs(interp, 2, argv, "script");
13610-
return JIM_ERR;
13606+
case OPT_SCRIPTLEN:{
13607+
ScriptObj *script = JimGetScript(interp, argv[2]);
13608+
if (script == NULL)
13609+
return JIM_ERR;
13610+
Jim_SetResultInt(interp, script->len);
13611+
return JIM_OK;
1361113612
}
13612-
script = JimGetScript(interp, argv[2]);
13613-
if (script == NULL)
13614-
return JIM_ERR;
13615-
Jim_SetResultInt(interp, script->len);
13616-
return JIM_OK;
13617-
}
13618-
else if (option == OPT_EXPRLEN) {
13619-
struct ExprTree *expr;
1362013613

13621-
if (argc != 3) {
13622-
Jim_WrongNumArgs(interp, 2, argv, "expression");
13623-
return JIM_ERR;
13614+
case OPT_EXPRLEN:{
13615+
struct ExprTree *expr = JimGetExpression(interp, argv[2]);
13616+
if (expr == NULL)
13617+
return JIM_ERR;
13618+
Jim_SetResultInt(interp, expr->len);
13619+
return JIM_OK;
1362413620
}
13625-
expr = JimGetExpression(interp, argv[2]);
13626-
if (expr == NULL)
13627-
return JIM_ERR;
13628-
Jim_SetResultInt(interp, expr->len);
13629-
return JIM_OK;
13630-
}
13631-
else if (option == OPT_EXPRBC) {
13632-
struct ExprTree *expr;
1363313621

13634-
if (argc != 3) {
13635-
Jim_WrongNumArgs(interp, 2, argv, "expression");
13636-
return JIM_ERR;
13622+
case OPT_EXPRBC:{
13623+
struct ExprTree *expr = JimGetExpression(interp, argv[2]);
13624+
if (expr == NULL)
13625+
return JIM_ERR;
13626+
Jim_SetResult(interp, JimGetExprAsList(interp, expr->expr));
13627+
return JIM_OK;
1363713628
}
13638-
expr = JimGetExpression(interp, argv[2]);
13639-
if (expr == NULL)
13640-
return JIM_ERR;
13641-
Jim_SetResult(interp, JimGetExprAsList(interp, expr->expr));
13642-
return JIM_OK;
13643-
}
13644-
else {
13645-
Jim_SetResultString(interp,
13646-
"bad option. Valid options are refcount, " "objcount, objects, invstr", -1);
13647-
return JIM_ERR;
13629+
13630+
default:
13631+
abort();
1364813632
}
1364913633
/* unreached */
1365013634
}

tests/debug.test

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ set x 0
77

88
test debug-0.1 {debug too few args} -body {
99
debug
10-
} -returnCodes error -result {wrong # args: should be "debug subcommand ?...?"}
10+
} -returnCodes error -match glob -result {wrong # args: should be "debug command ..."*}
1111

1212
test debug-0.2 {debug bad option} -body {
1313
debug badoption
14-
} -returnCodes error -result {bad subcommand "badoption": must be exprbc, exprlen, invstr, objcount, objects, refcount, scriptlen, or show}
14+
} -returnCodes error -result {debug, unknown command "badoption": should be exprbc, exprlen, invstr, objcount, objects, refcount, scriptlen, show}
1515

1616
test debug-1.1 {debug refcount too few args} -body {
1717
debug refcount

0 commit comments

Comments
 (0)