Skip to content

Commit 9d86f69

Browse files
committed
metakit support: minimal fixes
Fix the build and some obvious API and memory issues. Very lightly tested. Fixes: #388
1 parent 97dcc2c commit 9d86f69

2 files changed

Lines changed: 43 additions & 33 deletions

File tree

Makefile.in

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ all: $(JIMSH) @C_EXT_SHOBJS@
100100
$(ECHO) " CC $@"
101101
$(Q)$(CC) $(AS_CFLAGS) $(AS_CPPFLAGS) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@
102102

103+
.cpp.o:
104+
$(ECHO) " CXX $@"
105+
$(Q)$(CXX) $(AS_CXXFLAGS) $(AS_CPPFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@
106+
103107
$(JIMSH): $(LIBJIM) jimsh.o initjimsh.o
104108
$(ECHO) " LINK $@"
105109
$(Q)$(JIMSH_CC) @SH_LINKRPATH_FLAGS@ @SH_LINKFLAGS@ $(LDFLAGS) -o $@ jimsh.o initjimsh.o $(LIBJIM) $(LDLIBS) $(LIBS)

jim-mk.cpp

Lines changed: 39 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
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

11741176
static 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

21182124
static 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

Comments
 (0)