aboutsummaryrefslogtreecommitdiff
path: root/jim.c
diff options
context:
space:
mode:
authorantirez <antirez>2005-03-28 16:57:36 +0000
committerantirez <antirez>2005-03-28 16:57:36 +0000
commitfdf5499a95b2aad40243e1d5a16334096115b0f2 (patch)
tree1191737642037894a9a9e34872e004f18ca72bc7 /jim.c
parent3552074b2c1972f72e91cf7fbdc8d63545088142 (diff)
downloadjimtcl-fdf5499a95b2aad40243e1d5a16334096115b0f2.zip
jimtcl-fdf5499a95b2aad40243e1d5a16334096115b0f2.tar.gz
jimtcl-fdf5499a95b2aad40243e1d5a16334096115b0f2.tar.bz2
[scope] command + tests
Diffstat (limited to 'jim.c')
-rw-r--r--jim.c46
1 files changed, 43 insertions, 3 deletions
diff --git a/jim.c b/jim.c
index 3211c15..4ea60f3 100644
--- a/jim.c
+++ b/jim.c
@@ -2,7 +2,7 @@
* Copyright 2005 Salvatore Sanfilippo <antirez@invece.org>
* Copyright 2005 Clemens Hintze <c.hintze@gmx.net>
*
- * $Id: jim.c,v 1.130 2005/03/26 14:12:32 antirez Exp $
+ * $Id: jim.c,v 1.131 2005/03/28 16:57:36 antirez Exp $
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -10753,7 +10753,46 @@ static int Jim_RangeCoreCommand(Jim_Interp *interp, int argc,
return JIM_OK;
}
-/* [lrange] */
+/* [scope] */
+static int Jim_ScopeCoreCommand(Jim_Interp *interp, int argc,
+ Jim_Obj *const *argv)
+{
+ Jim_Obj **savedVect, *resultObjPtr, *varNameObjPtr;
+ int len, i, retCode;
+
+ if (argc != 3) {
+ Jim_WrongNumArgs(interp, 1, argv, "varList body");
+ return JIM_ERR;
+ }
+ /* Save the value of every var in varList into the 'savedVect' vector. */
+ Jim_ListLength(interp, argv[1], &len);
+ savedVect = Jim_Alloc(len*sizeof(Jim_Obj*));
+ for (i = 0; i < len; i++) {
+ Jim_ListIndex(interp, argv[1], i, &varNameObjPtr, JIM_NONE);
+ savedVect[i] = Jim_GetVariable(interp, varNameObjPtr, JIM_NONE);
+ if (savedVect[i] != NULL)
+ Jim_IncrRefCount(savedVect[i]);
+ }
+ /* Eval the body */
+ retCode = Jim_EvalObj(interp, argv[2]);
+ resultObjPtr = Jim_GetResult(interp);
+ Jim_IncrRefCount(resultObjPtr);
+ /* Restore the status of vars. */
+ for (i = 0; i < len; i++) {
+ Jim_ListIndex(interp, argv[1], i, &varNameObjPtr, JIM_NONE);
+ if (savedVect[i] != NULL) {
+ Jim_SetVariable(interp, varNameObjPtr, savedVect[i]);
+ Jim_DecrRefCount(interp, savedVect[i]);
+ } else {
+ Jim_UnsetVariable(interp, varNameObjPtr, JIM_NONE);
+ }
+ }
+ Jim_Free(savedVect);
+ /* Done */
+ Jim_SetResult(interp, resultObjPtr);
+ Jim_DecrRefCount(interp, resultObjPtr);
+ return retCode;
+}
static struct {
const char *name;
@@ -10816,6 +10855,7 @@ static struct {
{"source", Jim_SourceCoreCommand},
{"lreverse", Jim_LreverseCoreCommand},
{"range", Jim_RangeCoreCommand},
+ {"scope", Jim_ScopeCoreCommand},
{NULL, NULL},
};
@@ -10884,7 +10924,7 @@ int Jim_InteractivePrompt(Jim_Interp *interp)
printf("Welcome to Jim version %d.%d, "
"Copyright (c) 2005 Salvatore Sanfilippo\n",
JIM_VERSION / 100, JIM_VERSION % 100);
- printf("CVS ID: $Id: jim.c,v 1.130 2005/03/26 14:12:32 antirez Exp $\n");
+ printf("CVS ID: $Id: jim.c,v 1.131 2005/03/28 16:57:36 antirez Exp $\n");
Jim_SetVariableStrWithStr(interp, "jim_interactive", "1");
while (1) {
char buf[1024];