11#include < string.h>
2+ #include < stdio.h>
23#include < ctype.h>
34#include < new>
45#include < mk4.h>
@@ -875,7 +876,8 @@ static int cursor_cmd_set(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
875876 int objc;
876877 Jim_Obj **objv;
877878
878- if (Jim_DictPairs (interp, argv[1 ], &objv, &objc) != JIM_OK )
879+ objv = Jim_DictPairs (interp, argv[1 ], &objc);
880+ if (!objv)
879881 goto err;
880882
881883 for (i = 0 ; i < objc; i += 2 ) {
@@ -1173,23 +1175,25 @@ static const jim_subcmd_type cursor_command_table[] = {
11731175
11741176static int JimCursorCommand (Jim_Interp *interp, int argc, Jim_Obj *const *argv)
11751177{
1176- Jim_Obj *cmdObj;
1177-
11781178 if (argc < 2 ) {
11791179 Jim_WrongNumArgs (interp, 1 , argv, " command ..." );
11801180 return JIM_ERR ;
11811181 }
11821182
1183- cmdObj = Jim_NewStringObj (interp, " cursor " , -1 );
1183+ Jim_Obj * cmdObj = Jim_NewStringObj (interp, " cursor " , -1 );
11841184 Jim_AppendObj (interp, cmdObj, argv[1 ]);
1185+ Jim_IncrRefCount (cmdObj);
11851186
1186- if (Jim_GetCommand (interp, cmdObj, 0 ) != NULL )
1187- return Jim_EvalObjPrefix (interp, cmdObj, argc - 2 , argv + 2 );
1188- else {
1189- Jim_FreeNewObj (interp, cmdObj);
1190- return Jim_CallSubCmd (interp,
1191- Jim_ParseSubCmd (interp, cursor_command_table, argc, argv), argc, argv);
1192- }
1187+ int result;
1188+ if (Jim_GetCommand (interp, cmdObj, 0 ) != NULL ) {
1189+ result = Jim_EvalObjPrefix (interp, cmdObj, argc, argv);
1190+ }
1191+ else {
1192+ result = Jim_CallSubCmd (interp, Jim_ParseSubCmd (interp,
1193+ cursor_command_table, argc, argv), argc, argv);
1194+ }
1195+ Jim_DecrRefCount (interp, cmdObj);
1196+ return result;
11931197}
11941198
11951199/* -------------------------------------------------------------------------
@@ -1768,6 +1772,7 @@ static int JimViewSubCmdProc(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
17681772
17691773 cmdObj = Jim_NewStringObj (interp, " mk.view " , -1 );
17701774 Jim_AppendObj (interp, cmdObj, argv[1 ]);
1775+ Jim_IncrRefCount (cmdObj);
17711776
17721777 /* The command will be cached even though we discard the result */
17731778 if (Jim_GetCommand (interp, cmdObj, 0 ) != NULL ) {
@@ -1782,9 +1787,9 @@ static int JimViewSubCmdProc(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
17821787
17831788 Jim_Free (objv);
17841789 } else {
1785- Jim_FreeNewObj (interp, cmdObj);
17861790 result = Jim_CallSubCmd (interp, Jim_ParseSubCmd (interp, view_command_table, pipe, argv), pipe, argv);
17871791 }
1792+ Jim_DecrRefCount (interp, cmdObj);
17881793
17891794 if (result != JIM_OK || pipe == argc)
17901795 return result;
@@ -1800,8 +1805,9 @@ static int JimOneShotViewSubCmdProc(Jim_Interp *interp, int argc, Jim_Obj *const
18001805 result = JimViewSubCmdProc (interp, argc, argv);
18011806
18021807 cmd = Jim_GetCommand (interp, argv[0 ], 0 );
1803- if (cmd && !cmd->isproc && cmd->u .native .cmdProc == JimOneShotViewSubCmdProc)
1808+ if (cmd && !( cmd->flags & JIM_CMD_ISPROC ) && cmd->u .native .cmdProc == JimOneShotViewSubCmdProc) {
18041809 Jim_DeleteCommand (interp, argv[0 ]);
1810+ }
18051811
18061812 return result;
18071813}
@@ -1828,7 +1834,7 @@ static int JimGetView(Jim_Interp *interp, Jim_Obj *obj, c4_View *viewPtr)
18281834{
18291835 Jim_Cmd *cmd = Jim_GetCommand (interp, obj, 0 );
18301836
1831- if (cmd == NULL || cmd->isproc || cmd->u .native .delProc != JimViewDelProc) {
1837+ if (cmd == NULL || ( cmd->flags & JIM_CMD_ISPROC ) || cmd->u .native .delProc != JimViewDelProc) {
18321838 Jim_SetResultFormatted (interp, " invalid view object \" %#s\" " , obj);
18331839 return JIM_ERR ;
18341840 }
@@ -1977,7 +1983,7 @@ static int storage_cmd_structure(Jim_Interp *interp, int argc, Jim_Obj *const *a
19771983 return JIM_ERR ;
19781984 dlen = strlen (descr);
19791985
1980- descr = (char *)Jim_Realloc (descr, dlen + len + 2 );
1986+ descr = (char *)Jim_Realloc (descr, dlen + len + 2 + 1 );
19811987 memmove (descr + len + 1 , descr, dlen);
19821988 memcpy (descr, name, len);
19831989 descr[len] = ' [' ;
@@ -2117,28 +2123,28 @@ static void JimStorageDelProc(Jim_Interp *interp, void *privData)
21172123
21182124static int JimStorageSubCmdProc (Jim_Interp *interp, int argc, Jim_Obj *const *argv)
21192125{
2120- Jim_Obj *cmdObj;
2121-
2122- cmdObj = Jim_NewStringObj (interp, " mk.storage " , -1 );
2126+ Jim_Obj *cmdObj = Jim_NewStringObj (interp, " mk.storage " , -1 );
21232127 Jim_AppendObj (interp, cmdObj, argv[1 ]);
2128+ Jim_IncrRefCount (cmdObj);
21242129
2130+ int result;
21252131 if (Jim_GetCommand (interp, cmdObj, 0 ) != NULL ) {
2126- int result;
2127-
2128- Jim_Obj **objv = (Jim_Obj **)Jim_Alloc (argc * sizeof (Jim_Obj *));
2129- objv[0 ] = cmdObj;
2130- objv[1 ] = argv[0 ];
2131- memcpy (objv + 2 , argv + 2 , (argc - 2 ) * sizeof (Jim_Obj *));
2132-
2133- result = Jim_EvalObjVector (interp, argc, objv);
2134-
2135- Jim_Free (objv);
2136- return result;
2137- } else {
2138- Jim_FreeNewObj (interp, cmdObj);
2139- return Jim_CallSubCmd (interp, Jim_ParseSubCmd (interp,
2132+ Jim_Obj **nargv = (Jim_Obj **)Jim_Alloc (argc * sizeof (*nargv));
2133+
2134+ argc -= 1 ;
2135+ argv += 1 ;
2136+
2137+ nargv[0 ] = cmdObj;
2138+ memcpy (&nargv[1 ], &argv[1 ], sizeof (argv[1 ]) * argc);
2139+ result = Jim_EvalObjVector (interp, argc + 1 , nargv);
2140+ Jim_Free (nargv);
2141+ }
2142+ else {
2143+ result = Jim_CallSubCmd (interp, Jim_ParseSubCmd (interp,
21402144 storage_command_table, argc, argv), argc, argv);
2141- }
2145+ }
2146+ Jim_DecrRefCount (interp, cmdObj);
2147+ return result;
21422148}
21432149
21442150/* -------------------------------------------------------------------------
0 commit comments