aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2010-01-24 13:53:11 +1000
committerSteve Bennett <steveb@workware.net.au>2010-10-15 11:02:46 +1000
commitb149e4415f9a448740cd41e5fd2a5f065262e791 (patch)
tree8c26563d127da56135188800d5863a2137e34201
parent289cf6dfe86b9b8a4e67b908a8bf8afc9fba76be (diff)
downloadjimtcl-b149e4415f9a448740cd41e5fd2a5f065262e791.zip
jimtcl-b149e4415f9a448740cd41e5fd2a5f065262e791.tar.gz
jimtcl-b149e4415f9a448740cd41e5fd2a5f065262e791.tar.bz2
Add Jim_SetResultFormatted() for simplied messages
Makes creating error messages much simpler Also convert a couple of long if/else to switch Also some error message improvements Also fix some memory leaks
-rw-r--r--jim-aio.c4
-rw-r--r--jim-bio.c6
-rw-r--r--jim-clock.c4
-rw-r--r--jim-exec.c15
-rw-r--r--jim-file.c38
-rw-r--r--jim-load.c5
-rw-r--r--jim-package.c15
-rw-r--r--jim-posix.c2
-rw-r--r--jim-regexp.c13
-rw-r--r--jim-sqlite.c5
-rw-r--r--jim-sqlite3.c5
-rw-r--r--jim.c798
-rw-r--r--jim.h5
-rw-r--r--test.tcl4
-rw-r--r--tests/error.test2
-rw-r--r--tests/stacktrace.test16
16 files changed, 432 insertions, 505 deletions
diff --git a/jim-aio.c b/jim-aio.c
index 2d67f7c..c40d29e 100644
--- a/jim-aio.c
+++ b/jim-aio.c
@@ -81,9 +81,7 @@ static int JimAioSubCmdProc(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
static void JimAioSetError(Jim_Interp *interp, Jim_Obj *name)
{
if (name) {
- const char *filename = Jim_GetString(name, NULL);
- Jim_SetResultString(interp, "", 0);
- Jim_AppendStrings(interp, Jim_GetResult(interp), filename, ": ", strerror(errno), NULL);
+ Jim_SetResultFormatted(interp, "%#s: %s", name, strerror(errno));
}
else {
Jim_SetResultString(interp, strerror(errno), -1);
diff --git a/jim-bio.c b/jim-bio.c
index 38dba2b..c477116 100644
--- a/jim-bio.c
+++ b/jim-bio.c
@@ -149,15 +149,13 @@ static int bio_cmd_copy(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
}
if (ferror(infh)) {
- Jim_SetResultString(interp, "", 0);
- Jim_AppendStrings(interp, Jim_GetResult(interp), "error reading \"", Jim_GetString(argv[0], NULL), "\": ", strerror(errno), NULL);
+ Jim_SetResultFormatted(interp, "error reading \"%#s\": %s", argv[0], strerror(errno));
clearerr(infh);
return JIM_ERR;
}
if (ferror(outfh)) {
- Jim_SetResultString(interp, "", 0);
- Jim_AppendStrings(interp, Jim_GetResult(interp), "error writing \"", Jim_GetString(argv[1], NULL), "\": ", strerror(errno), NULL);
+ Jim_SetResultFormatted(interp, "error writing \"%#s\": %s", argv[1], strerror(errno));
clearerr(outfh);
return JIM_ERR;
}
diff --git a/jim-clock.c b/jim-clock.c
index de0d3eb..4e8a176 100644
--- a/jim-clock.c
+++ b/jim-clock.c
@@ -64,14 +64,14 @@ static int clock_cmd_scan(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
}
/* Now convert into a time_t */
- Jim_SetResult(interp, Jim_NewIntObj(interp, (jim_wide)mktime(&tm)));
+ Jim_SetResultInt(interp, mktime(&tm));
return JIM_OK;
}
static int clock_cmd_seconds(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{
- Jim_SetResult(interp, Jim_NewIntObj(interp, (jim_wide)time(NULL)));
+ Jim_SetResultInt(interp, time(NULL));
return JIM_OK;
}
diff --git a/jim-exec.c b/jim-exec.c
index ba31e08..4ad9b21 100644
--- a/jim-exec.c
+++ b/jim-exec.c
@@ -28,8 +28,7 @@
/* These two could be moved into the Tcl core */
static void Jim_SetResultErrno(Jim_Interp *interp, const char *msg)
{
- Jim_SetResultString(interp, "", 0);
- Jim_AppendStrings(interp, Jim_GetResult(interp), msg, ": ", strerror(errno), NULL);
+ Jim_SetResultFormatted(interp, "%s: %s", msg, strerror(errno));
}
static void Jim_RemoveTrailingNewline(Jim_Obj *objPtr)
@@ -572,8 +571,7 @@ Jim_CreatePipeline(Jim_Interp *interp, int argc, Jim_Obj *const *argv, int **pid
}
if (i >= argc) {
- Jim_SetResultString(interp, "", 0);
- Jim_AppendStrings(interp, Jim_GetResult(interp), "can't specify \"", arg, "\" as last word in command", NULL);
+ Jim_SetResultFormatted(interp, "can't specify \"%s\" as last word in command", arg);
Jim_Free(arg_array);
return -1;
}
@@ -632,8 +630,7 @@ Jim_CreatePipeline(Jim_Interp *interp, int argc, Jim_Obj *const *argv, int **pid
*/
inputId = open(input, O_RDONLY, 0);
if (inputId < 0) {
- Jim_SetResultString(interp, "", 0);
- Jim_AppendStrings(interp, Jim_GetResult(interp), "couldn't read file \"", input, "\": ", strerror(errno), NULL);
+ Jim_SetResultFormatted(interp, "couldn't read file \"%s\": %s", input, strerror(errno));
goto error;
}
}
@@ -675,8 +672,7 @@ Jim_CreatePipeline(Jim_Interp *interp, int argc, Jim_Obj *const *argv, int **pid
lastOutputId = open(output, mode, 0666);
if (lastOutputId < 0) {
- Jim_SetResultString(interp, "", 0);
- Jim_AppendStrings(interp, Jim_GetResult(interp), "couldn't write file \"", output, "\": ", strerror(errno), NULL);
+ Jim_SetResultFormatted(interp, "couldn't write file \"%s\": %s", output, strerror(errno));
goto error;
}
}
@@ -718,8 +714,7 @@ Jim_CreatePipeline(Jim_Interp *interp, int argc, Jim_Obj *const *argv, int **pid
errorId = open(error, mode, 0666);
if (errorId < 0) {
- Jim_SetResultString(interp, "", 0);
- Jim_AppendStrings(interp, Jim_GetResult(interp), "couldn't write file \"", error, "\": ", strerror(errno), NULL);
+ Jim_SetResultFormatted(interp, "couldn't write file \"%s\": %s", error, strerror(errno));
}
}
}
diff --git a/jim-file.c b/jim-file.c
index e6de923..9a2046c 100644
--- a/jim-file.c
+++ b/jim-file.c
@@ -143,8 +143,7 @@ static int
StoreStatData(Jim_Interp *interp, Jim_Obj *varName, const struct stat *sb)
{
if (set_array_int_value(interp, varName, "dev", sb->st_dev) != JIM_OK) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp), "can't set \"", Jim_GetString(varName, NULL), "(dev)\": variable isn't array", NULL);
+ Jim_SetResultFormatted(interp, "can't set \"%#s(dev)\": variables isn't array", varName);
return JIM_ERR;
}
set_array_int_value(interp, varName, "ino", sb->st_ino);
@@ -289,7 +288,7 @@ static int file_access(Jim_Interp *interp, Jim_Obj *filename, int mode)
const char *path = Jim_GetString(filename, NULL);
int rc = access(path, mode);
- Jim_SetResult(interp, Jim_NewIntObj(interp, rc != -1));
+ Jim_SetResultBool(interp, rc != -1);
return JIM_OK;
}
@@ -319,8 +318,7 @@ static int file_cmd_delete(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
while (argc--) {
const char *path = Jim_GetString(argv[0], NULL);
if (unlink(path) == -1 && errno != ENOENT) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp), "couldn't delete \"", path, "\"", NULL);
+ Jim_SetResultFormatted(interp, "couldn't delete file \"%s\": %s", path, strerror(errno));
return JIM_ERR;
}
argv++;
@@ -367,28 +365,29 @@ static int file_cmd_tempfile(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
static int file_cmd_rename(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{
- const char *source = Jim_GetString(argv[0], NULL);
+ const char *source;
const char *dest;
int force = 0;
if (argc == 3) {
- if (strcmp(source, "-force") != 0) {
+ if (!Jim_CompareStringImmediate(interp, argv[0], "-force")) {
return -1;
}
force++;
- source = Jim_GetString(argv[1], NULL);
+ argv++;
+ argc--;
}
- dest = Jim_GetString(argv[force + 1], NULL);
+
+ source = Jim_GetString(argv[0], NULL);
+ dest = Jim_GetString(argv[1], NULL);
if (!force && access(dest, F_OK) == 0) {
- Jim_SetResultString(interp, "", 0);
- Jim_AppendStrings(interp, Jim_GetResult(interp), "error renaming \"", source, "\" to \"", dest, "\": target exists", NULL);
+ Jim_SetResultFormatted(interp, "error renaming \"%#s\" to \"%#s\": target exists", argv[0], argv[1]);
return JIM_ERR;
}
if (rename(source, dest) != 0) {
- Jim_SetResultString(interp, "", 0);
- Jim_AppendStrings(interp, Jim_GetResult(interp), "error renaming \"", source, "\": ", strerror(errno), NULL);
+ Jim_SetResultFormatted(interp, "error renaming \"%#s\" to \"%#s\": %s", argv[0], argv[1], strerror(errno));
return JIM_ERR;
}
@@ -399,8 +398,7 @@ static int file_stat(Jim_Interp *interp, Jim_Obj *filename, struct stat *sb)
{
const char *path = Jim_GetString(filename, NULL);
if (stat(path, sb) == -1) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp), "could not read \"", path, "\": ", strerror(errno), NULL);
+ Jim_SetResultFormatted(interp, "could not read \"%#s\": %s", filename, strerror(errno));
return JIM_ERR;
}
return JIM_OK;
@@ -410,8 +408,7 @@ static int file_lstat(Jim_Interp *interp, Jim_Obj *filename, struct stat *sb)
{
const char *path = Jim_GetString(filename, NULL);
if (lstat(path, sb) == -1) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp), "could not read \"", path, "\": ", strerror(errno), NULL);
+ Jim_SetResultFormatted(interp, "could not read \"%#s\": %s", filename, strerror(errno));
return JIM_ERR;
}
return JIM_OK;
@@ -495,8 +492,7 @@ static int file_cmd_readlink(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
int linkLength = readlink(path, linkValue, MAXPATHLEN);
if (linkLength == -1) {
Jim_Free(linkValue);
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp), "couldn't readlink \"", path, "\"", NULL);
+ Jim_SetResultFormatted(interp, "couldn't readlink \"%s\": %s", argv[0], strerror(errno));
return JIM_ERR;
}
linkValue[linkLength] = 0;
@@ -724,9 +720,7 @@ static int Jim_CdCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
path = Jim_GetString(argv[1], NULL);
if (chdir(path) != 0) {
- Jim_SetResultString(interp, "", 0);
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "couldn't change working directory to \"", path, "\": ", strerror(errno), NULL);
+ Jim_SetResultFormatted(interp, "couldn't change working directory to \"%s\": %s", argv[1], strerror(errno));
return JIM_ERR;
}
return JIM_OK;
diff --git a/jim-load.c b/jim-load.c
index 9c46c1e..672b536 100644
--- a/jim-load.c
+++ b/jim-load.c
@@ -78,10 +78,7 @@ int Jim_LoadLibrary(Jim_Interp *interp, const char *pathName)
handle = dlopen(buf, RTLD_LAZY);
}
if (handle == NULL) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "error loading extension \"", pathName,
- "\": ", dlerror(), NULL);
+ Jim_SetResultFormatted(interp, "error loading extension \"%s\": %s", pathName, dlerror());
if (i < 0)
continue;
goto err;
diff --git a/jim-package.c b/jim-package.c
index 360a267..c0020b2 100644
--- a/jim-package.c
+++ b/jim-package.c
@@ -14,9 +14,7 @@ int Jim_PackageProvide(Jim_Interp *interp, const char *name, const char *ver,
/* If the package was already provided returns an error. */
if (Jim_FindHashEntry(&interp->packages, name) != NULL) {
if (flags & JIM_ERRMSG) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "package '", name, "' was already provided", NULL);
+ Jim_SetResultFormatted(interp, "package \"%s\" was already provided", name);
}
return JIM_ERR;
}
@@ -124,14 +122,9 @@ int Jim_PackageRequire(Jim_Interp *interp, const char *name, int flags)
if (retcode != JIM_OK) {
if (flags & JIM_ERRMSG) {
int len;
- Jim_Obj *resultObj = Jim_GetResult(interp);
- if (Jim_IsShared(resultObj)) {
- resultObj = Jim_DuplicateObj(interp, resultObj);
- }
- Jim_GetString(resultObj, &len);
- Jim_AppendStrings(interp, resultObj, len ? "\n" : "",
- "Can't load package '", name, "'", NULL);
- Jim_SetResult(interp, resultObj);
+ Jim_GetString(Jim_GetResult(interp), &len);
+ Jim_SetResultFormatted(interp, "%#s%sCan't load package %s",
+ Jim_GetResult(interp), len ? "\n" : "", name);
}
return retcode;
}
diff --git a/jim-posix.c b/jim-posix.c
index a4eb069..7db78d4 100644
--- a/jim-posix.c
+++ b/jim-posix.c
@@ -54,7 +54,7 @@ static int Jim_PosixForkCommand(Jim_Interp *interp, int argc,
Jim_PosixSetError(interp);
return JIM_ERR;
}
- Jim_SetResult(interp, Jim_NewIntObj(interp, (jim_wide)pid));
+ Jim_SetResultInt(interp, (jim_wide)pid);
return JIM_OK;
#endif
}
diff --git a/jim-regexp.c b/jim-regexp.c
index deffb50..72313ee 100644
--- a/jim-regexp.c
+++ b/jim-regexp.c
@@ -95,8 +95,7 @@ static regex_t *SetRegexpFromAny(Jim_Interp *interp, Jim_Obj *objPtr, unsigned f
if ((ret = regcomp(compre, pattern, REG_EXTENDED | flags)) != 0) {
char buf[100];
regerror(ret, compre, buf, sizeof(buf));
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp), "couldn't compile regular expression pattern: ", buf, NULL);
+ Jim_SetResultFormatted(interp, "couldn't compile regular expression pattern: %s", buf);
regfree(compre);
Jim_Free(compre);
return NULL;
@@ -216,8 +215,7 @@ int Jim_RegexpCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
if (match >= REG_BADPAT) {
char buf[100];
regerror(match, regex, buf, sizeof(buf));
- Jim_SetResultString(interp, "", 0);
- Jim_AppendStrings(interp, Jim_GetResult(interp), "error while matching pattern: ", buf, NULL);
+ Jim_SetResultFormatted(interp, "error while matching pattern: %s", buf);
result = JIM_ERR;
goto done;
}
@@ -272,8 +270,6 @@ int Jim_RegexpCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
result = Jim_SetVariable(interp, argv[i], resultObj);
if (result != JIM_OK) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp), "couldn't set variable \"", Jim_GetString(argv[i], NULL), "\"", NULL);
Jim_FreeObj(interp, resultObj);
break;
}
@@ -409,8 +405,7 @@ int Jim_RegsubCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
if (match >= REG_BADPAT) {
char buf[100];
regerror(match, regex, buf, sizeof(buf));
- Jim_SetResultString(interp, "", 0);
- Jim_AppendStrings(interp, Jim_GetResult(interp), "error while matching pattern: ", buf, NULL);
+ Jim_SetResultFormatted(interp, "error while matching pattern: %s", buf);
return JIM_ERR;
}
if (match == REG_NOMATCH) {
@@ -485,8 +480,6 @@ int Jim_RegsubCmd(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
Jim_SetResultInt(interp, num_matches);
}
else {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp), "couldn't set variable \"", Jim_GetString(varname, NULL), "\"", NULL);
Jim_FreeObj(interp, resultObj);
}
}
diff --git a/jim-sqlite.c b/jim-sqlite.c
index 7eb40a3..c1a1ee0 100644
--- a/jim-sqlite.c
+++ b/jim-sqlite.c
@@ -110,10 +110,7 @@ static Jim_Obj *JimSqliteFormatQuery(Jim_Interp *interp, Jim_Obj *fmtObjPtr,
default:
spec[1] = *fmt; spec[2] = '\0';
Jim_FreeNewObj(interp, resObjPtr);
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "bad field specifier \"", spec, "\", ",
- "only %%s and %%%% are validd", NULL);
+ Jim_SetResultFormatted(interp, "bad field specifier \"%s\", only %%s and %%%% are valid", spec);
return NULL;
}
fmt++;
diff --git a/jim-sqlite3.c b/jim-sqlite3.c
index b32bd48..c3102ec 100644
--- a/jim-sqlite3.c
+++ b/jim-sqlite3.c
@@ -110,10 +110,7 @@ static Jim_Obj *JimSqliteFormatQuery(Jim_Interp *interp, Jim_Obj *fmtObjPtr,
default:
spec[1] = *fmt; spec[2] = '\0';
Jim_FreeNewObj(interp, resObjPtr);
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "bad field specifier \"", spec, "\", ",
- "only %%s and %%%% are validd", NULL);
+ Jim_SetResultFormatted(interp, "bad field specifier \"%s\", only %%s and %%%% are valid", spec);
return NULL;
}
fmt++;
diff --git a/jim.c b/jim.c
index b486741..30ab7c4 100644
--- a/jim.c
+++ b/jim.c
@@ -2442,10 +2442,7 @@ static Jim_Obj *Jim_FormatString_Inner(Jim_Interp *interp, Jim_Obj *fmtObjPtr,
break;
default:
spec[0] = *fmt; spec[1] = '\0';
- Jim_FreeNewObj(interp, resObjPtr);
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "bad field specifier \"", spec, "\"", NULL);
+ Jim_SetResultFormatted(interp, "bad field specifier \"%s\"", spec);
return NULL;
}
/* force terminate */
@@ -2850,16 +2847,6 @@ static void ScriptObjAddTokens(Jim_Interp *interp, struct ScriptObj *script, Par
len = t->len;
- if (t->type != JIM_TT_ESC) {
- /* No escape conversion needed, so just copy it. */
- str = Jim_StrDupLen(t->token, len);
- }
- else {
- /* Else convert the escape chars. */
- str = Jim_Alloc(len+1);
- len = JimEscape(str, t->token, len);
- }
-
if (t->type == JIM_TT_SEP || t->type == JIM_TT_EOL) {
/* No need for a separate object here */
token->objPtr = interp->emptyObj;
@@ -2875,6 +2862,16 @@ static void ScriptObjAddTokens(Jim_Interp *interp, struct ScriptObj *script, Par
}
}
else {
+ if (t->type != JIM_TT_ESC) {
+ /* No escape conversion needed, so just copy it. */
+ str = Jim_StrDupLen(t->token, len);
+ }
+ else {
+ /* Else convert the escape chars. */
+ str = Jim_Alloc(len+1);
+ len = JimEscape(str, t->token, len);
+ }
+
/* Every object is initially a string, but the
* internal type may be specialized during execution of the
* script. */
@@ -3194,13 +3191,9 @@ int Jim_CreateProcedure(Jim_Interp *interp, const char *cmdName,
initObjPtr = Jim_GetVariable(interp, nameObjPtr,
JIM_NONE);
if (initObjPtr == NULL) {
- Jim_SetResult(interp,
- Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "variable for initialization of static \"",
- Jim_GetString(nameObjPtr, NULL),
- "\" not found in the local context",
- NULL);
+ Jim_SetResultFormatted(interp,
+ "variable for initialization of static \"%#s\" not found in the local context",
+ nameObjPtr);
goto err;
}
} else {
@@ -3214,20 +3207,15 @@ int Jim_CreateProcedure(Jim_Interp *interp, const char *cmdName,
Jim_GetString(nameObjPtr, NULL),
varPtr) != JIM_OK)
{
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "static variable name \"",
- Jim_GetString(objPtr, NULL), "\"",
- " duplicated in statics list", NULL);
+ Jim_SetResultFormatted(interp,
+ "static variable name \"%#s\" duplicated in statics list",
+ nameObjPtr);
Jim_DecrRefCount(interp, initObjPtr);
Jim_Free(varPtr);
goto err;
}
} else {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "too many fields in static specifier \"",
- objPtr, "\"", NULL);
+ Jim_SetResultFormatted(interp, "too many fields in static specifier \"%#s\"", objPtr);
goto err;
}
}
@@ -3345,10 +3333,7 @@ Jim_Cmd *Jim_GetCommand(Jim_Interp *interp, Jim_Obj *objPtr, int flags)
objPtr->internalRep.cmdValue.procEpoch != interp->procEpoch) &&
SetCommandFromAny(interp, objPtr) == JIM_ERR) {
if (flags & JIM_ERRMSG) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "invalid command name \"", objPtr->bytes, "\"",
- NULL);
+ Jim_SetResultFormatted(interp, "invalid command name \"%#s\"", objPtr);
}
return NULL;
}
@@ -3569,9 +3554,7 @@ int Jim_SetVariableLink(Jim_Interp *interp, Jim_Obj *nameObjPtr,
varName = Jim_GetString(nameObjPtr, &len);
if (Jim_FindHashEntry(&interp->framePtr->vars, varName)) {
- Jim_SetResultString(interp, "", -1);
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "variable \"", varName, "\" already exists", NULL);
+ Jim_SetResultFormatted(interp, "variable \"%#s\" already exists", nameObjPtr);
return JIM_ERR;
}
@@ -3612,22 +3595,15 @@ int Jim_SetVariableLink(Jim_Interp *interp, Jim_Obj *nameObjPtr,
Jim_Obj *Jim_GetVariable(Jim_Interp *interp, Jim_Obj *nameObjPtr, int flags)
{
int err;
+ Jim_Obj *objPtr = NULL;
/* All the rest is handled here */
if ((err = SetVariableFromAny(interp, nameObjPtr)) != JIM_OK) {
/* Check for [dict] syntax sugar. */
if (err == JIM_DICT_SUGAR)
return JimDictSugarGet(interp, nameObjPtr);
- if (flags & JIM_ERRMSG) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "can't read \"", nameObjPtr->bytes,
- "\": no such variable", NULL);
- }
- return NULL;
} else {
Jim_Var *varPtr;
- Jim_Obj *objPtr;
Jim_CallFrame *savedCallFrame;
varPtr = nameObjPtr->internalRep.varValue.varPtr;
@@ -3637,15 +3613,12 @@ Jim_Obj *Jim_GetVariable(Jim_Interp *interp, Jim_Obj *nameObjPtr, int flags)
savedCallFrame = interp->framePtr;
interp->framePtr = varPtr->linkFramePtr;
objPtr = Jim_GetVariable(interp, varPtr->objPtr, JIM_NONE);
- if (objPtr == NULL && flags & JIM_ERRMSG) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "can't read \"", nameObjPtr->bytes,
- "\": no such variable", NULL);
- }
interp->framePtr = savedCallFrame;
- return objPtr;
}
+ if (objPtr == NULL && (flags & JIM_ERRMSG)) {
+ Jim_SetResultFormatted(interp, "can't read \"%#s\": no such variable", nameObjPtr);
+ }
+ return objPtr;
}
Jim_Obj *Jim_GetGlobalVariable(Jim_Interp *interp, Jim_Obj *nameObjPtr,
@@ -3694,57 +3667,43 @@ int Jim_UnsetVariable(Jim_Interp *interp, Jim_Obj *nameObjPtr, int flags)
{
const char *name;
Jim_Var *varPtr;
- int err;
+ int retval;
- if ((err = SetVariableFromAny(interp, nameObjPtr)) != JIM_OK) {
- /* Check for [dict] syntax sugar. */
- if (err == JIM_DICT_SUGAR)
- if (JimDictSugarSet(interp, nameObjPtr, NULL) == JIM_OK)
- return JIM_OK;
- if (flags & JIM_ERRMSG) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "can't unset \"", nameObjPtr->bytes,
- "\": no such variable", NULL);
- }
- return JIM_ERR; /* var not found */
+ retval = SetVariableFromAny(interp, nameObjPtr);
+ if (retval == JIM_DICT_SUGAR) {
+ /* [dict] syntax sugar. */
+ return JimDictSugarSet(interp, nameObjPtr, NULL);
}
- varPtr = nameObjPtr->internalRep.varValue.varPtr;
- /* If it's a link call UnsetVariable recursively */
- if (varPtr->linkFramePtr) {
- int retval;
+ else if (retval == JIM_OK) {
+ varPtr = nameObjPtr->internalRep.varValue.varPtr;
- Jim_CallFrame *savedCallFrame;
+ /* If it's a link call UnsetVariable recursively */
+ if (varPtr->linkFramePtr) {
+ Jim_CallFrame *savedCallFrame;
- savedCallFrame = interp->framePtr;
- interp->framePtr = varPtr->linkFramePtr;
- retval = Jim_UnsetVariable(interp, varPtr->objPtr, JIM_NONE);
- interp->framePtr = savedCallFrame;
- if (retval != JIM_OK && flags & JIM_ERRMSG) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "can't unset \"", nameObjPtr->bytes,
- "\": no such variable", NULL);
- }
- return retval;
- } else {
- Jim_CallFrame *framePtr = interp->framePtr;
+ savedCallFrame = interp->framePtr;
+ interp->framePtr = varPtr->linkFramePtr;
+ retval = Jim_UnsetVariable(interp, varPtr->objPtr, JIM_NONE);
+ interp->framePtr = savedCallFrame;
+ } else {
+ Jim_CallFrame *framePtr = interp->framePtr;
- name = Jim_GetString(nameObjPtr, NULL);
- if (name[0] == ':' && name[1] == ':') {
- framePtr = interp->topFramePtr;
- if (Jim_DeleteHashEntry(&framePtr->vars, name + 2) != JIM_OK) {
- return JIM_ERR;
+ name = Jim_GetString(nameObjPtr, NULL);
+ if (name[0] == ':' && name[1] == ':') {
+ framePtr = interp->topFramePtr;
+ name += 2;
+ }
+ retval = Jim_DeleteHashEntry(&framePtr->vars, name);
+ if (retval == JIM_OK) {
+ /* Change the callframe id, invalidating var lookup caching */
+ JimChangeCallFrameId(interp, framePtr);
}
}
- else if (Jim_DeleteHashEntry(&framePtr->vars, name) != JIM_OK) {
- return JIM_ERR;
- }
- /* Change the callframe id, invalidating var lookup caching */
- JimChangeCallFrameId(interp, framePtr);
-
- return JIM_OK;
}
+ if (retval != JIM_OK && (flags & JIM_ERRMSG)) {
+ Jim_SetResultFormatted(interp, "can't unset \"%#s\": no such variable", nameObjPtr);
+ }
+ return retval;
}
/* ---------- Dict syntax sugar (similar to array Tcl syntax) -------------- */
@@ -3802,15 +3761,20 @@ static int JimDictSugarSet(Jim_Interp *interp, Jim_Obj *objPtr,
err = Jim_SetDictKeysVector(interp, objPtr->internalRep.dictSubstValue.varNameObjPtr,
&objPtr->internalRep.dictSubstValue.indexObjPtr, 1, valObjPtr);
- /* Don't keep an extra ref to the result */
if (err == JIM_OK) {
+ /* Don't keep an extra ref to the result */
Jim_SetEmptyResult(interp);
}
else {
+ if (!valObjPtr) {
+ /* Better error message for unset a(2) where a exists but a(2) doesn't */
+ if (Jim_GetVariable(interp, objPtr->internalRep.dictSubstValue.varNameObjPtr, JIM_NONE)) {
+ Jim_SetResultFormatted(interp, "can't unset \"%#s\": no such element in array", objPtr);
+ return err;
+ }
+ }
/* Make the error more informative and Tcl-compatible */
- Jim_SetResultString(interp, "", -1);
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "can't set \"", Jim_GetString(objPtr, NULL), "\": variable isn't array", NULL);
+ Jim_SetResultFormatted(interp, "can't %s \"%#s\": variable isn't array", (valObjPtr ? "set" : "unset"), objPtr);
}
return err;
}
@@ -3828,19 +3792,15 @@ static Jim_Obj *JimDictExpandArrayVariable(Jim_Interp *interp, Jim_Obj *varObjPt
ret = Jim_DictKey(interp, dictObjPtr, keyObjPtr, &resObjPtr, JIM_NONE);
if (ret != JIM_OK) {
- const char *msg;
-
resObjPtr = NULL;
if (ret < 0) {
- msg = "variable isn't array";
+ Jim_SetResultFormatted(interp,
+ "can't read \"%#s(%#s)\": variable isn't array", varObjPtr, keyObjPtr);
}
else {
- msg = "no such element in array";
+ Jim_SetResultFormatted(interp,
+ "can't read \"%#s(%#s)\": no such element in array", varObjPtr, keyObjPtr);
}
-
- Jim_SetResultString(interp, "", -1);
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "can't read \"", Jim_GetString(varObjPtr, NULL), "(", Jim_GetString(keyObjPtr, NULL), ")\": ", msg, NULL);
}
return resObjPtr;
@@ -4150,9 +4110,7 @@ int SetReferenceFromAny(Jim_Interp *interp, Jim_Obj *objPtr)
/* Check if the reference really exists! */
he = Jim_FindHashEntry(&interp->references, &wideValue);
if (he == NULL) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "Invalid reference ID \"", str, "\"", NULL);
+ Jim_SetResultFormatted(interp, "invalid reference id \"%#s\"", objPtr);
return JIM_ERR;
}
refPtr = he->val;
@@ -4164,9 +4122,7 @@ int SetReferenceFromAny(Jim_Interp *interp, Jim_Obj *objPtr)
return JIM_OK;
badformat:
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "expected reference but got \"", str, "\"", NULL);
+ Jim_SetResultFormatted(interp, "expected reference but got \"%#s\"", objPtr);
return JIM_ERR;
}
@@ -4613,9 +4569,7 @@ int Jim_GetCallFrameByLevel(Jim_Interp *interp, Jim_Obj *levelObjPtr,
*framePtrPtr = framePtr;
return JIM_OK;
badlevel:
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "bad level \"", str, "\"", NULL);
+ Jim_SetResultFormatted(interp, "bad level \"%s\"", str);
return JIM_ERR;
}
@@ -4646,9 +4600,7 @@ static int JimGetCallFrameByInteger(Jim_Interp *interp, Jim_Obj *levelObjPtr,
*framePtrPtr = framePtr;
return JIM_OK;
badlevel:
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "bad level \"", Jim_GetString(levelObjPtr, NULL), "\"", NULL);
+ Jim_SetResultFormatted(interp, "bad level \"%#s\"", levelObjPtr);
return JIM_ERR;
}
@@ -4855,9 +4807,7 @@ int SetIntFromAny(Jim_Interp *interp, Jim_Obj *objPtr, int flags)
/* Try to convert into a jim_wide */
if (Jim_StringToWide(str, &wideValue, 0) != JIM_OK) {
if (flags & JIM_ERRMSG) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "expected integer but got \"", str, "\"", NULL);
+ Jim_SetResultFormatted(interp, "expected integer but got \"%#s\"", objPtr);
}
return JIM_ERR;
}
@@ -4997,9 +4947,7 @@ int SetDoubleFromAny(Jim_Interp *interp, Jim_Obj *objPtr)
else {
/* Try to convert into a double */
if (Jim_StringToDouble(str, &doubleValue) != JIM_OK) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "expected number but got '", str, "'", NULL);
+ Jim_SetResultFormatted(interp, "expected number but got \"%#s\"", objPtr);
return JIM_ERR;
}
/* Free the old internal repr and set the new one. */
@@ -5994,6 +5942,7 @@ static int SetDictFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
Jim_FreeNewObj(interp, objv[0]);
objPtr->typePtr = NULL;
Jim_FreeHashTable(ht);
+ Jim_Free(ht);
#ifdef JIM_OPTIMIZATION
badlist:
#endif
@@ -6082,10 +6031,7 @@ int Jim_DictKey(Jim_Interp *interp, Jim_Obj *dictPtr, Jim_Obj *keyPtr,
ht = dictPtr->internalRep.ptr;
if ((he = Jim_FindHashEntry(ht, keyPtr)) == NULL) {
if (flags & JIM_ERRMSG) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "key \"", Jim_GetString(keyPtr, NULL),
- "\" not found in dictionary", NULL);
+ Jim_SetResultFormatted(interp, "key \"%#s\" not found in dictionary", keyPtr);
}
return JIM_ERR;
}
@@ -6200,9 +6146,9 @@ int Jim_SetDictKeysVector(Jim_Interp *interp, Jim_Obj *varNamePtr,
DictAddElement(interp, dictObjPtr, keyv[i], objPtr);
}
}
- if (Jim_DictAddElement(interp, objPtr, keyv[keyc-1], newObjPtr)
- != JIM_OK)
+ if (Jim_DictAddElement(interp, objPtr, keyv[keyc-1], newObjPtr) != JIM_OK) {
goto err;
+ }
Jim_InvalidateStringRep(objPtr);
Jim_InvalidateStringRep(varObjPtr);
if (Jim_SetVariable(interp, varNamePtr, varObjPtr) != JIM_OK)
@@ -6307,10 +6253,7 @@ int SetIndexFromAny(Jim_Interp *interp, Jim_Obj *objPtr)
return JIM_OK;
badindex:
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "bad index \"", Jim_GetString(objPtr, NULL), "\": "
- "must be integer?[+-]integer? or end?[+-]integer?", NULL);
+ Jim_SetResultFormatted(interp, "bad index \"%#s\": must be integer?[+-]integer? or end?[+-]integer?", objPtr);
return JIM_ERR;
}
@@ -6382,10 +6325,7 @@ int SetReturnCodeFromAny(Jim_Interp *interp, Jim_Obj *objPtr)
if (JimGetWideNoErr(interp, objPtr, &wideValue) != JIM_ERR)
returnCode = (int) wideValue;
else if (Jim_GetEnum(interp, objPtr, jimReturnCodes, &returnCode, NULL, JIM_NONE) != JIM_OK) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "expected return code but got '", Jim_GetString(objPtr, NULL), "'",
- NULL);
+ Jim_SetResultFormatted(interp, "expected return code but got \"%#s\"", objPtr);
return JIM_ERR;
}
/* Free the old internal repr and set the new one. */
@@ -7689,14 +7629,12 @@ int SetExprFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr)
if (JimParseExpression(&parser) != JIM_OK) {
ScriptTokenListFree(&tokenlist);
invalidexpr:
- Jim_SetResultString(interp, "syntax error in expression: ", -1);
- Jim_AppendStrings(interp, Jim_GetResult(interp), exprText, NULL);
+ Jim_SetResultFormatted(interp, "syntax error in expression: \"%#s\"", objPtr);
expr = NULL;
goto err;
}
ScriptAddToken(&tokenlist, parser.tstart, parser.tend - parser.tstart + 1, parser.tt, parser.tline);
- //printf("ExprAddToken type=%s/line=%d/'%.*s'\n", tt_name(parser.tt), parser.tline, (int)(parser.tend - parser.tstart + 1), parser.tstart);
}
/* Now create the expression bytecode from the tokenlist */
@@ -7878,7 +7816,6 @@ int Jim_EvalExpression(Jim_Interp *interp, Jim_Obj *exprObjPtr,
}
*exprResultPtrPtr = cmpRes ? interp->trueObj : interp->falseObj;
Jim_IncrRefCount(*exprResultPtrPtr);
- //printf("optimised: %s\n", Jim_GetString(exprObjPtr, NULL));
return JIM_OK;
}
}
@@ -7887,8 +7824,6 @@ int Jim_EvalExpression(Jim_Interp *interp, Jim_Obj *exprObjPtr,
}
break;
}
-
- //printf("no optimisation for: %s\n", Jim_GetString(exprObjPtr, NULL));
}
#endif
@@ -7995,26 +7930,19 @@ int Jim_GetBoolFromExpr(Jim_Interp *interp, Jim_Obj *exprObjPtr, int *boolPtr)
if (retcode != JIM_OK)
return retcode;
- if (exprResultPtr == interp->trueObj) {
- *boolPtr = 1;
- }
- else if (exprResultPtr == interp->falseObj) {
- *boolPtr = 0;
- }
- else {
- if (JimGetWideNoErr(interp, exprResultPtr, &wideValue) != JIM_OK) {
- if (Jim_GetDouble(interp, exprResultPtr, &doubleValue) != JIM_OK)
- {
- Jim_DecrRefCount(interp, exprResultPtr);
- return JIM_ERR;
- } else {
- Jim_DecrRefCount(interp, exprResultPtr);
- *boolPtr = doubleValue != 0;
- return JIM_OK;
- }
+ if (JimGetWideNoErr(interp, exprResultPtr, &wideValue) != JIM_OK) {
+ if (Jim_GetDouble(interp, exprResultPtr, &doubleValue) != JIM_OK)
+ {
+ Jim_DecrRefCount(interp, exprResultPtr);
+ return JIM_ERR;
+ } else {
+ Jim_DecrRefCount(interp, exprResultPtr);
+ *boolPtr = doubleValue != 0;
+ return JIM_OK;
}
- *boolPtr = wideValue != 0;
}
+ *boolPtr = wideValue != 0;
+
Jim_DecrRefCount(interp, exprResultPtr);
return JIM_OK;
}
@@ -9140,20 +9068,16 @@ int JimCallProcedure(Jim_Interp *interp, Jim_Cmd *cmd, int argc,
/* Check arity */
if (argc - 1 < cmd->leftArity + cmd->rightArity ||
(!cmd->args && argc - 1 > cmd->leftArity + cmd->rightArity + cmd->optionalArgs)) {
- const char *argList = Jim_GetString(cmd->argListObjPtr, NULL);
- Jim_Obj *objPtr = Jim_NewEmptyStringObj(interp);
- Jim_AppendStrings(interp, objPtr,
- "wrong # args: should be \"", Jim_GetString(procname, NULL),
- (*argList) ? " " : "", argList, "\"", NULL);
- Jim_SetResult(interp, objPtr);
- goto err;
+ Jim_SetResultFormatted(interp, "wrong # args: should be \"%#s%s%#s\"", procname,
+ Jim_ListLength(interp, cmd->argListObjPtr) ? " " : "", cmd->argListObjPtr);
+ return JIM_ERR;
}
/* Check if there are too nested calls */
if (interp->numLevels == interp->maxNestingDepth) {
Jim_SetResultString(interp,
"Too many nested calls. Infinite recursion?", -1);
- goto err;
+ return JIM_ERR;
}
/* Create a new callframe */
@@ -9261,7 +9185,6 @@ int JimCallProcedure(Jim_Interp *interp, Jim_Cmd *cmd, int argc,
interp->returnCode = JIM_OK;
}
if (retcode == JIM_ERR) {
-err:
retcode = JIM_ERR_ADDSTACK;
Jim_DecrRefCount(interp, interp->errorProc);
interp->errorProc = procname;
@@ -9354,12 +9277,10 @@ int Jim_EvalFile(Jim_Interp *interp, const char *filename)
Jim_Obj *prevScriptObj;
struct stat sb;
int retcode;
+ int readlen;
if (stat(filename, &sb) != 0 || (fp = fopen(filename, "r")) == NULL) {
- Jim_SetResultString(interp, "", 0);
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "Error loading script \"", filename, "\"",
- " err: ", strerror(errno), NULL);
+ Jim_SetResultFormatted(interp, "couldn't read file \"%s\": %s", filename, strerror(errno));
return JIM_ERR_ADDSTACK;
}
if (sb.st_size == 0) {
@@ -9368,7 +9289,9 @@ int Jim_EvalFile(Jim_Interp *interp, const char *filename)
}
buf = Jim_Alloc(sb.st_size + 1);
- if (buf == 0 || fread(buf, sb.st_size, 1, fp) != 1) {
+ readlen = fread(buf, sb.st_size, 1, fp);
+ fclose(fp);
+ if (readlen != 1) {
Jim_Free(buf);
return JIM_ERR_ADDSTACK;
}
@@ -9703,6 +9626,7 @@ static Jim_Obj *JimCommandsList(Jim_Interp *interp, Jim_Obj *patternObjPtr, int
return listObjPtr;
}
+/* Keep this in order */
#define JIM_VARLIST_GLOBALS 0
#define JIM_VARLIST_LOCALS 1
#define JIM_VARLIST_VARS 2
@@ -9753,10 +9677,7 @@ static int JimInfoLevel(Jim_Interp *interp, Jim_Obj *levelObjPtr,
return JIM_ERR;
/* No proc call at toplevel callframe */
if (targetCallFrame == interp->topFramePtr) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "bad level \"",
- Jim_GetString(levelObjPtr, NULL), "\"", NULL);
+ Jim_SetResultFormatted(interp, "bad level \"%#s\"", levelObjPtr);
return JIM_ERR;
}
*objPtrPtr = Jim_NewListObj(interp,
@@ -9814,7 +9735,7 @@ static int Jim_AddMulHelper(Jim_Interp *interp, int argc,
else
res *= wideValue;
}
- Jim_SetResult(interp, Jim_NewIntObj(interp, res));
+ Jim_SetResultInt(interp, res);
return JIM_OK;
trydouble:
doubleRes = (double) res;
@@ -9861,7 +9782,7 @@ static int Jim_SubDivHelper(Jim_Interp *interp, int argc,
}
if (op == JIM_EXPROP_SUB) {
res = -wideValue;
- Jim_SetResult(interp, Jim_NewIntObj(interp, res));
+ Jim_SetResultInt(interp, res);
} else {
doubleRes = 1.0/wideValue;
Jim_SetResult(interp, Jim_NewDoubleObj(interp,
@@ -9888,7 +9809,7 @@ static int Jim_SubDivHelper(Jim_Interp *interp, int argc,
else
res /= wideValue;
}
- Jim_SetResult(interp, Jim_NewIntObj(interp, res));
+ Jim_SetResultInt(interp, res);
return JIM_OK;
trydouble:
for (;i < argc; i++) {
@@ -10314,8 +10235,6 @@ static int JimForeachMapHelper(Jim_Interp *interp, int argc,
++varIdx; /* Next variable */
continue;
}
- Jim_SetResultString(interp, "couldn't set loop variable: ", -1);
- Jim_AppendStrings(interp, Jim_GetResult(interp), Jim_GetString(varName, NULL), NULL);
goto err;
}
}
@@ -10436,16 +10355,22 @@ int Jim_CommandMatchObj(Jim_Interp *interp, Jim_Obj *commandObj, Jim_Obj *patter
return eq;
}
-enum {SWITCH_EXACT, SWITCH_GLOB, SWITCH_RE, SWITCH_CMD, SWITCH_UNKNOWN};
+enum {SWITCH_EXACT, SWITCH_GLOB, SWITCH_RE, SWITCH_CMD };
/* [switch] */
static int Jim_SwitchCoreCommand(Jim_Interp *interp, int argc,
Jim_Obj *const *argv)
{
- int retcode = JIM_ERR, matchOpt = SWITCH_EXACT, opt=1, patCount, i;
+ int matchOpt = SWITCH_EXACT, opt=1, patCount, i;
Jim_Obj *command = 0, *const *caseList = 0, *strObj;
Jim_Obj *script = 0;
- if (argc < 3) goto wrongnumargs;
+ if (argc < 3) {
+wrongnumargs:
+ Jim_WrongNumArgs(interp, 1, argv, "?options? string "
+ "pattern body ... ?default body? or "
+ "{pattern body ?pattern body ...?}");
+ return JIM_ERR;
+ }
for (opt=1; opt < argc; ++opt) {
const char *option = Jim_GetString(argv[opt], 0);
if (*option != '-') break;
@@ -10457,11 +10382,8 @@ static int Jim_SwitchCoreCommand(Jim_Interp *interp, int argc,
if ((argc - opt) < 2) goto wrongnumargs;
command = argv[++opt];
} else {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "bad option \"", option, "\": must be -exact, -glob, "
- "-regexp, -command procname or --", 0);
- goto err;
+ Jim_SetResultFormatted(interp, "bad option \"%#s\": must be -exact, -glob, -regexp, -command procname or --", argv[opt]);
+ return JIM_ERR;
}
if ((argc - opt) < 2) goto wrongnumargs;
}
@@ -10503,18 +10425,12 @@ static int Jim_SwitchCoreCommand(Jim_Interp *interp, int argc,
}
/* command is here already decref'd */
if (rc < 0) {
- retcode = -rc;
- goto err;
+ return -rc;
}
if (rc)
script = caseList[i+1];
break;
}
- default:
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "internal error: no such option implemented", 0);
- goto err;
}
} else {
script = caseList[i+1];
@@ -10524,23 +10440,14 @@ static int Jim_SwitchCoreCommand(Jim_Interp *interp, int argc,
i += 2)
script = caseList[i+1];
if (script && Jim_CompareStringImmediate(interp, script, "-")) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "no body specified for pattern \"",
- Jim_GetString(caseList[i-2], 0), "\"", 0);
- goto err;
+ Jim_SetResultFormatted(interp, "no body specified for pattern \"%#s\"", caseList[i-2]);
+ return JIM_ERR;
}
- retcode = JIM_OK;
Jim_SetEmptyResult(interp);
- if (script != 0)
- retcode = Jim_EvalObj(interp, script);
- return retcode;
-wrongnumargs:
- Jim_WrongNumArgs(interp, 1, argv, "?options? string "
- "pattern body ... ?default body? or "
- "{pattern body ?pattern body ...?}");
-err:
- return retcode;
+ if (script) {
+ return Jim_EvalObj(interp, script);
+ }
+ return JIM_OK;
}
/* [list] */
@@ -10728,7 +10635,7 @@ wrongargs:
else {
/* No match */
if (opt_bool) {
- Jim_SetResultInt(interp, opt_not);
+ Jim_SetResultBool(interp, opt_not);
}
else if (!opt_inline) {
Jim_SetResultInt(interp, -1);
@@ -11013,7 +10920,7 @@ static int Jim_DebugCoreCommand(Jim_Interp *interp, int argc,
Jim_WrongNumArgs(interp, 2, argv, "object");
return JIM_ERR;
}
- Jim_SetResult(interp, Jim_NewIntObj(interp, argv[2]->refCount));
+ Jim_SetResultInt(interp, argv[2]->refCount);
return JIM_OK;
} else if (option == OPT_OBJCOUNT) {
int freeobj = 0, liveobj = 0;
@@ -11082,7 +10989,7 @@ static int Jim_DebugCoreCommand(Jim_Interp *interp, int argc,
return JIM_ERR;
}
script = Jim_GetScript(interp, argv[2]);
- Jim_SetResult(interp, Jim_NewIntObj(interp, script->len));
+ Jim_SetResultInt(interp, script->len);
return JIM_OK;
} else if (option == OPT_EXPRLEN) {
ExprByteCode *expr;
@@ -11093,7 +11000,7 @@ static int Jim_DebugCoreCommand(Jim_Interp *interp, int argc,
expr = Jim_GetExpression(interp, argv[2]);
if (expr == NULL)
return JIM_ERR;
- Jim_SetResult(interp, Jim_NewIntObj(interp, expr->len));
+ Jim_SetResultInt(interp, expr->len);
return JIM_OK;
} else if (option == OPT_EXPRBC) {
Jim_Obj *objPtr;
@@ -11572,7 +11479,7 @@ static int Jim_StringCoreCommand(Jim_Interp *interp, int argc,
Jim_SetResultInt(interp, Jim_StringCompareObj(argv[2], argv[3], !opt_case));
}
else {
- Jim_SetResultInt(interp, Jim_StringEqObj(argv[2], argv[3], !opt_case));
+ Jim_SetResultBool(interp, Jim_StringEqObj(argv[2], argv[3], !opt_case));
}
return JIM_OK;
@@ -11586,7 +11493,7 @@ static int Jim_StringCoreCommand(Jim_Interp *interp, int argc,
if (opt_case == 0) {
argv++;
}
- Jim_SetResultInt(interp, Jim_StringMatchObj(argv[2], argv[3], !opt_case));
+ Jim_SetResultBool(interp, Jim_StringMatchObj(argv[2], argv[3], !opt_case));
return JIM_OK;
case OPT_MAP: {
@@ -11893,7 +11800,7 @@ wrongargs:
!= JIM_OK)
return JIM_ERR;
}
- Jim_SetResult(interp, Jim_NewIntObj(interp, exitCode));
+ Jim_SetResultInt(interp, exitCode);
return JIM_OK;
}
@@ -11958,7 +11865,7 @@ static int Jim_CollectCoreCommand(Jim_Interp *interp, int argc,
Jim_WrongNumArgs(interp, 1, argv, "");
return JIM_ERR;
}
- Jim_SetResult(interp, Jim_NewIntObj(interp, Jim_Collect(interp)));
+ Jim_SetResultInt(interp, Jim_Collect(interp));
return JIM_OK;
}
@@ -12001,10 +11908,7 @@ static int Jim_RenameCoreCommand(Jim_Interp *interp, int argc,
oldName = Jim_GetString(argv[1], NULL);
newName = Jim_GetString(argv[2], NULL);
if (Jim_RenameCommand(interp, oldName, newName) != JIM_OK) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "can't rename \"", oldName, "\": ",
- "command doesn't exist", NULL);
+ Jim_SetResultFormatted(interp, "can't rename \"%#s\": command doesn't exist", argv[1]);
return JIM_ERR;
}
return JIM_OK;
@@ -12014,6 +11918,7 @@ static int Jim_RenameCoreCommand(Jim_Interp *interp, int argc,
static int Jim_DictCoreCommand(Jim_Interp *interp, int argc,
Jim_Obj *const *argv)
{
+ Jim_Obj *objPtr;
int option;
const char *options[] = {
"create", "get", "set", "unset", "exists", NULL
@@ -12027,61 +11932,48 @@ static int Jim_DictCoreCommand(Jim_Interp *interp, int argc,
return JIM_ERR;
}
- if (Jim_GetEnum(interp, argv[1], options, &option, "subcommand",
- JIM_ERRMSG) != JIM_OK)
+ if (Jim_GetEnum(interp, argv[1], options, &option, "subcommand", JIM_ERRMSG) != JIM_OK) {
return JIM_ERR;
+ }
- if (option == OPT_CREATE) {
- Jim_Obj *objPtr;
+ switch (option) {
+ case OPT_GET:
+ if (Jim_DictKeysVector(interp, argv[2], argv+3, argc-3, &objPtr, JIM_ERRMSG) != JIM_OK) {
+ return JIM_ERR;
+ }
+ Jim_SetResult(interp, objPtr);
+ return JIM_OK;
- if (argc % 2) {
- Jim_WrongNumArgs(interp, 2, argv, "?key value ...?");
- return JIM_ERR;
- }
- objPtr = Jim_NewDictObj(interp, argv+2, argc-2);
- Jim_SetResult(interp, objPtr);
- return JIM_OK;
- } else if (option == OPT_GET) {
- Jim_Obj *objPtr;
+ case OPT_SET:
+ if (argc < 5) {
+ Jim_WrongNumArgs(interp, 2, argv, "varName key ?key ...? value");
+ return JIM_ERR;
+ }
+ return Jim_SetDictKeysVector(interp, argv[2], argv+3, argc-4, argv[argc-1]);
- if (Jim_DictKeysVector(interp, argv[2], argv+3, argc-3, &objPtr,
- JIM_ERRMSG) != JIM_OK)
- return JIM_ERR;
- Jim_SetResult(interp, objPtr);
- return JIM_OK;
- } else if (option == OPT_SET) {
- if (argc < 5) {
- Jim_WrongNumArgs(interp, 2, argv, "varName key ?key ...? value");
- return JIM_ERR;
- }
- return Jim_SetDictKeysVector(interp, argv[2], argv+3, argc-4,
- argv[argc-1]);
- } else if (option == OPT_UNSET) {
- if (argc < 4) {
- Jim_WrongNumArgs(interp, 2, argv, "varName key ?key ...?");
- return JIM_ERR;
- }
- return Jim_SetDictKeysVector(interp, argv[2], argv+3, argc-3,
- NULL);
- } else if (option == OPT_EXIST) {
- Jim_Obj *objPtr;
- int exists;
+ case OPT_EXIST:
+ Jim_SetResultBool(interp, Jim_DictKeysVector(interp, argv[2], argv+3, argc-3, &objPtr, JIM_ERRMSG) == JIM_OK);
+ return JIM_OK;
- if (Jim_DictKeysVector(interp, argv[2], argv+3, argc-3, &objPtr,
- JIM_ERRMSG) == JIM_OK)
- exists = 1;
- else
- exists = 0;
- Jim_SetResult(interp, Jim_NewIntObj(interp, exists));
- return JIM_OK;
- } else {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "bad option \"", Jim_GetString(argv[1], NULL), "\":",
- " must be create, get, set", NULL);
- return JIM_ERR;
+ case OPT_UNSET:
+ if (argc < 4) {
+ Jim_WrongNumArgs(interp, 2, argv, "varName key ?key ...?");
+ return JIM_ERR;
+ }
+ return Jim_SetDictKeysVector(interp, argv[2], argv+3, argc-3, NULL);
+
+ case OPT_CREATE:
+ if (argc % 2) {
+ Jim_WrongNumArgs(interp, 2, argv, "?key value ...?");
+ return JIM_ERR;
+ }
+ objPtr = Jim_NewDictObj(interp, argv+2, argc-2);
+ Jim_SetResult(interp, objPtr);
+ return JIM_OK;
+
+ default:
+ abort();
}
- return JIM_OK;
}
/* [subst] */
@@ -12123,7 +12015,10 @@ static int Jim_SubstCoreCommand(Jim_Interp *interp, int argc,
static int Jim_InfoCoreCommand(Jim_Interp *interp, int argc,
Jim_Obj *const *argv)
{
- int cmd, result = JIM_OK;
+ int cmd;
+ Jim_Obj *objPtr;
+ int mode = 0;
+
static const char *commands[] = {
"body", "commands", "procs", "exists", "globals", "level", "locals",
"vars", "version", "patchlevel", "complete", "args", "hostname",
@@ -12142,143 +12037,161 @@ static int Jim_InfoCoreCommand(Jim_Interp *interp, int argc,
!= JIM_OK) {
return JIM_ERR;
}
-
- if (cmd == INFO_COMMANDS || cmd == INFO_PROCS) {
- if (argc != 2 && argc != 3) {
- Jim_WrongNumArgs(interp, 2, argv, "?pattern?");
- return JIM_ERR;
- }
- Jim_SetResult(interp, JimCommandsList(interp, (argc == 3) ? argv[2] : NULL, (cmd == INFO_PROCS)));
- } else if (cmd == INFO_EXISTS) {
- Jim_Obj *exists;
- if (argc != 3) {
- Jim_WrongNumArgs(interp, 2, argv, "varName");
- return JIM_ERR;
- }
- exists = Jim_GetVariable(interp, argv[2], 0);
- Jim_SetResult(interp, Jim_NewIntObj(interp, exists != 0));
- } else if (cmd == INFO_SCRIPT) {
- ScriptObj *script;
- if (argc != 2) {
- Jim_WrongNumArgs(interp, 2, argv, "");
- return JIM_ERR;
- }
- script = Jim_GetScript(interp, interp->currentScriptObj);
- Jim_SetResultString(interp, script->fileName, -1);
- } else if (cmd == INFO_SOURCE) {
- const char *filename = "";
- int line = 0;
- Jim_Obj *resObjPtr;
- if (argc != 3) {
- Jim_WrongNumArgs(interp, 2, argv, "source");
- return JIM_ERR;
+ /* Test for the the most common commands first, just in case it makes a difference */
+ switch (cmd) {
+ case INFO_EXISTS: {
+ if (argc != 3) {
+ Jim_WrongNumArgs(interp, 2, argv, "varName");
+ return JIM_ERR;
+ }
+ Jim_SetResultBool(interp, Jim_GetVariable(interp, argv[2], 0) != NULL);
+ break;
}
- if (argv[2]->typePtr == &sourceObjType) {
- filename = argv[2]->internalRep.sourceValue.fileName;
- line = argv[2]->internalRep.sourceValue.lineNumber;
- }
- else if (argv[2]->typePtr == &scriptObjType) {
- ScriptObj *script = Jim_GetScript(interp, argv[2]);
- filename = script->fileName;
- if (script->token) {
- line = script->token->linenr;
- }
- }
- resObjPtr = Jim_NewListObj(interp, NULL, 0);
- Jim_ListAppendElement(interp, resObjPtr, Jim_NewStringObj(interp, filename, -1));
- Jim_ListAppendElement(interp, resObjPtr, Jim_NewIntObj(interp, line));
- Jim_SetResult(interp, resObjPtr);
- } else if (cmd == INFO_STACKTRACE) {
- Jim_SetResult(interp, interp->stackTrace);
- } else if (cmd == INFO_GLOBALS || cmd == INFO_LOCALS || cmd == INFO_VARS) {
- int mode;
- switch (cmd) {
- case INFO_GLOBALS: mode = JIM_VARLIST_GLOBALS; break;
- case INFO_LOCALS: mode = JIM_VARLIST_LOCALS; break;
- case INFO_VARS: mode = JIM_VARLIST_VARS; break;
- default: mode = 0; /* avoid warning */; break;
- }
- if (argc != 2 && argc != 3) {
- Jim_WrongNumArgs(interp, 2, argv, "?pattern?");
- return JIM_ERR;
+
+ case INFO_COMMANDS:
+ case INFO_PROCS:
+ if (argc != 2 && argc != 3) {
+ Jim_WrongNumArgs(interp, 2, argv, "?pattern?");
+ return JIM_ERR;
+ }
+ Jim_SetResult(interp, JimCommandsList(interp, (argc == 3) ? argv[2] : NULL, (cmd == INFO_PROCS)));
+ break;
+
+ case INFO_VARS:
+ mode++; /* JIM_VARLIST_VARS */
+ case INFO_LOCALS:
+ mode++; /* JIM_VARLIST_LOCALS */
+ case INFO_GLOBALS:
+ /* mode 0 => JIM_VARLIST_GLOBALS */
+ if (argc != 2 && argc != 3) {
+ Jim_WrongNumArgs(interp, 2, argv, "?pattern?");
+ return JIM_ERR;
+ }
+ Jim_SetResult(interp,JimVariablesList(interp, argc == 3 ? argv[2] : NULL, mode));
+ break;
+
+ case INFO_SCRIPT:
+ if (argc != 2) {
+ Jim_WrongNumArgs(interp, 2, argv, "");
+ return JIM_ERR;
+ }
+ Jim_SetResultString(interp, Jim_GetScript(interp, interp->currentScriptObj)->fileName, -1);
+ break;
+
+ case INFO_SOURCE: {
+ const char *filename = "";
+ int line = 0;
+ Jim_Obj *resObjPtr;
+
+ if (argc != 3) {
+ Jim_WrongNumArgs(interp, 2, argv, "source");
+ return JIM_ERR;
+ }
+ if (argv[2]->typePtr == &sourceObjType) {
+ filename = argv[2]->internalRep.sourceValue.fileName;
+ line = argv[2]->internalRep.sourceValue.lineNumber;
+ }
+ else if (argv[2]->typePtr == &scriptObjType) {
+ ScriptObj *script = Jim_GetScript(interp, argv[2]);
+ filename = script->fileName;
+ if (script->token) {
+ line = script->token->linenr;
+ }
+ }
+ resObjPtr = Jim_NewListObj(interp, NULL, 0);
+ Jim_ListAppendElement(interp, resObjPtr, Jim_NewStringObj(interp, filename, -1));
+ Jim_ListAppendElement(interp, resObjPtr, Jim_NewIntObj(interp, line));
+ Jim_SetResult(interp, resObjPtr);
+ break;
}
- if (argc == 3)
- Jim_SetResult(interp,JimVariablesList(interp, argv[2], mode));
- else
- Jim_SetResult(interp, JimVariablesList(interp, NULL, mode));
- } else if (cmd == INFO_LEVEL) {
- Jim_Obj *objPtr;
- switch (argc) {
- case 2:
- Jim_SetResult(interp,
- Jim_NewIntObj(interp, interp->numLevels));
- break;
- case 3:
- if (JimInfoLevel(interp, argv[2], &objPtr) != JIM_OK)
+
+ case INFO_STACKTRACE:
+ Jim_SetResult(interp, interp->stackTrace);
+ break;
+
+ case INFO_LEVEL:
+ switch (argc) {
+ case 2:
+ Jim_SetResultInt(interp, interp->numLevels);
+ break;
+
+ case 3:
+ if (JimInfoLevel(interp, argv[2], &objPtr) != JIM_OK) {
+ return JIM_ERR;
+ }
+ Jim_SetResult(interp, objPtr);
+ break;
+
+ default:
+ Jim_WrongNumArgs(interp, 2, argv, "?levelNum?");
return JIM_ERR;
- Jim_SetResult(interp, objPtr);
- break;
- default:
- Jim_WrongNumArgs(interp, 2, argv, "?levelNum?");
+ }
+ break;
+
+ case INFO_BODY:
+ case INFO_ARGS: {
+ Jim_Cmd *cmdPtr;
+
+ if (argc != 3) {
+ Jim_WrongNumArgs(interp, 2, argv, "procname");
return JIM_ERR;
+ }
+ if ((cmdPtr = Jim_GetCommand(interp, argv[2], JIM_ERRMSG)) == NULL) {
+ return JIM_ERR;
+ }
+ if (cmdPtr->cmdProc != NULL) {
+ Jim_SetResultFormatted(interp, "command \"%#s\" is not a procedure", argv[2]);
+ return JIM_ERR;
+ }
+ Jim_SetResult(interp, cmd == INFO_BODY ? cmdPtr->bodyObjPtr : cmdPtr->argListObjPtr);
+ break;
}
- } else if (cmd == INFO_BODY || cmd == INFO_ARGS) {
- Jim_Cmd *cmdPtr;
- if (argc != 3) {
- Jim_WrongNumArgs(interp, 2, argv, "procname");
- return JIM_ERR;
- }
- if ((cmdPtr = Jim_GetCommand(interp, argv[2], JIM_ERRMSG)) == NULL)
- return JIM_ERR;
- if (cmdPtr->cmdProc != NULL) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "command \"", Jim_GetString(argv[2], NULL),
- "\" is not a procedure", NULL);
- return JIM_ERR;
+ case INFO_VERSION:
+ case INFO_PATCHLEVEL: {
+ char buf[(JIM_INTEGER_SPACE * 2) + 1];
+ sprintf(buf, "%d.%d",
+ JIM_VERSION / 100, JIM_VERSION % 100);
+ Jim_SetResultString(interp, buf, -1);
+ break;
}
- if (cmd == INFO_BODY)
- Jim_SetResult(interp, cmdPtr->bodyObjPtr);
- else
- Jim_SetResult(interp, cmdPtr->argListObjPtr);
- } else if (cmd == INFO_VERSION || cmd == INFO_PATCHLEVEL) {
- char buf[(JIM_INTEGER_SPACE * 2) + 1];
- sprintf(buf, "%d.%d",
- JIM_VERSION / 100, JIM_VERSION % 100);
- Jim_SetResultString(interp, buf, -1);
- } else if (cmd == INFO_COMPLETE) {
- const char *s;
- int len;
- if (argc != 3) {
- Jim_WrongNumArgs(interp, 2, argv, "script");
- return JIM_ERR;
- }
- s = Jim_GetString(argv[2], &len);
- Jim_SetResult(interp,
- Jim_NewIntObj(interp, Jim_ScriptIsComplete(s, len, NULL)));
- } else if (cmd == INFO_HOSTNAME) {
- /* Redirect to os.gethostname if it exists */
- return Jim_Eval(interp, "os.gethostname");
- } else if (cmd == INFO_NAMEOFEXECUTABLE) {
- /* Redirect to Tcl proc */
- return Jim_Eval(interp, "info_nameofexecutable");
- }
- else if (cmd == INFO_RETURNCODES) {
- Jim_Obj *listObjPtr = Jim_NewListObj(interp, NULL, 0);
- int i;
+ case INFO_COMPLETE:
+ if (argc != 3) {
+ Jim_WrongNumArgs(interp, 2, argv, "script");
+ return JIM_ERR;
+ }
+ else {
+ int len;
+ const char *s = Jim_GetString(argv[2], &len);
- for (i = 0; jimReturnCodes[i]; i++) {
- Jim_ListAppendElement(interp, listObjPtr, Jim_NewIntObj(interp, i));
- Jim_ListAppendElement(interp, listObjPtr, Jim_NewStringObj(interp, jimReturnCodes[i], -1));
- }
+ Jim_SetResultBool(interp, Jim_ScriptIsComplete(s, len, NULL));
+ }
+ break;
- Jim_SetResult(interp, listObjPtr);
- return JIM_OK;
+ case INFO_HOSTNAME:
+ /* Redirect to os.gethostname if it exists */
+ return Jim_Eval(interp, "os.gethostname");
+
+ case INFO_NAMEOFEXECUTABLE:
+ /* Redirect to Tcl proc */
+ return Jim_Eval(interp, "info_nameofexecutable");
+
+ case INFO_RETURNCODES: {
+ int i;
+ Jim_Obj *listObjPtr = Jim_NewListObj(interp, NULL, 0);
+
+ for (i = 0; jimReturnCodes[i]; i++) {
+ Jim_ListAppendElement(interp, listObjPtr, Jim_NewIntObj(interp, i));
+ Jim_ListAppendElement(interp, listObjPtr, Jim_NewStringObj(interp, jimReturnCodes[i], -1));
+ }
+
+ Jim_SetResult(interp, listObjPtr);
+ break;
+ }
}
- return result;
+ return JIM_OK;
}
/* [split] */
@@ -12563,10 +12476,7 @@ static int Jim_EnvCoreCommand(Jim_Interp *interp, int argc,
val = getenv(key);
if (val == NULL) {
if (argc < 3) {
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- "environment variable \"",
- key, "\" does not exist", NULL);
+ Jim_SetResultFormatted(interp, "environment variable \"%#s\" does not exist", argv[1]);
return JIM_ERR;
}
val = Jim_GetString(argv[2], NULL);
@@ -12695,7 +12605,7 @@ static int Jim_RandCoreCommand(Jim_Interp *interp, int argc,
JimRandomBytes(interp, &r, sizeof(jim_wide));
if (r < 0 || r >= maxMul) continue;
r = (len == 0) ? 0 : r%len;
- Jim_SetResult(interp, Jim_NewIntObj(interp, min+r));
+ Jim_SetResultInt(interp, min+r);
return JIM_OK;
}
}
@@ -12854,22 +12764,22 @@ static void JimSetFailedEnumResult(Jim_Interp *interp, const char *arg, const ch
for (count = 0; tablePtr[count]; count++) {
}
- if (name == NULL)
+ if (name == NULL) {
name = "option";
- Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- badtype, name, " \"", arg, "\": must be ",
- NULL);
+ }
+
+ Jim_SetResultFormatted(interp, "%s%s \"%s\": must be ", badtype, name, arg);
tablePtrSorted = Jim_Alloc(sizeof(char*)*count);
memcpy(tablePtrSorted, tablePtr, sizeof(char*)*count);
qsort(tablePtrSorted, count, sizeof(char*), qsortCompareStringPointers);
for (i = 0; i < count; i++) {
- if (i+1 == count && count > 1)
+ if (i+1 == count && count > 1) {
Jim_AppendString(interp, Jim_GetResult(interp), "or ", -1);
- Jim_AppendStrings(interp, Jim_GetResult(interp),
- prefix, tablePtrSorted[i], NULL);
- if (i+1 != count)
+ }
+ Jim_AppendStrings(interp, Jim_GetResult(interp), prefix, tablePtrSorted[i], NULL);
+ if (i+1 != count) {
Jim_AppendString(interp, Jim_GetResult(interp), ", ", -1);
+ }
}
Jim_Free(tablePtrSorted);
}
@@ -12943,6 +12853,60 @@ int Jim_IsList(Jim_Obj *objPtr)
return objPtr->typePtr == &listObjType;
}
+/**
+ * Very simple printf-like formatting, designed for error messages.
+ *
+ * The format may contain up to 5 '%s' or '%#s', corresponding to variable arguments.
+ * The resulting string is created and set as the result.
+ *
+ * Each '%s' should correspond to a regular string parameter.
+ * Each '%#s' should correspond to a (Jim_Obj *) parameter.
+ * Any other printf specifier is not allowed (but %% is allowed for the % character).
+ *
+ * e.g. Jim_SetResultFormatted(interp, "Bad option \"%#s\" in proc \"%#s\"", optionObjPtr, procNamePtr);
+ *
+ * Note: We take advantage of the fact that printf has the same behaviour for both %s and %#s
+ */
+void Jim_SetResultFormatted(Jim_Interp *interp, const char *format, ...)
+{
+ /* Initial space needed */
+ int len = strlen(format);
+ int extra = 0;
+ int n = 0;
+ const char *params[5];
+ char *buf;
+ va_list args;
+ int i;
+
+ va_start(args, format);
+
+ for (i = 0; i < len && n < 5; i++) {
+ int l;
+ if (strncmp(format + i, "%s", 2) == 0) {
+ params[n] = va_arg(args, char*);
+ l = strlen(params[n]);
+ }
+ else if (strncmp(format + i, "%#s", 3) == 0) {
+ Jim_Obj *objPtr = va_arg(args, Jim_Obj*);
+ params[n] = Jim_GetString(objPtr, &l);
+ }
+ else {
+ if (format[i] == '%') {
+ i++;
+ }
+ continue;
+ }
+ n++;
+ extra += l;
+ }
+
+ len += extra;
+ buf = Jim_Alloc(len + 1);
+ len = snprintf(buf, len + 1, format, params[0], params[1], params[2], params[3], params[4]);
+
+ Jim_SetResult(interp, Jim_NewStringObjNoAlloc(interp, buf, len));
+}
+
/*
* Local Variables: ***
* c-basic-offset: 4 ***
diff --git a/jim.h b/jim.h
index 3f5daec..e00032f 100644
--- a/jim.h
+++ b/jim.h
@@ -552,9 +552,9 @@ typedef struct Jim_Interp {
#define Jim_InterpIncrProcEpoch(i) (i)->procEpoch++
#define Jim_SetResultString(i,s,l) Jim_SetResult(i, Jim_NewStringObj(i,s,l))
#define Jim_SetResultInt(i,intval) Jim_SetResult(i, Jim_NewIntObj(i,intval))
+/* Note: Using trueObj and falseObj here makes some things slower...*/
+#define Jim_SetResultBool(i,b) Jim_SetResultInt(i, b)
#define Jim_SetEmptyResult(i) Jim_SetResult(i, (i)->emptyObj)
-#define Jim_SetTrueResult(i) Jim_SetResult(i, (i)->trueObj)
-#define Jim_SetFalseResult(i) Jim_SetResult(i, (i)->falseObj)
#define Jim_GetResult(i) ((i)->result)
#define Jim_CmdPrivData(i) ((i)->cmdPrivData)
@@ -700,6 +700,7 @@ JIM_EXPORT Jim_Interp * Jim_CreateInterp (void);
JIM_EXPORT void Jim_FreeInterp (Jim_Interp *i);
JIM_EXPORT int Jim_GetExitCode (Jim_Interp *interp);
JIM_EXPORT const char *Jim_ReturnCode(int code);
+JIM_EXPORT void Jim_SetResultFormatted(Jim_Interp *interp, const char *format, ...);
/* commands */
JIM_EXPORT void Jim_RegisterCoreCommands (Jim_Interp *interp);
diff --git a/test.tcl b/test.tcl
index b869f47..a8aa60d 100644
--- a/test.tcl
+++ b/test.tcl
@@ -3810,7 +3810,7 @@ test regexp-6.8 {regexp errors} {
catch {unset f1}
set f1 44
list [catch {regexp abc abc f1(f2)} msg] $msg
-} {1 {couldn't set variable "f1(f2)"}}
+} {1 {can't set "f1(f2)": variable isn't array}}
test regexp-6.9 {regexp errors, -start bad int check} {
list [catch {regexp -start bogus {^$} {}} msg] $msg
@@ -3986,7 +3986,7 @@ test regexp-11.7 {regsub errors} {
catch {unset f1}
set f1 44
list [catch {regsub -nocase aaa aaa xxx f1(f2)} msg] $msg
-} {1 {couldn't set variable "f1(f2)"}}
+} {1 {can't set "f1(f2)": variable isn't array}}
test regexp-11.8 {regsub errors, -start bad int check} {
list [catch {regsub -start bogus pattern string rep var} msg] $msg
diff --git a/tests/error.test b/tests/error.test
index a059ba3..3a08a6e 100644
--- a/tests/error.test
+++ b/tests/error.test
@@ -50,4 +50,4 @@ test error-1.2 "Modify stacktrace" {
# Package should be able to invoke exit, which should exit if not caught
test error-2.1 "Exit from package" {
list [catch -exit {package require exitpackage} msg] $msg
-} {6 {Can't load package 'exitpackage'}}
+} {6 {Can't load package exitpackage}}
diff --git a/tests/stacktrace.test b/tests/stacktrace.test
index 7d94ccc..7be8ab9 100644
--- a/tests/stacktrace.test
+++ b/tests/stacktrace.test
@@ -87,21 +87,21 @@ set expected {
err-5.3 {1 {can't read "bogus": no such variable} {{} errors.tcl 18 error_generator errors.tcl 50 error_caller stacktrace.test 17}}
err-5.4 {1 {can't read "bogus": no such variable} {{} errors.tcl 18 error_generator errors.tcl 53 error_caller stacktrace.test 17}}
err-6.1 {1 {from dummyproc
-Can't load package 'dummy'} {{} dummy.tcl 3 dummyproc dummy.tcl 6 {} errors.tcl 21 error_generator errors.tcl 44 error_caller stacktrace.test 17}}
+Can't load package dummy} {{} dummy.tcl 3 dummyproc dummy.tcl 6 {} errors.tcl 21 error_generator errors.tcl 44 error_caller stacktrace.test 17}}
err-6.2 {1 {from dummyproc
-Can't load package 'dummy'} {{} dummy.tcl 3 dummyproc dummy.tcl 6 {} errors.tcl 21 error_generator errors.tcl 47 error_caller stacktrace.test 17}}
+Can't load package dummy} {{} dummy.tcl 3 dummyproc dummy.tcl 6 {} errors.tcl 21 error_generator errors.tcl 47 error_caller stacktrace.test 17}}
err-6.3 {1 {from dummyproc
-Can't load package 'dummy'} {{} dummy.tcl 3 dummyproc dummy.tcl 6 {} errors.tcl 21 error_generator errors.tcl 50 error_caller stacktrace.test 17}}
+Can't load package dummy} {{} dummy.tcl 3 dummyproc dummy.tcl 6 {} errors.tcl 21 error_generator errors.tcl 50 error_caller stacktrace.test 17}}
err-6.4 {1 {from dummyproc
-Can't load package 'dummy'} {{} dummy.tcl 3 dummyproc dummy.tcl 6 {} errors.tcl 21 error_generator errors.tcl 53 error_caller stacktrace.test 17}}
+Can't load package dummy} {{} dummy.tcl 3 dummyproc dummy.tcl 6 {} errors.tcl 21 error_generator errors.tcl 53 error_caller stacktrace.test 17}}
err-7.1 {1 {from dummyproc} {{} dummy.tcl 3 dummyproc dummy.tcl 6 {} errors.tcl 24 error_generator errors.tcl 44 error_caller stacktrace.test 17}}
err-7.2 {1 {from dummyproc} {{} dummy.tcl 3 dummyproc dummy.tcl 6 {} errors.tcl 24 error_generator errors.tcl 47 error_caller stacktrace.test 17}}
err-7.3 {1 {from dummyproc} {{} dummy.tcl 3 dummyproc dummy.tcl 6 {} errors.tcl 24 error_generator errors.tcl 50 error_caller stacktrace.test 17}}
err-7.4 {1 {from dummyproc} {{} dummy.tcl 3 dummyproc dummy.tcl 6 {} errors.tcl 24 error_generator errors.tcl 53 error_caller stacktrace.test 17}}
- err-8.1 {1 {Can't load package 'bogus'} {{} errors.tcl 27 error_generator errors.tcl 44 error_caller stacktrace.test 17}}
- err-8.2 {1 {Can't load package 'bogus'} {{} errors.tcl 27 error_generator errors.tcl 47 error_caller stacktrace.test 17}}
- err-8.3 {1 {Can't load package 'bogus'} {{} errors.tcl 27 error_generator errors.tcl 50 error_caller stacktrace.test 17}}
- err-8.4 {1 {Can't load package 'bogus'} {{} errors.tcl 27 error_generator errors.tcl 53 error_caller stacktrace.test 17}}
+ err-8.1 {1 {Can't load package bogus} {{} errors.tcl 27 error_generator errors.tcl 44 error_caller stacktrace.test 17}}
+ err-8.2 {1 {Can't load package bogus} {{} errors.tcl 27 error_generator errors.tcl 47 error_caller stacktrace.test 17}}
+ err-8.3 {1 {Can't load package bogus} {{} errors.tcl 27 error_generator errors.tcl 50 error_caller stacktrace.test 17}}
+ err-8.4 {1 {Can't load package bogus} {{} errors.tcl 27 error_generator errors.tcl 53 error_caller stacktrace.test 17}}
}
main