@@ -13483,168 +13483,152 @@ static Jim_Obj *JimGetExprAsList(Jim_Interp *interp, struct JimExprNode *node)
1348313483#if defined(JIM_DEBUG_COMMAND) && !defined(JIM_BOOTSTRAP)
1348413484static 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}
0 commit comments